Генерация изображений
Генерация изображений через /v1/chat/completions. Передайте `modalities: ["image","text"]` и модель с поддержкой image-output.
Hubris умеет генерировать изображения через тот же эндпоинт /v1/chat/completions, что и для текста — нужно лишь передать modalities и выбрать модель с поддержкой image-output. В каталоге сейчас 29 image-моделей: Google Gemini *-image, OpenAI GPT-5 Image, Black Forest Labs Flux 2 (pro/max/flex/klein), Recraft v3-v4.1 (11 вариантов с поддержкой текста на изображении, vector и utility-режимов), Sourceful Riverflow v2, xAI Grok Imagine, ByteDance Seedream 4.5. Полный актуальный список — фильтр «Output: image» в каталоге.
Минимальный пример
curl -s https://api.hubris.pw/v1/chat/completions \
-H "Authorization: Bearer sk-gw-..." \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemini-2.5-flash-image",
"modalities": ["image", "text"],
"messages": [{"role": "user", "content": "Закат над горами в стиле Гибли"}]
}'Картинка возвращается как base64 data URL в choices[0].message.images[0].image_url.url:
{
"id": "chatcmpl-...",
"model": "google/gemini-2.5-flash-image",
"choices": [
{
"message": {
"role": "assistant",
"content": "Готово!",
"images": [
{
"type": "image_url",
"image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." }
}
]
}
}
],
"usage": { "prompt_tokens": 18, "completion_tokens": 0, "total_tokens": 18 }
}modalities
["image", "text"]— модели с гибридным выходом (Google Gemini image, OpenAI GPT-5 Image): отдают и текст-комментарий, и картинку.["image"]— image-only модели (Flux 2, Recraft, Sourceful, SDXL-семейство): только картинка.
Если передадите modalities для не-image модели — вернётся ошибка от провайдера.
OpenAI SDK
В официальных SDK OpenAI (Python openai, TypeScript openai) поле modalities не объявлено в Chat Completions. Передавайте через extra_body / приведением типов.
Python:
from openai import OpenAI
client = OpenAI(
base_url="https://api.hubris.pw/v1",
api_key="sk-gw-...",
)
resp = client.chat.completions.create(
model="google/gemini-2.5-flash-image",
messages=[{"role": "user", "content": "Закат над горами"}],
extra_body={"modalities": ["image", "text"]},
)
# images приходит как extra поле — доступ через model_extra
images = resp.choices[0].message.model_extra.get("images", [])
for img in images:
data_url = img["image_url"]["url"]
# data_url начинается с "data:image/png;base64,..." — декодировать и сохранитьTypeScript:
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://api.hubris.pw/v1',
apiKey: 'sk-gw-...',
});
const resp = await client.chat.completions.create({
model: 'google/gemini-2.5-flash-image',
messages: [{ role: 'user', content: 'Закат над горами' }],
modalities: ['image', 'text'],
} as any);
const images = (resp.choices[0].message as any).images ?? [];
for (const img of images) {
const dataUrl = img.image_url.url;
// ...
}image_config
Базовые поля (поддерживаются большинством моделей):
aspect_ratio—"1:1"(default),"16:9","9:16","4:3","3:4","21:9"и др.image_size—"1K"(default),"2K","4K","0.5K".
Recraft (v3 / v4 / v4.1)
style— стилевая пресета. Полный список — на карточке модели в каталоге.text_layout— массив объектов{ text, bbox: [[x,y], ...] }для размещения текста на картинке. Только Recraft V3.rgb_colors— массив[r, g, b]для палитры (Recraft v3+).background_rgb_color—[r, g, b]для фона.strength— для image-to-image (0..1, default 0.2). Меньше — ближе к оригиналу, больше — креативнее.
Sourceful Riverflow
font_inputs— массив{ font_url, text }для кастомных шрифтов. Максимум 2.super_resolution_references— массив URL-референсов для image-to-image enhance. Максимум 4. Только при image-to-image.
Google Gemini *-image
- Расширенный набор
aspect_ratioдляgemini-3.1-flash-image-preview:"1:4","4:1","1:8","8:1"(для вертикальных и панорамных layouts). image_size: "0.5K"— оптимизированный по скорости вариант (только эта модель).
Black Forest Labs Flux 2
- Стандартный набор
aspect_ratio+image_size. Без model-specific параметров.
curl -s https://api.hubris.pw/v1/chat/completions \
-H "Authorization: Bearer sk-gw-..." \
-d '{
"model": "google/gemini-3-pro-image-preview",
"modalities": ["image", "text"],
"messages": [{"role": "user", "content": "Морской пейзаж"}],
"image_config": { "aspect_ratio": "16:9", "image_size": "2K" }
}'Какую модель когда выбирать
- Текст на изображении (баннер, постер с надписями) → Recraft V3 (
text_layout). - Брендовые шрифты → Sourceful Riverflow (
font_inputs). - Photorealistic / frontier quality → Flux 2 Pro / Max.
- Быстро + дёшево → Gemini 2.5 Flash Image, Flux 2 Klein 4B.
- Гибрид «текст + картинка» в одном ответе → Gemini *-image, GPT-5 Image.
Image-to-image и редактирование
Некоторые модели (Recraft, Sourceful, Flux 2 Pro) поддерживают входное изображение через content-blocks в messages. Формат пока разный между провайдерами, единого OpenAI-shape ещё нет — смотрите карточку конкретной модели. Hubris прозрачно пропускает содержимое messages к провайдеру.
Стриминг
stream: true работает. Картинка приходит в delta.images[] одним или несколькими чанками. Финальный чанк содержит usage (как в обычном стриме).
curl -N https://api.hubris.pw/v1/chat/completions \
-H "Authorization: Bearer sk-gw-..." \
-d '{
"model": "google/gemini-2.5-flash-image",
"modalities": ["image", "text"],
"messages": [{"role": "user", "content": "Космический корабль"}],
"stream": true
}'Биллинг
Image generation тарифицируется за изображение (не за токены). В каталоге у каждой image-модели видна цена в рублях за одну картинку — это итоговая цифра, которую Hubris спишет с баланса. Если модель умеет возвращать несколько изображений за запрос — спишется n × цена.
Дополнительные параметры некоторых моделей могут увеличивать стоимость запроса — итоговая сумма списания в рублях видна в разделе «Расходы».
Списание происходит после успешного ответа. Транзакция атомарна — баланс, usage_log и движение по балансу пишутся одной БД-транзакцией.
Лимиты
- Баланс — стандартный. Если баланс ниже минимального порога (100 копеек по умолчанию), запрос блокируется с
402 insufficient_balance(см. Лимиты и баланс). - Дневной лимит ключа — действует. Image-запросы добавляются в счётчик 24-часового расхода ключа на общих основаниях. Превышение —
429 daily_limit_exceeded.
Чего пока нет в MVP
- Отдельный image-generations endpoint OpenAI-shape — пока используем
/v1/chat/completionsсmodalities. - Edits (изменение существующего изображения по маске).
- Variations (создание вариаций существующего изображения).
- Загрузка картинки из URL/файла как input (image-to-image поддерживается некоторыми моделями через content blocks в
messages, но единого формата ещё нет).
Если что-то из этого критично — напишите в support@hubris.pw, расскажите use case.
Обновлено: