POST /v1/images/generations
Генерация изображений в формате OpenAI Images API — FLUX.2, Recraft, Seedream, Riverflow, Grok Imagine. Фиксированная цена за изображение, image-to-image через input_references.
Классический Images API: текстовый промпт на входе, готовые изображения на выходе. OpenAI-совместимый формат — официальные openai SDK работают без переписывания, достаточно поменять base_url.
Через этот эндпоинт работают модели с оплатой за изображение: Black Forest Labs FLUX.2, Recraft V3–V4.1, ByteDance Seedream 4.5, Sourceful Riverflow, xAI Grok Imagine. Полный список — фильтр «Output: image» в каталоге. Гибридные модели с токенной тарификацией (Google Gemini *-image, OpenAI GPT-5 Image) сюда не ходят — они генерируют через chat completions с modalities: здесь такой model вернёт 404.
Эндпоинт
https://api.hubris.pw/v1/images/generationsЗаголовки:
| Header | Значение |
|---|---|
Authorization | Bearer sk-gw-... (обязательно) |
Content-Type | application/json |
Тело запроса
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
model | string | — | ID модели из каталога (только модели с ценой за изображение). |
prompt | string | — | Описание изображения. FLUX лучше промптовать на английском — кириллицу рисует как текст на картинке. |
n | integer | 1 | Сколько изображений, 1–10. Реальный потолок у каждой модели свой (Seedream до 10, Recraft до 6, FLUX и Grok — 1); списание — за фактически возвращённые. |
size | string | — | Размер, напр. "1024x1024". Большинство моделей задают размер сами — поле им передавать не нужно. |
response_format | string | b64_json | Пока поддерживается только b64_json. |
Провайдер-специфичные поля схема не отбрасывает и передаёт модели как есть: input_references (image-to-image, см. ниже), aspect_ratio и resolution у Grok Imagine, style / strength / text_layout у Recraft, font_inputs у Riverflow. Что понимает конкретная модель — на её карточке в каталоге; незнакомое поле провайдер игнорирует или отклоняет запрос с 400.
Тело запроса ограничено 36 МБ — хватает на максимальный заказ с base64-референсами; при больших исходниках сжимайте JPEG перед отправкой.
Минимальный пример
curl -s https://api.hubris.pw/v1/images/generations \-H "Authorization: Bearer sk-gw-..." \-H "Content-Type: application/json" \-d '{ "model": "black-forest-labs/flux.2-pro", "prompt": "product photo of a ceramic mug on a linen tablecloth, soft window light"}'import base64from openai import OpenAIclient = OpenAI( base_url="https://api.hubris.pw/v1", api_key="sk-gw-...",)resp = client.images.generate( model="black-forest-labs/flux.2-pro", prompt="product photo of a ceramic mug on a linen tablecloth, soft window light",)with open("mug.png", "wb") as f: f.write(base64.b64decode(resp.data[0].b64_json))import fs from "node:fs";import OpenAI from "openai";const client = new OpenAI({baseURL: "https://api.hubris.pw/v1",apiKey: "sk-gw-...",});const resp = await client.images.generate({model: "black-forest-labs/flux.2-pro",prompt: "product photo of a ceramic mug on a linen tablecloth, soft window light",});fs.writeFileSync("mug.png", Buffer.from(resp.data![0]!.b64_json!, "base64"));Ответ
{
"created": 1753789200,
"data": [
{ "b64_json": "iVBORw0KGgoAAAANSUhEUg..." }
]
}| Поле | Описание |
|---|---|
created | Unix-время (секунды). |
data[] | По одному элементу на изображение. |
data[].b64_json | Байты изображения в base64 — без префикса data:. Формат файла определяется по содержимому (обычно PNG или JPEG — как отдал провайдер). |
Ссылок (url) в ответе нет — изображения приходят телом ответа. Поля usage тоже нет: стоимость запроса смотрите в журнале.
Редактирование (image-to-image)
Исходные изображения передаются полем input_references — data URL с base64 или публичная https-ссылка:
{
"model": "bytedance-seed/seedream-4.5",
"prompt": "Перенеси предмет с фото в интерьер лофта, мягкий дневной свет",
"input_references": [
{ "type": "image_url", "image_url": { "url": "data:image/jpeg;base64,/9j/4AAQ..." } }
]
}В официальных SDK поле не объявлено — передавайте через extra_body (Python) или приведение типов (TypeScript). Сколько референсов принимает каждая модель и примеры целиком — в гайде Генерация изображений.
HTTP-коды
| Код | code | Когда |
|---|---|---|
200 | — | Успех, изображения в data[]. |
400 | invalid_request | Тело не соответствует схеме (нет model/prompt) либо модель отклонила параметры. |
401 | — | Ключ отсутствует / отозван / невалиден. |
402 | insufficient_balance | Баланса не хватает на ожидаемую стоимость заказа (n × цена за изображение). |
404 | model_not_found | Модели нет в каталоге, она выключена или тарифицируется токенами (Gemini/GPT-5 Image — те ходят через chat completions). |
413 | request_too_large | Тело запроса больше 36 МБ. |
429 | daily_limit_exceeded | Превышен дневной лимит расходов ключа. |
502 | no_images_returned | Провайдер ответил успехом, но без изображений. Списания нет, запрос стоит повторить. |
502 | pricing_unavailable | Не удалось определить стоимость генерации — запрос не выполняется, бесплатных генераций не бывает. |
502 / 503 / 504 | — | Транзиентные сбои провайдера, курса ЦБ или таймаут генерации. |
Формат тела ошибки и стратегия retry — Ошибки.
Биллинг
Тарификация — за изображение: цена в рублях за штуку видна на карточке модели в каталоге, за запрос спишется n × цена. Стоимость известна до запроса и не зависит от длины промпта.
Списание — после успешного ответа, одной транзакцией; сумма попадает в журнал запросов. За отклонённые запросы (model_not_found, невалидное тело), отказ провайдера и пустой ответ не списывается ничего.
Что дальше
- Генерация изображений — гайд целиком: оба пути, редактирование, выбор модели, параметры.
- Vision — картинка на входе для анализа, а не генерации.
- Модели — как выбрать модель и прочитать её карточку.
- Ошибки — что делать на 429/502.
- Цены — как считается стоимость запроса.
Обновлено: