Возможности
ВОЗМОЖНОСТИ

Генерация изображений

Генерация изображений через /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.

Обновлено:

Генерация изображений · Hubris