Google: Nano Banana 2.1
Gemini Nano Banana 2.1 генерирует и редактирует изображения в диалоге по тексту и визуальным материалам. Модель улучшает отрисовку текста, компоновку инфографики и согласованность последовательных правок, предлагает вывод 1K–4K и до 14 референсных изображений для заданного визуального брифа.
- Ailoot Ultra · Чат OpenAI
POST /v1/chat/completionsgoogle/gemini-nano-banana-2.1 - Ailoot Ultra · Картинки
POST /v1/images/generationsgoogle/gemini-nano-banana-2.1 - Ailoot Ultra · Сообщения Anthropic
POST /v1/messagesgoogle/gemini-nano-banana-2.1
О модели
Описание раскрывает возможности модели. Доступные в Ailoot входные данные, результаты и параметры выбранного метода перечислены ниже.
Gemini Nano Banana 2.1 — модель Google для генерации изображений и их редактирования в диалоге. Это обновление Nano Banana 2 с улучшениями визуального реализма, следования инструкциям, отрисовки текста и постоянства персонажей при последовательных правках. В таблице входных данных указаны текст, изображения, видео и PDF, а на выходе — изображения и текст. Поэтому модель полезна для сцены с товаром, инфографики или визуальной серии, развиваемой несколькими конкретными изменениями.
Модель предлагает вывод 1K, 2K и 4K, по умолчанию — 1K. Вариант 0.5K из Nano Banana 2 она не наследует. Документированные соотношения сторон включают 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. Google отмечает исправление артефактов стыковки в последних широких и высоких форматах при 2K и 4K. Обозначения разрешения задают категории размера, а не один фиксированный прямоугольник: квадратное изображение 4K имеет 4096 × 4096, тогда как документированный вывод 16:9 в 4K составляет 5504 × 3072.
Текст — существенная часть визуального процесса. Модель предназначена для читаемой отрисовки стилизованных надписей и более точной организации элементов инфографики. Подготовьте точный заголовок, подписи и порядок чтения, затем запросите изображение с этим утверждённым текстом. Для меню, диаграммы или обучающей графики укажите связь между подписью и её визуальным элементом. Google рекомендует сначала составить текст, а затем запрашивать изображение, чтобы визуальная композиция опиралась на согласованный текстовый бриф.
Объединение референсов поддерживает до 14 изображений. Документированный профиль предусматривает постоянство до четырёх персонажей и точность воспроизведения до десяти объектов. Назначьте каждому референсу роль: товар, который должен остаться узнаваемым, внешность персонажа, нужный фон или визуальный стиль. Пример товарного брифа: «Используй изображение A для формы бутылки и этикетки. Используй изображение B для поверхности и освещения. Сохрани товар без изменений, размести его рядом со сложенным полотенцем и оставь над ним свободное место для предоставленного заголовка».
Привязка к Google Web Search и Image Search может предоставлять актуальную информацию и визуальный контекст для генерации. Image Search использует найденные в интернете изображения как референсы, а обычная привязка к веб-поиску предоставляет сведения о предмете. Это полезно для фактической графики или сцены, внешний вид которой зависит от реального объекта. В этом процессе поиск изображений не поддерживает получение реальных изображений людей. В документированном процессе Google ответы с привязкой к источникам содержат метаданные источников и атрибуции, поэтому приложение должно сохранять их вместе с результатом генерации.
Рассуждения настраиваются на уровнях minimal, medium и high; по умолчанию именно у этой модели применяется medium. Это помогает проработать композицию и более сложные инструкции перед финальным выводом. Руководство по изображениям описывает промежуточные композиционные изображения в этом процессе; они отличаются от целевого итогового материала. Явно выбирайте окончательную компоновку, соотношение сторон и разрешение, не ожидая, что одно описание в запросе определит каждую настройку вывода.
Редактирование в диалоге позволяет последующим запросом изменить одну часть существующего результата: поправить свет, переместить объект или перевести подписи, сохранив остальную композицию. Передавайте предыдущее изображение или взаимодействие в следующий ход и указывайте как требуемое изменение, так и сохраняемые особенности. Для серии с персонажем используйте постоянные референсы внешности и референс позы, когда важны новый ракурс или сложная поза. Практический запрос на правку: «Сохрани товар, подписи и компоновку; измени только фон на более тёплый серый».
В таблице модели указан предел входа 131 072 токена и вывода 32 768 токенов. Поддерживаются генерация изображений и привязка к поиску, тогда как генерация аудио, выполнение кода, вызов функций, структурированный вывод, кэширование, поиск по файлам, URL context и Live API для этой версии не указаны как поддерживаемые. Видео может служить источником для создаваемого неподвижного изображения; это не делает модель генератором видео. Google также отмечает, что запрос точного числа изображений может не дать указанного количества. Все сгенерированные изображения содержат водяной знак SynthID.
Для полезного первого брифа задайте назначение изображения, предмет, композицию, свет, положение камеры, обязательный текст и форму вывода. Например, запросите вертикальную инфографику с тремя подписанными шагами, читаемым заголовком и заданной цветовой иерархией, затем проверьте текст и взаимное размещение перед следующей правкой. Результат может стать товарной иллюстрацией, редакционной графикой или дизайн-референсом; выбранное изображение и поясняющий текст следует сохранять вместе.
Практическая задача
Практическая задача
Технический пример на английском
Refine an approved poster background
Edit the supplied event poster. Preserve every word, the headline hierarchy, illustration placement and portrait composition. Change only the background from cool white to warm ivory, keeping dark text readable and retaining the original accent color. Do not add shapes, badges, textures or extra captions. Return the revised poster image.Ожидаемый результат
One edited poster with the original wording and layout preserved over a warm ivory background.Проверка результата
Compare every word and element position against the supplied poster, then inspect text contrast.Ailoot Ultra · Чат OpenAI POST /v1/chat/completions google/gemini-nano-banana-2.1
google/gemini-nano-banana-2.1Начало
Gemini Nano Banana 2.1 генерирует и редактирует изображения в диалоге по тексту и визуальным материалам. Модель улучшает отрисовку текста, компоновку инфографики и согласованность последовательных правок, предлагает вывод 1K–4K и до 14 референсных изображений для заданного визуального брифа.
- Допустимые входные данные
- Текст
- Результаты
- Текст
Доступно в Ailoot · входные данные и методы
Ailoot Ultra · Чат OpenAI POST /v1/chat/completions
- Входные данные
text- Результат
text- Выходной формат
- json или SSE
| Поле | Тип | Требование | Значения и ограничения | По умолчанию |
|---|---|---|---|---|
Полеmodel | Типstring | ТребованиеОбязательно | Значения и ограничения google/gemini-nano-banana-2.1 | По умолчанию— |
Поле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.003 / 1K токенов Выход · Выходные токены $0.015 / 1K токенов Вход · Чтение кэша — / 1K токенов Вход · Запись в кэш — / 1K токенов Вход · Запись в кэш, 1 час — / 1K токенов Выход · Токены выходного изображения $0.06 / 1K токенов изображения |
| КонфигурацияУровень 1 по длине запроса | Шкала ставок— | Токенов контекста больше0 | Токенов контекста не более, включительноБез верхней границы | Плата Вход · Входные токены $0.003 / 1K токенов Выход · Выходные токены $0.015 / 1K токенов Вход · Чтение кэша — / 1K токенов Вход · Запись в кэш — / 1K токенов Вход · Запись в кэш, 1 час — / 1K токенов |
Сведения о справочном тарифе
Справочные шкалы модели не меняют выбор метода, расчёт стоимости или списания. Действующая плата определяется ставками выбранного метода Ailoot.
Google: Nano Banana 2.1
Цены по конфигурациям
| Конфигурация | Условия расчёта | Плата |
|---|---|---|
| КонфигурацияGoogle: Nano Banana 2.1 · Стандартная конфигурация | Условия расчётаКонфигурация по умолчанию | Плата Вход · Входные токены 0,003 $ / 1K токенов Выход · Выходные токены 0,015 $ / 1K токенов Выход · Выходное изображение 0,06 $ / 1K токенов Выход · Поиск в интернете 0,028 $ за поиск |
Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →
Примеры запросов
Ailoot Ultra · Чат OpenAI
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-nano-banana-2.1", "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-nano-banana-2.1',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-nano-banana-2.1',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 Ultra google/gemini-nano-banana-2.1
Псевдонимы путей метода
/v1/images
Связанные ID для вызова
Ailoot Ultra · Картинки POST /v1/images/generations google/gemini-nano-banana-2.1
google/gemini-nano-banana-2.1Начало
Gemini Nano Banana 2.1 генерирует и редактирует изображения в диалоге по тексту и визуальным материалам. Модель улучшает отрисовку текста, компоновку инфографики и согласованность последовательных правок, предлагает вывод 1K–4K и до 14 референсных изображений для заданного визуального брифа.
- Допустимые входные данные
- Текст · Картинки
- Результаты
- Картинки
Доступно в Ailoot · входные данные и методы
Ailoot Ultra · Картинки POST /v1/images/generations
- Входные данные
text,image- Результат
image
| Поле | Тип | Требование | Значения и ограничения | По умолчанию |
|---|---|---|---|---|
Полеmodel | Типstring | ТребованиеОбязательно | Значения и ограничения google/gemini-nano-banana-2.1 | По умолчанию— |
Полеprompt | Типstring | ТребованиеОбязательно | Значения и ограничения Минимальная длина: 1 | По умолчанию— |
Полеresolution | Типstring | ТребованиеНеобязательно | Значения и ограничения 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.24576 оценка до генерации Эта оценка не является дополнительным списанием или фиксированным тарифом для завершённой генерации. |
Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →
Примеры запросов
Ailoot Ultra · Картинки
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-nano-banana-2.1', '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}/contentGET /v1/media/assetsGET /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 Ultra google/gemini-nano-banana-2.1
Псевдонимы путей метода
/v1/images
Связанные ID для вызова
Ailoot Ultra · Сообщения Anthropic POST /v1/messages google/gemini-nano-banana-2.1
google/gemini-nano-banana-2.1Начало
Gemini Nano Banana 2.1 генерирует и редактирует изображения в диалоге по тексту и визуальным материалам. Модель улучшает отрисовку текста, компоновку инфографики и согласованность последовательных правок, предлагает вывод 1K–4K и до 14 референсных изображений для заданного визуального брифа.
- Допустимые входные данные
- Текст
- Результаты
- json · sse
Доступно в Ailoot · входные данные и методы
Ailoot Ultra · Сообщения Anthropic POST /v1/messages
- Входные данные
text- Результат
json,sse- Выходной формат
- JSON или SSE
| Поле | Тип | Требование | Значения и ограничения | По умолчанию |
|---|---|---|---|---|
Полеmodel | Типstring | ТребованиеОбязательно | Значения и ограничения google/gemini-nano-banana-2.1 | По умолчанию— |
Поле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.003 / 1K токенов Выход · Выходные токены $0.015 / 1K токенов Вход · Чтение кэша — / 1K токенов Вход · Запись в кэш — / 1K токенов Вход · Запись в кэш, 1 час — / 1K токенов Выход · Токены выходного изображения $0.06 / 1K токенов изображения |
| КонфигурацияУровень 1 по длине запроса | Шкала ставок— | Токенов контекста больше0 | Токенов контекста не более, включительноБез верхней границы | Плата Вход · Входные токены $0.003 / 1K токенов Выход · Выходные токены $0.015 / 1K токенов Вход · Чтение кэша — / 1K токенов Вход · Запись в кэш — / 1K токенов Вход · Запись в кэш, 1 час — / 1K токенов |
Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →
Примеры запросов
Ailoot Ultra · Сообщения Anthropic
{
"model": "google/gemini-nano-banana-2.1",
"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-nano-banana-2.1', '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-nano-banana-2.1', '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 Ultra google/gemini-nano-banana-2.1
Псевдонимы путей метода
/v1/images
Связанные ID для вызова
FAQ · Google: Nano Banana 2.1
- Какие входные данные и результаты доступны?
POST /v1/chat/completions·google/gemini-nano-banana-2.1:text→textPOST /v1/images/generations·google/gemini-nano-banana-2.1:text,image→imagePOST /v1/messages·google/gemini-nano-banana-2.1:text→json,sse- Какие поля использует запрос?
POST /v1/chat/completions·google/gemini-nano-banana-2.1:model,messages,stream,modalities,providerPOST /v1/images/generations·google/gemini-nano-banana-2.1:model,prompt,resolution,aspect_ratio,n,input_references,providerPOST /v1/messages·google/gemini-nano-banana-2.1:model,messages,max_tokens,stream- Какие ограничения действуют?
POST /v1/chat/completions·google/gemini-nano-banana-2.1:messages.min_items:1POST /v1/images/generations·google/gemini-nano-banana-2.1:n.minimum:1;n.maximum:1