API изображений
Картинки в kosareva.cloud создаются через POST /v1/images/generations и правятся через POST /v1/images/edits. Ключ тот же, что у текстовых моделей, формат как у OpenAI, поэтому подходит обычный OpenAI SDK.
Генерация
Запрос на /v1/images/generations. Цена у большинства моделей фиксирована за картинку и не зависит от размера, у GPT Image 2.5 считается по токенам, как у самой модели.
curl https://api.kosareva.cloud/v1/images/generations \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-image-2","prompt":"Белые кроссовки на светлом фоне","size":"1024x1024"}'
import base64
import urllib.request
from openai import OpenAI
client = OpenAI(api_key="ВАШ_API_КЛЮЧ", base_url="https://api.kosareva.cloud/v1")
result = client.images.generate(
model="gpt-image-2",
prompt="Минималистичный постер кофейни, мягкий утренний свет",
size="1024x1024",
)
image = result.data[0]
if image.b64_json:
with open("poster.png", "wb") as file:
file.write(base64.b64decode(image.b64_json))
else:
urllib.request.urlretrieve(image.url, "poster.png")
Генерация через чат
Модель nano-banana-2-1 вызывается как обычный чат: запрос на /v1/chat/completions, описание картинки в messages. Картинка приходит строкой data:image/…;base64 в поле message.images или в content, поэтому код ниже проверяет оба места.
import base64
import re
from openai import OpenAI
client = OpenAI(api_key="ВАШ_API_КЛЮЧ", base_url="https://api.kosareva.cloud/v1")
response = client.chat.completions.create(
model="nano-banana-2-1",
messages=[{"role": "user", "content": "Минималистичный постер кофейни"}],
)
message = response.choices[0].message
images = (message.model_extra or {}).get("images") or []
source = images[0]["image_url"]["url"] if images else message.content
found = re.search(r"data:image/(\w+);base64,([A-Za-z0-9+/=]+)", source)
with open(f"poster.{found.group(1)}", "wb") as file:
file.write(base64.b64decode(found.group(2)))
Правка по исходнику
Запрос на /v1/images/edits. Файл уходит в multipart/form-data, поле image. У апскейла и удаления фона prompt не нужен. Правка идёт дольше генерации, до 2 минут, поэтому таймаут HTTP-клиента ставьте от 180 секунд: с коротким клиент оборвёт запрос раньше, чем придёт картинка.
curl https://api.kosareva.cloud/v1/images/edits \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ" \
-F model="gpt-image-2" \
-F image="@photo.png" \
-F prompt="Замени фон на белый"
with open("photo.png", "rb") as source:
result = client.images.edit(
model="gpt-image-2",
image=source,
prompt="Сохрани композицию, замени фон на ночной город",
)
Поля запроса
| Поле | Что задаёт |
|---|---|
model | Имя модели из таблицы. Обязательно |
prompt | Описание картинки или правки. Обязательно, кроме апскейла и удаления фона |
image | Исходный файл, только для /v1/images/edits |
size | У gpt-image-2 размер результата, например 1024x1024 или 1536x1024. У Seedream 4.5, FLUX.2 Pro и Flex, Wan 2.7 Image, Nano Banana Pro и nano-banana-2 только пропорции кадра, число пикселей через API не меняется. GPT Image 2.5 и FLUX.1-schnell получают поле как есть. Остальные модели поле не читают: запрос пройдёт, но картинка выйдет в их формате по умолчанию |
quality | Запрос не сломает, но на результат и цену не влияет |
n | Рассчитывайте на одну картинку за запрос. Исключение nano-banana-2: от 1 до 4, каждая оплачивается отдельно |
response_format | b64_json, если нужен base64 вместо ссылки |
Что вернётся
Ответ /v1/images кладёт картинку в одно из двух полей: data[0].b64_json или ссылкой в data[0].url. Какое заполнено, зависит от модели, поэтому код выше проверяет оба.
- Нужен base64 там, где пришла ссылка: передайте
response_format: "b64_json". - Сохраняйте файл сразу: ссылка временная, рассчитывайте на сутки.
- Запрос с ошибкой не списывается, платный только успешный ответ.
Модели и цены
В каталоге 33 модели: 26 на /v1/images/generations, 1 через чат, 13 для правки.
| Модель | Имя в запросе | Цена | Генерация | Правки |
|---|---|---|---|---|
| Nano Banana 2 | nano-banana-2 | от 10,4 ₽ | да | — |
| Nano Banana 2.1 | nano-banana-2-1 | от 9,4 ₽ | через чат | — |
| Nano Banana Pro (Gemini 3 Pro Image) | nano-banana-pro-gemini-3-pro-image | от 16 ₽ | да | да |
| FLUX.1-schnell | flux-1-schnell | от 1,4 ₽ | да | — |
| GPT Image 2 | gpt-image-2 | от 4,5 ₽ | да | да |
| GPT Image 2.5 | gpt-image-2-5 | около 6,7 ₽ | да | — |
| Seedream 4.5 | seedream-4-5 | от 4,5 ₽ | да | да |
| FLUX.2 Flex | flux-2-flex | от 13 ₽ | да | да |
| FLUX.2 Pro | flux-2-pro | от 3,5 ₽ | да | да |
| GPT Image 2.5 Sunburst | gpt-image-2-5-sunburst | около 6,7 ₽ | да | — |
| GPT Image 2.5 Flare | gpt-image-2-5-flare | около 6,7 ₽ | да | — |
| Imagen 4 | imagen-4 | от 9,7 ₽ | да | — |
| Imagen 4 Fast | imagen-4-fast | от 4,9 ₽ | да | — |
| Imagen 4 Ultra | imagen-4-ultra | от 14,6 ₽ | да | — |
| FLUX Kontext Pro | flux-kontext-pro | от 6,1 ₽ | да | — |
| FLUX Kontext Max | flux-kontext-max | от 12,2 ₽ | да | — |
| Seedream 4.0 | seedream-4-0 | от 6,1 ₽ | да | — |
| Seedream 5.0 Lite | seedream-5-0-lite | от 6,7 ₽ | да | — |
| Ideogram V3 | ideogram-v3 | от 6,5 ₽ | да | — |
| Qwen Image 3.0 | qwen-image-3-0 | от 5,8 ₽ | да | — |
| Qwen Image 3.0 Pro | qwen-image-3-0-pro | от 7,8 ₽ | да | — |
| Wan 2.7 Image | wan-2-7-image | от 3,3 ₽ | да | да |
| Wan 2.7 Image Pro | wan-2-7-image-pro | от 8,1 ₽ | да | да |
| Z-Image Base | z-image-base | от 1 ₽ | да | — |
| Gemini 2.5 Flash Image | gemini-2-5-flash-image | от 4,9 ₽ | да | — |
| Gemini 3.1 Flash-Lite Image | gemini-3-1-flash-lite-image | от 4,9 ₽ | да | — |
| Grok Imagine Image 2.0 | grok-imagine-image-2-0 | от 4,9 ₽ | да | — |
| GPT Image 1.5 | gpt-image-1-5 | от 4,9 ₽ | — | да |
| Seedream 5.0 Pro | seedream-5-0-pro | от 8,5 ₽ | — | да |
| Qwen Image 2.0 | qwen-image-2-0 | от 6,8 ₽ | — | да |
| Topaz Image Upscale | topaz-image-upscale | от 12,2 ₽ | — | да |
| Recraft Crisp Upscale | recraft-crisp-upscale | от 0,6 ₽ | — | да |
| Recraft Remove Background | recraft-remove-background | от 1,2 ₽ | — | да |
Прочерк значит, что модель этот путь не принимает или мы его не подтвердили, поэтому рассчитывать на него не стоит. Запрос с ошибкой не списывается. Цены за картинку минимальные, у некоторых моделей крупный размер стоит дороже, точные условия на странице модели. Обзор моделей на странице API генерации изображений.