models

Google: Nano Banana 2 (Gemini 3.1 Flash Image)

Markdown · JSON

Google: Nano Banana 2 (Gemini 3.1 Flash Image)

Nano Banana 2 (Gemini 3.1 Flash Image) генерирует и редактирует изображения в диалоге. Модель поддерживает текстовые и визуальные источники, вывод 0.5K–4K, композицию по референсам и привязку к поиску для товарных сцен, инфографики и последовательной визуальной работы.

О модели

Описание раскрывает возможности модели. Доступные в Ailoot входные данные, результаты и параметры выбранного метода перечислены ниже.

Nano Banana 2 — модель Google Gemini 3.1 Flash Image со встроенной генерацией изображений и редактирования в диалоге. Её разработка делает акцент на эффективном создании визуальных материалов и повторных правках. Документированный профиль API принимает текст, изображения, видео и PDF и возвращает изображения и текст. Это отдельная именованная версия относительно Gemini Nano Banana 2.1, а не обозначение каждого позднего обновления Nano Banana.

Размеры вывода включают 0.5K, 1K, 2K и 4K, по умолчанию 1K. Меньший вариант 0.5K относится именно к этому профилю и может подходить для начальной композиции; более крупные категории дают больше пикселей для выбранной формы вывода. Документированные пропорции охватывают квадратные, вертикальные и горизонтальные форматы, включая 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9 и 21:9, с дополнительными 1:4, 4:1, 1:8 и 8:1. Например, квадратный вывод меняется от 512 × 512 при 0.5K до 4096 × 4096 при 4K. Выбирайте форму для нужного размещения перед уточнением мелких деталей.

Среди обновлений версии Google отмечает улучшенное соблюдение соотношений сторон, визуальное постоянство и многоязычную отрисовку текста. Используйте точные формулировки для плаката, меню или инфографики и определяйте принадлежность каждой подписи объекту. Для мелкого текста и длинных фрагментов карточка модели сообщает о сохраняющихся ограничениях читаемости, особенно при 1K. Делайте подписи краткими и явно задавайте их относительный размер; для плотного основного текста рассматривайте изображение как референс визуальной компоновки и внимательно проверяйте фактические надписи.

В одном процессе можно объединять до 14 референсных изображений. Руководство описывает точность воспроизведения до десяти объектов и сходство до четырёх персонажей. Помечайте референсы и указывайте вклад каждого. Для товарной сцены одно изображение может задавать объект, другое — окружение, третье — свет. Для последовательности с персонажем переносите предыдущие результаты в следующий запрос и указывайте признаки, которые должны сохраняться при изменении ракурса или позы.

Привязка к Web Search и Image Search может дополнять генерацию актуальными сведениями и найденными визуальными референсами. Image Search добавляет визуальный контекст, а не только письменное описание поискового результата. Производитель поддерживает поиск при всех документированных настройках thinking. Его процесс поиска изображений исключает реальные изображения людей как референсы, полученные поиском, и возвращает метаданные атрибуции вместе с результатами с опорой на источники; сохраняйте эти метаданные при использовании результата в приложении.

Документированные настройки thinking Gemini 3.1 Flash Image — minimal и high, по умолчанию minimal. Это отличается от трёхуровневого профиля Nano Banana 2.1 со стандартным medium. Thinking поддерживает более сложную композицию и обработку инструкций. Модель основана на Gemini 3 Flash, но это родство не делает её общей моделью выполнения кода или вызова функций: эти возможности помечены как неподдерживаемые в таблице данной версии для изображений.

Редактирование в диалоге поддерживает изменение предоставленного изображения или уточнение предыдущей генерации. Конкретный бриф: «Сохрани форму бутылки, текст этикетки и ракурс камеры. Замени фон светлой каменной поверхностью и добавь более мягкие тени». Описывайте сохраняемые элементы так же внимательно, как изменяемые. Карточка отмечает, что постоянство персонажей, определение расположения слева и справа и правки по наброскам могут оставаться несовершенными, поэтому сравнивайте именно эти детали перед продолжением визуальной последовательности.

Таблица модели API указывает 131 072 токена входа и 32 768 токенов вывода. Она поддерживает генерацию изображений, привязку к поиску, thinking и пакетную обработку; генерация аудио, кэширование, структурированный вывод, поиск по файлам, Live API и URL context не поддерживаются. Процесс изображений не принимает аудиовход. Видео или PDF могут служить источником задачи неподвижного изображения в этом профиле API; вывод остаётся изображением и текстом. Сгенерированные изображения включают SynthID, а запрошенное количество изображений не всегда соблюдается точно.

Для практической инфографики предоставьте утверждённые подписи, целевую аудиторию, порядок чтения, референсы и целевое соотношение сторон. Запросите одно ясное визуальное объяснение, затем следующим ходом исправьте формулировки или интервалы, сохраняя сложившуюся композицию. Для товарного макета задайте геометрию, поверхность, свет и визуальные детали, определяющие товар. Полезный результат — изображение со связанным текстом, которое можно изучать, выбирать и уточнять в контролируемой последовательности.

Практическая задача

Практическая задача

Технический пример на английском

Create a simple bicycle-care infographic

Create one portrait infographic teaching three bicycle checks before a short ride: tires, brakes and chain. Use three large illustrated steps in that order, a warm ivory background and dark green accents. Include only these headings: 'TIRES', 'BRAKES', 'CHAIN'. Leave generous space around each heading and keep the illustrations clearly separated.

Ожидаемый результат

One portrait image with three ordered illustrated steps and the three exact, readable headings.

Проверка результата

Inspect the rendered image for heading spelling, order and clear separation of the three checks.
Ailoot · Картинки POST /v1/images/generations gemini-3.1-flash-image

gemini-3.1-flash-image

Google /gemini-3.1-flash-image

Начало

Nano Banana 2 (Gemini 3.1 Flash Image) генерирует и редактирует изображения в диалоге. Модель поддерживает текстовые и визуальные источники, вывод 0.5K–4K, композицию по референсам и привязку к поиску для товарных сцен, инфографики и последовательной визуальной работы.

Допустимые входные данные
Текст
Результаты
Картинки · Текст

Доступно в Ailoot · входные данные и методы

Ailoot · Картинки POST /v1/images/generations
Входные данные
text
Результат
image, text
Контекст
131 072 tokens
Максимальный выход
32 768 tokens
Выходной формат
Файл изображения
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
ПолеmodelТипstringТребованиеОбязательноЗначения и ограничения
gemini-3.1-flash-image
По умолчанию—
ПолеpromptТипstringТребованиеОбязательноЗначения и ограничения
Минимальная длина: 1
По умолчанию—
ПолеnТипintegerТребованиеНеобязательноЗначения и ограничения
Минимум: 1
По умолчанию1
Полеresponse_formatТипstringТребованиеНеобязательноЗначения и ограничения
url, b64_json
По умолчанию—
ПолеstreamТипbooleanТребованиеНеобязательноЗначения и ограниченияПо умолчаниюfalse
ПолеsizeТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеqualityТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеbackgroundТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеoutput_formatТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеoutput_compressionТипintegerТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеmoderationТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеinput_fidelityТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеstyleТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеpartial_imagesТипintegerТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Сочетания входных материалов

Из текста в изображение · Обязательно: prompt

Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрmaterial_typesКонтрактtext
ПараметрrequiredКонтрактmodel, prompt
Параметрoptional_controlsКонтрактnull
Параметрcontent_typeКонтрактapplication/json

Жизненный цикл: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · Фактически возвращённый task_id или запись в медиатеке

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

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Структуры методов и ID указаны точно; возможности поставщика рассматриваются отдельно от допуска.

Тарифы

Ставки методов Ailoot

Ailoot КартинкиPOST /v1/images/generations
Текстовый вход
0,0005 $ / 1K
Текстовый выход
0,003 $ / 1K
Выход, картинка
0,06 $ / 1K tokens
Вход
0,0005 $ / 1K токенов изображения
Выход
≈0,0448 $ за изображение 0.5K
Выход
0,0672 $ за изображение 1K
Выход
≈0,101 $ за изображение 2K
Выход
≈0,151 $ за изображение 4K

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Сведения о справочном тарифе

Справочные шкалы модели не меняют выбор метода, расчёт стоимости или списания. Действующая плата определяется ставками выбранного метода Ailoot.

Справочные шкалы модели

Цены по конфигурациям

КонфигурацияШкала ставокПлата
КонфигурацияUltraШкала ставокБазовая ставкаПлата
Вход · Входные токены $0.0010000 / 1K токенов
Выход · Выходные токены $0.006000 / 1K токенов
Выход · вывод изображения $0.12000 / 1K токенов
Выход · поиск в интернете $0.028 за поиск в интернете

Примеры запросов

Ailoot · Картинки

curlPython SDKNode.js SDK
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.1-flash-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.1-flash-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.1-flash-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");

Получить и сохранить результаты

Ailoot · Картинки

Загрузите каждое полученное изображение или сохраните его содержимое Base64

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Сохраняйте все готовые результаты

Сохраните каждое готовое изображение; загрузите содержимое по каждому полученному URL или декодируйте его содержимое Base64.

Сохраняйте каждый элемент данных. Декодируйте каждый b64_json или загружайте ресурс по каждому возвращённому подписанному URL. Выбирайте расширение имени файла по фактическому MIME и байтам.

Если нужно проверить исходный ответ

Если результат генерации или редактирования изображения требует проверки, сохраните исходный operation_id/X-Client-Request-ID и возвращённые сведения о результате. Восстановите существующие собственные результаты через медиатеку, используя фактические значения task_id или asset_id. Не отправляйте запрос генерации или редактирования повторно и не составляйте URL опроса из operation_id.

Поля ответа
ПолеТип
ПолеcreatedТипinteger
Полеdata[].urlТипstring
Полеdata[].b64_jsonТипbase64 string
ПолеusageТипobject
Ошибки и дальнейшие шаги
ОтветУсловиеСледующий шаг
Ответ400 · invalid_request_errorУсловиеНеверные обязательные поля, представление материалов или значение параметраСледующий шагИсправьте указанные поля перед новым запросом на создание.
Ответserver_errorУсловиеВозвращённый ответ указывает, что операция или результат требуют проверкиСледующий шагСохраните исходный возвращённый ID операции или задачи, заголовки запроса и ответ; продолжайте поддерживаемые операции чтения исходной операции. Не отправляйте запрос создания повторно.

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-flash-image
Ailoot Ultra google/gemini-3.1-flash-image

Псевдонимы путей метода

/v1/images

Связанные ID для вызова

google/gemini-3.1-flash-image, gemini-3.1-flash-image

Ailoot Ultra · Чат OpenAI POST /v1/chat/completions google/gemini-3.1-flash-image

google/gemini-3.1-flash-image

Google /google/gemini-3.1-flash-image

Начало

Nano Banana 2 (Gemini 3.1 Flash Image) генерирует и редактирует изображения в диалоге. Модель поддерживает текстовые и визуальные источники, вывод 0.5K–4K, композицию по референсам и привязку к поиску для товарных сцен, инфографики и последовательной визуальной работы.

Допустимые входные данные
Текст
Результаты
Текст

Доступно в Ailoot · входные данные и методы

Ailoot Ultra · Чат OpenAI POST /v1/chat/completions
Входные данные
text
Результат
text
Выходной формат
json или SSE
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
ПолеmodelТипstringТребованиеОбязательноЗначения и ограничения
google/gemini-3.1-flash-image
По умолчанию—
ПолеmessagesТипmessage[]ТребованиеОбязательноЗначения и ограничения
Минимум элементов: 1
По умолчанию—
Полеmessages[].roleТипstringТребованиеОбязательноЗначения и ограничения
Примеры: system, user, assistant, tool, function
Условия: Эти роли явно представлены типами совместимости исходного кода; точный набор ролей зависит от модели.
Зависит от модели
По умолчанию—
Полеmessages[].contentТипstring|content_part[]|nullТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеmessages[].tool_callsТипtool_call[]ТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеmessages[].tool_call_idТипstringТребованиеНеобязательноЗначения и ограничения
Применяется, когда: role=tool; используйте фактически возвращённый ID
По умолчанию—
Полеmessages[].nameТипstringТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеmessages[].reasoning_contentТипstringТребованиеНеобязательноЗначения и ограничения
Применяется, когда: Передавайте обратно фактически возвращённые рассуждения, если эта модель их использует
По умолчанию—
Полеmessages[].reasoning_detailsТипobject|arrayТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеmax_tokensТипintegerТребованиеНеобязательноЗначения и ограничения
Минимум: 1
Зависит от модели
По умолчанию—
Полеmax_completion_tokensТипintegerТребованиеНеобязательноЗначения и ограничения
Минимум: 1
Зависит от модели
По умолчанию—
ПолеstreamТипbooleanТребованиеНеобязательноЗначения и ограниченияПо умолчаниюfalse
Полеstream_options.include_usageТипbooleanТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеtemperatureТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеtop_pТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеstopТипstring|string[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеtoolsТипfunction_tool[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеtools[].typeТипstringТребованиеНеобязательноЗначения и ограничения
function
Зависит от модели
По умолчанию—
Полеtools[].function.nameТипstringТребованиеОбязательноЗначения и ограничения
Применяется, когда: передан инструмент-функция
По умолчанию—
Полеtools[].function.descriptionТипstringТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеtools[].function.parametersТипJSON_schemaТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеtool_choiceТипstring|objectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеparallel_tool_callsТипbooleanТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеresponse_formatТипobjectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеreasoning_effortТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеreasoningТипobjectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеservice_tierТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеinstructionsТипstringТребованиеНеобязательноЗначения и ограничения
Поле совместимости
По умолчанию—
ПолеfunctionsТипfunction[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеfunction_callТипstring|objectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеprompt_cache_optionsТипobjectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеmodalitiesТипstring[]ТребованиеНеобязательноЗначения и ограничения
text
По умолчанию—
ПолеproviderТипobjectТребованиеНеобязательноЗначения и ограничения
Условия: provider.options отклоняется на этом текстовом маршруте Ultra
По умолчанию—
Полеcache_control.ttlТипstringТребованиеНеобязательноЗначения и ограничения
Условия: 1h отклоняется в фактических местах настройки кэша запросов
По умолчанию—
Сочетания входных материалов

Текст · Текст UTF8

messages[].content

Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрcontent_typeКонтрактapplication/json
ПараметрrequiredКонтрактmodel, messages
Параметрmaterial_typesКонтрактtext
ПараметрmessagesКонтрактмассив сообщений со структурой role/content
Параметрfile_materialКонтрактфактический документ UTF-8 вставляется как буквальный текст; ID файла не выводится из него
Параметрoptional_controlsКонтрактstream, temperature, top_p, stop, max_tokens, max_completion_tokens, reasoning, response_format, tools, tool_choice
Параметрcontrol_scopeКонтрактзависит от модели; пользовательские инструменты-функции отличаются от инструментов, выполняемых на стороне сервиса
Параметрoutput_modalitiesКонтрактtext
Параметрhosted_operationsКонтрактfalse
Параметрmultimodal_input_bindingКонтрактnull

Жизненный цикл: synchronous_or_streamed

Отправляйте точный ID модели вместе с messages.

Длина контекста не является пределом выхода.

Текстовый файл может передавать буквальный текст; входные изображения, аудио и файловые объекты требуют точной привязки.

Тарифы

Тарифная справка не добавляет режимы запроса. Поддерживаемые параметры указаны для выбранного метода.

Быстрый режим
Стандартный тариф При выборе быстрого режима
Режим flex
Стандартный тариф При выборе режима flex
Максимальная интенсивность рассуждений
Стандартный тариф При максимальной интенсивности рассуждений с корректировкой по умолчанию (default)
Интенсивность рассуждений · высокая (high)
Стандартный тариф При высокой интенсивности рассуждений (high)
Интенсивность рассуждений · минимальная (minimal)
Стандартный тариф При минимальной интенсивности рассуждений (minimal)
Цены явного кэширования
Не включено Когда запрошено явное кэширование

Ставки Ailoot

Цены по конфигурациям

Сопоставьте каждую плату с указанными условиями. Для каждого набора альтернативных конфигураций используйте одну ставку.

КонфигурацияШкала ставокТокенов контекста большеТокенов контекста не более, включительноПлата
КонфигурацияБазовые ставки за токеныШкала ставокБазовая ставкаТокенов контекста больше—Токенов контекста не более, включительноБез верхней границыПлата
Вход · Входные токены $0.001 / 1K токенов
Выход · Выходные токены $0.006 / 1K токенов
Вход · Чтение кэша — / 1K токенов
Вход · Запись в кэш — / 1K токенов
Вход · Запись в кэш, 1 час — / 1K токенов
Выход · Токены выходного изображения $0.12 / 1K токенов изображения
КонфигурацияУровень 1 по длине запросаШкала ставок—Токенов контекста больше0Токенов контекста не более, включительноБез верхней границыПлата
Вход · Входные токены $0.001 / 1K токенов
Выход · Выходные токены $0.006 / 1K токенов
Вход · Чтение кэша — / 1K токенов
Вход · Запись в кэш — / 1K токенов
Вход · Запись в кэш, 1 час — / 1K токенов

Сведения о справочном тарифе

Справочные шкалы модели не меняют выбор метода, расчёт стоимости или списания. Действующая плата определяется ставками выбранного метода Ailoot.

Google: Nano Banana 2 (Gemini 3.1 Flash Image)

Цены по конфигурациям

КонфигурацияУсловия расчётаПлата
КонфигурацияGoogle: Nano Banana 2 (Gemini 3.1 Flash Image) · Стандартная конфигурацияУсловия расчётаКонфигурация по умолчаниюПлата
Вход · Входные токены 0,001 $ / 1K токенов
Выход · Выходные токены 0,006 $ / 1K токенов
Выход · Выходное изображение 0,12 $ / 1K токенов
Выход · Поиск в интернете 0,028 $ за поиск

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Примеры запросов

Ailoot Ultra · Чат OpenAI

curlPython SDKПоток Python
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.1-flash-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.1-flash-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.1-flash-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")

Получить и сохранить результаты

Ailoot Ultra · Чат OpenAI

json или SSE

Сохраняйте все готовые результаты

Сохраняйте каждый полностью полученный ответ, файл и элемент содержимого.

Сохраняйте каждый вариант ответа с его содержимым, вызовами инструментов и рассуждениями. В SSE собирайте изменения по индексам варианта и инструмента, сохраняйте итоговую причину завершения и данные использования.

Если нужно проверить исходный ответ

Сохраняйте ID запросов и ответов, а также заголовки. Общий URL получения текстового задания не предоставлен.

Поля ответа
ПолеТип
Полеchoices[].indexТипinteger
Полеchoices[].message.contentТипstring|null
Полеchoices[].message.tool_callsТипtool_call[]
Полеchoices[].message.reasoning_contentТипstring
Полеchoices[].message.reasoning_detailsТипobject|array
Полеchoices[].finish_reasonТипstring|null
ПолеusageТипobject
Ошибки и дальнейшие шаги
ОтветУсловиеСледующий шаг
Ответ400 · invalid_request_errorУсловиеНеверные обязательные поля, представление материалов или значение параметраСледующий шагИсправьте указанные поля перед новым запросом на создание.

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-flash-image
Ailoot Ultra google/gemini-3.1-flash-image

Псевдонимы путей метода

/v1/images

Связанные ID для вызова

google/gemini-3.1-flash-image, gemini-3.1-flash-image

Ailoot Ultra · Картинки POST /v1/images/generations google/gemini-3.1-flash-image

google/gemini-3.1-flash-image

Google /google/gemini-3.1-flash-image

Начало

Nano Banana 2 (Gemini 3.1 Flash Image) генерирует и редактирует изображения в диалоге. Модель поддерживает текстовые и визуальные источники, вывод 0.5K–4K, композицию по референсам и привязку к поиску для товарных сцен, инфографики и последовательной визуальной работы.

Допустимые входные данные
Текст · Картинки
Результаты
Картинки

Доступно в Ailoot · входные данные и методы

Ailoot Ultra · Картинки POST /v1/images/generations
Входные данные
text, image
Результат
image
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
ПолеmodelТипstringТребованиеОбязательноЗначения и ограничения
google/gemini-3.1-flash-image
По умолчанию—
ПолеpromptТипstringТребованиеОбязательноЗначения и ограничения
Минимальная длина: 1
По умолчанию—
ПолеresolutionТипstringТребованиеНеобязательноЗначения и ограничения
512, 1K, 2K, 4K
По умолчанию—
Полеaspect_ratioТипstringТребованиеНеобязательноЗначения и ограничения
1:1, 1:4, 1:8, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9
По умолчанию—
ПолеnТипintegerТребованиеНеобязательноЗначения и ограничения
Минимум: 1
Максимум: 1
По умолчанию—
Полеinput_referencesТипarrayТребованиеНеобязательноЗначения и ограничения
Минимум элементов: 0
Максимум элементов: 14
По умолчанию—
ПолеproviderТипobjectТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрcontent_typeКонтрактapplication/json
ПараметрrequiredКонтрактmodel, prompt
Параметрmaterial_typesКонтрактtext, image

Жизненный цикл: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · Фактически возвращённый task_id или запись в медиатеке

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

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Тарифы

Как рассчитывается итоговая плата

Отображаемые тарифы позволяют оценить стоимость до генерации. Итоговое списание рассчитывается по стоимости, записанной для исходной генерации. Измеренная длительность результата и прогнозные объёмы не являются итоговым оплачиваемым объёмом.

Тарифная справка не добавляет режимы запроса. Поддерживаемые параметры указаны для выбранного метода.

Быстрый режим
Не указано При выборе быстрого режима
Режим flex
Не указано При выборе режима flex
Максимальная интенсивность рассуждений
Не указано При максимальной интенсивности рассуждений с корректировкой по умолчанию (default)

Оценочные ставки для сравнения

Цены по конфигурациям

Сопоставьте каждую плату с указанными условиями. Для каждого набора альтернативных конфигураций используйте одну ставку.

КонфигурацияШкала ставокПрогноз количестваПлата
КонфигурацияБазовые тарифы на токеныШкала ставокБазовая ставкаПрогноз количества—Плата
Вход · Входные токены · Оценка только для сравнения — / 1K токенов
Выход · Выходные токены · Оценка только для сравнения — / 1K токенов
Вход · Чтение кэша · Оценка только для сравнения — / 1K токенов
Вход · Запись в кэш · Оценка только для сравнения — / 1K токенов
Вход · Запись в кэш, 1 час · Оценка только для сравнения — / 1K токенов
КонфигурацияОриентировочная стоимость генерацииШкала ставок—Прогноз количестваОценка для одной генерацииПлата
Выход · Оценочная стоимость генерации · Оценка только для сравнения $0.49152 оценка до генерации

Эта оценка не является дополнительным списанием или фиксированным тарифом для завершённой генерации.

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Примеры запросов

Ailoot Ultra · Картинки

curl
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.1-flash-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

Получить и сохранить результаты

Ailoot Ultra · Картинки

Загрузите каждое полученное изображение или сохраните его содержимое Base64

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Чтение другого содержимого
Читать существующие материалы, принадлежащие вам
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.
Сохраняйте все готовые результаты

Сохраните каждое готовое изображение; загрузите содержимое по каждому полученному URL или декодируйте его содержимое Base64.

Сохраняйте полный ответ и заголовки, все фактические результаты, исходные возвращённые идентификаторы и все поля использования. Восстанавливайте исходную операцию без повторной отправки запроса создания.

Если нужно проверить исходный ответ

Сохраните возвращённый X-Client-Request-ID для сверки. Читайте только фактически возвращённые значения task_id/asset_id или собственную медиатеку; никогда не составляйте URL задачи из ID операции и никогда не отправляйте запрос создания повторно.

Поля ответа
ПолеТип
ПолеcreatedТип
Полеdata[].urlТип
Полеdata[].b64_jsonТип
ПолеusageТип

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-flash-image
Ailoot Ultra google/gemini-3.1-flash-image

Псевдонимы путей метода

/v1/images

Связанные ID для вызова

google/gemini-3.1-flash-image, gemini-3.1-flash-image

Ailoot Ultra · Сообщения Anthropic POST /v1/messages google/gemini-3.1-flash-image

google/gemini-3.1-flash-image

Google /google/gemini-3.1-flash-image

Начало

Nano Banana 2 (Gemini 3.1 Flash Image) генерирует и редактирует изображения в диалоге. Модель поддерживает текстовые и визуальные источники, вывод 0.5K–4K, композицию по референсам и привязку к поиску для товарных сцен, инфографики и последовательной визуальной работы.

Допустимые входные данные
Текст
Результаты
json · sse

Доступно в Ailoot · входные данные и методы

Ailoot Ultra · Сообщения Anthropic POST /v1/messages
Входные данные
text
Результат
json, sse
Выходной формат
JSON или SSE
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
ПолеmodelТипstringТребованиеОбязательноЗначения и ограничения
google/gemini-3.1-flash-image
По умолчанию—
ПолеmessagesТипmessage[]ТребованиеОбязательноЗначения и ограниченияПо умолчанию—
Полеmessages[].roleТипstringТребованиеОбязательноЗначения и ограничения
user, assistant
По умолчанию—
Полеmessages[].contentТипstringТребованиеОбязательноЗначения и ограниченияПо умолчанию—
Полеmax_tokensТипintegerТребованиеОбязательноЗначения и ограниченияПо умолчанию—
ПолеstreamТипbooleanТребованиеНеобязательноЗначения и ограниченияПо умолчаниюfalse
Сочетания входных материалов

Текст · Текст UTF-8

строка messages[].content

Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрcontent_typeКонтрактapplication/json
ПараметрrequiredКонтрактmodel, messages, max_tokens
Параметрoptional_controlsКонтрактstream
Параметрmaterial_typesКонтрактtext
Параметрtext_file_materialКонтрактПрочитайте фактический документ UTF-8 и поместите его текст в указанную строку входа или содержимого сообщения.

Жизненный цикл: synchronous_or_streamed

Тарифы

Тарифная справка не добавляет режимы запроса. Поддерживаемые параметры указаны для выбранного метода.

Быстрый режим
Стандартный тариф При выборе быстрого режима
Режим flex
Стандартный тариф При выборе режима flex
Максимальная интенсивность рассуждений
Стандартный тариф При максимальной интенсивности рассуждений с корректировкой по умолчанию (default)
Интенсивность рассуждений · высокая (high)
Стандартный тариф При высокой интенсивности рассуждений (high)
Интенсивность рассуждений · минимальная (minimal)
Стандартный тариф При минимальной интенсивности рассуждений (minimal)
Цены явного кэширования
Не включено Когда запрошено явное кэширование

Ставки Ailoot

Цены по конфигурациям

Сопоставьте каждую плату с указанными условиями. Для каждого набора альтернативных конфигураций используйте одну ставку.

КонфигурацияШкала ставокТокенов контекста большеТокенов контекста не более, включительноПлата
КонфигурацияБазовые ставки за токеныШкала ставокБазовая ставкаТокенов контекста больше—Токенов контекста не более, включительноБез верхней границыПлата
Вход · Входные токены $0.001 / 1K токенов
Выход · Выходные токены $0.006 / 1K токенов
Вход · Чтение кэша — / 1K токенов
Вход · Запись в кэш — / 1K токенов
Вход · Запись в кэш, 1 час — / 1K токенов
Выход · Токены выходного изображения $0.12 / 1K токенов изображения
КонфигурацияУровень 1 по длине запросаШкала ставок—Токенов контекста больше0Токенов контекста не более, включительноБез верхней границыПлата
Вход · Входные токены $0.001 / 1K токенов
Выход · Выходные токены $0.006 / 1K токенов
Вход · Чтение кэша — / 1K токенов
Вход · Запись в кэш — / 1K токенов
Вход · Запись в кэш, 1 час — / 1K токенов

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Примеры запросов

Ailoot Ultra · Сообщения Anthropic

Полное минимальное тело запроса в формате JSONcurl · используйте свой документ UTF-8Python · сохраните полный результат
{
  "model": "google/gemini-3.1-flash-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.1-flash-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.1-flash-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))

Получить и сохранить результаты

Ailoot Ultra · Сообщения Anthropic

JSON или SSE

Сохраняйте все готовые результаты

Сохраняйте каждый полностью полученный ответ, файл и элемент содержимого.

Сохраняйте все блоки содержимого, подписи рассуждений и фактические ID обращений к инструментам. Собирайте все изменения блоков SSE; первый текстовый блок не является полным выходом.

Если нужно проверить исходный ответ

Сохраняйте ID запросов и ответов, а также заголовки. Общий URL получения текстового задания не предоставлен.

Поля ответа
ПолеТип
ПолеidТипstring
ПолеmodelТипstring
Полеcontent[]Типtext|thinking|tool_use|other content block
Полеstop_reasonТипstring|null
ПолеusageТипobject
Ошибки и дальнейшие шаги
ОтветУсловиеСледующий шаг
Ответ400 · invalid_request_errorУсловиеНеверные обязательные поля, представление материалов или значение параметраСледующий шагИсправьте указанные поля перед новым запросом на создание.

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-flash-image
Ailoot Ultra google/gemini-3.1-flash-image

Псевдонимы путей метода

/v1/images

Связанные ID для вызова

google/gemini-3.1-flash-image, gemini-3.1-flash-image

FAQ · Google: Nano Banana 2 (Gemini 3.1 Flash Image)
Какие входные данные и результаты доступны?

POST /v1/images/generations · gemini-3.1-flash-image: text → image, text

POST /v1/chat/completions · google/gemini-3.1-flash-image: text → text

POST /v1/images/generations · google/gemini-3.1-flash-image: text, image → image

POST /v1/messages · google/gemini-3.1-flash-image: text → json, sse

Какие поля использует запрос?

POST /v1/images/generations · gemini-3.1-flash-image: model, prompt, n, response_format, stream

POST /v1/chat/completions · google/gemini-3.1-flash-image: model, messages, stream, modalities, provider

POST /v1/images/generations · google/gemini-3.1-flash-image: model, prompt, resolution, aspect_ratio, n, input_references, provider

POST /v1/messages · google/gemini-3.1-flash-image: model, messages, max_tokens, stream

Какие ограничения действуют?

POST /v1/images/generations · gemini-3.1-flash-image: ctx: 131072; max_out: 32768; n.minimum: 1

POST /v1/chat/completions · google/gemini-3.1-flash-image: messages.min_items: 1

POST /v1/images/generations · google/gemini-3.1-flash-image: n.minimum: 1; n.maximum: 1

Подробнее

Подключите Ailoot к Claude Code, OpenCode, Hermes или своему приложению.

Компания и портфель её проектов

Компания и портфель её проектов: миллионы клиентов; продажи на миллиарды ежемесячно.

Покупайте токены со скидкой.

Скидка по подписке для регулярной работы. Промокоды — до 50% на покупку токенов.

Подписка
Выберите тариф со скидкой для своих регулярных запросов.
Промокод до 50%
Введите код при покупке. Цена пересчитается с учётом действующей акции.
Расходы в истории
Модель, токены и сумма сохраняются для каждого запроса.

Выбрать подписку · Посмотреть цены моделей

Подключайте API к продукту, который вы продаёте.

SaaS, приложения и боты — по оферте и лицензионному договору Ailoot. Для перепродажи запросите реселлерскую лицензию.

Коммерческое приложение
Встраивайте генерацию текста, картинок, видео и звука в платные функции своего сервиса.
Лицензия для реселлера
Пришлите описание проекта и схему доступа. Запросите письменные условия использования и перепродажи.
Документы на сайте
Оферта, лицензионный договор и политика обработки данных доступны до подключения.

Запросить реселлерскую лицензию · Оферта и лицензионный договор