Генерация изображений через API vibecode.moe

Отдельная ручка /v1/images/generations, совместимая с OpenAI. Тот же vk- ключ, оплата — за картинку, а не за токены.

Запрос

curl https://vibecode.moe/v1/images/generations \
  -H "Authorization: Bearer vk-YOUR-KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-image-2","prompt":"a red fox in the snow","n":1,"size":"1024x1024"}'

Обязательное поле одно — model. Остальные (prompt, n, size, quality…) — те же, что в OpenAI Images API, и поддерживаются в объёме, который умеет выбранная модель. Генерация занимает десятки секунд — ставь таймаут клиента не меньше минуты.

Ответ

{
  "created": 1789534663,
  "data": [
    { "url": "https://vibecode.moe/v1/images/file/0cd95374-….png" }
  ]
}

Ссылка временная — живёт несколько часов, потом отдаёт 404. Скачай файл сразу (ключ для этого не нужен) или запрашивай b64_json, чтобы получить байты прямо в ответе (ниже).

Байты вместо ссылки

Добавь "response_format":"b64_json", и в data[].b64_json придёт сам файл в base64. Удобно, когда некуда ходить за ссылкой — очередь, фоновый воркер, изолированная сеть.

curl https://vibecode.moe/v1/images/generations \
  -H "Authorization: Bearer vk-YOUR-KEY" -H "Content-Type: application/json" \
  -d '{"model":"gpt-image-2","prompt":"a red fox in the snow","response_format":"b64_json"}' \
  | python -c "import sys,json,base64; open('out.png','wb').write(base64.b64decode(json.load(sys.stdin)['data'][0]['b64_json']))"

Картинка-референс

Чтобы модель отталкивалась от твоего изображения (изменить его, дорисовать, совместить несколько), шли запрос на /v1/images/edits. Это multipart/form-data, как в OpenAI Images API: картинка идёт файлом в поле image — не ссылкой и не base64 внутри JSON.

curl https://vibecode.moe/v1/images/edits \
  -H "Authorization: Bearer vk-YOUR-KEY" \
  -F model=gpt-image-2.5 \
  -F prompt="put a red scarf on the fox" \
  -F image=@fox.png
from openai import OpenAI

client = OpenAI(base_url="https://vibecode.moe/v1", api_key="vk-YOUR-KEY")
result = client.images.edit(
    model="gpt-image-2.5",
    image=open("fox.png", "rb"),
    prompt="put a red scarf on the fox",
)
print(result.data[0].url)

Обязательны model, prompt и хотя бы один файл image. Файлов может быть до четырёх (повтори поле image), формат — PNG, JPEG или WebP, весь запрос — до 32 МБ. Остальные поля (size, quality, response_format…) — те же, что при генерации. Файл mask принимается, но модели пока его не учитывают — правится вся картинка по описанию; n на правке даёт одну картинку. Запрос без файла или с не-картинкой вернёт ошибку 400 сразу, без списания. Правка идёт дольше генерации — до 2–3 минут, ставь таймаут клиента не меньше 4 минут.

Ответ, временная ссылка и цена — как у генерации: одна картинка в ответе — одно списание по цене модели.

Модели

  • gpt-image-2
  • gpt-image-2.5
  • gpt-image-2.5-flare
  • gpt-image-2.5-sunburst
  • gpt-image-2-vip
  • nano-banana-2
  • nano-banana-2-lite
  • nano-banana-2.1
  • nano-banana-pro

Цена за картинку и доступные размеры — на странице моделей и в GET https://vibecode.moe/v1/models (поле usd_per_image).

Через /v1/chat/completions эти модели не работают — только через /v1/images/generations и /v1/images/edits. Картинку, переданную как image_url в сообщении чата, они не получат. Если генерация не удалась, ответ будет ошибкой, и списания не произойдёт.