Для AI-агентов: markdown этой страницы — /docs-content/ai/images.md индекс документации — /llms.txt
Сгенерировать изображение
POST /v1/images/generations
Создаёт одну картинку по текстовому описанию моделью BitrixGPT 5.6 Image и возвращает её в формате base64. Платформа изображения не хранит, поэтому сохраните картинку на своей стороне.
Картинка учитывается в AI-квоте портала: в рамках квоты тарифа деньги с баланса не списываются, сверх квоты каждая картинка оплачивается с баланса портала по цене из поля pricing.perCall модели в GET /v1/models. Неудачный вызов не оплачивается. Формат запроса и ответа совместим с POST /v1/images/generations из OpenAI API.
Ответ приходит в сыром OpenAI-формате.
Обёртки
{success, data}, которая используется в остальных эндпоинтах Вайбкод —/v1/deals,/v1/tasksи других, — здесь нет.Так сделано для совместимости с OpenAI SDK. Если у вас единый клиент с проверкой
if (!response.success), добавьте для AI Router исключение.
Поля запроса (body)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
model |
string | да | ID модели генерации изображений — bitrix/bitrixgpt-5.6-image. В ответе GET /v1/models такую модель отличает capabilities.image_generation |
prompt |
string | да | Описание картинки, от 1 до 4000 символов |
size |
string | нет | Ширина и высота в пикселях через латинскую x. Стороны задаются независимо: 1024x1024 — квадрат, 1024x576 — широкая картинка, 576x1024 — вертикальная. Каждая сторона — от 64 до 1024 пикселей. Без этого поля сервис генерации отдаёт картинку 1024×1024 |
output_format |
string | нет | Формат картинки: png, jpeg или webp |
negative_prompt |
string | нет | Что не должно появиться на картинке, до 4000 символов |
seed |
integer | нет | Зерно генерации — целое число от 0. Одинаковые prompt, size и seed дают в точности ту же картинку, поэтому удачный кадр можно сгенерировать заново |
num_inference_steps |
integer | нет | Число шагов генерации, от 1 до 8. По умолчанию 4 |
response_format |
string | нет | Принимается только b64_json |
n |
integer | нет | Число картинок. Принимается только 1 — цена считается за вызов |
user |
string | нет | Идентификатор конечного пользователя вашего приложения, до 200 символов. Передаётся модели как есть |
Поле вне этого списка отклоняется с 400 invalid_request.
Примеры
curl — личный ключ
curl -X POST https://vibecode.bitrix24.tech/v1/images/generations \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bitrix/bitrixgpt-5.6-image",
"prompt": "Рыжая лиса сидит на камне у озера, акварель",
"size": "512x512",
"output_format": "jpeg"
}'
curl — OAuth-приложение
curl -X POST https://vibecode.bitrix24.tech/v1/images/generations \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "bitrix/bitrixgpt-5.6-image",
"prompt": "Рыжая лиса сидит на камне у озера, акварель",
"size": "512x512",
"output_format": "jpeg"
}'
JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/images/generations', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'bitrix/bitrixgpt-5.6-image',
prompt: 'Рыжая лиса сидит на камне у озера, акварель',
size: '512x512',
output_format: 'jpeg',
}),
})
const result = await res.json()
// Адрес вида data: подходит для атрибута src тега img
const dataUrl = `data:image/jpeg;base64,${result.data[0].b64_json}`
console.log('Картинка готова:', dataUrl.slice(0, 60))
JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/images/generations', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'bitrix/bitrixgpt-5.6-image',
prompt: 'Рыжая лиса сидит на камне у озера, акварель',
size: '512x512',
output_format: 'jpeg',
}),
})
const result = await res.json()
const dataUrl = `data:image/jpeg;base64,${result.data[0].b64_json}`
console.log('Картинка готова:', dataUrl.slice(0, 60))
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
created |
number | Время создания, Unix-время в секундах |
data |
array | Сгенерированные картинки. Один вызов — одна картинка |
data[].b64_json |
string | Картинка в base64 |
output_format |
string | Формат картинки. Приходит, когда его сообщает сервис генерации |
size |
string | Ширина и высота картинки в пикселях, например 512x512. Поле приходит, когда размер сообщает сервис генерации |
Пример ответа
Строка b64_json сокращена: в настоящем ответе это картинка целиком, для JPEG 512×512 — около 140 КБ.
{
"created": 1789740000,
"data": [
{ "b64_json": "/9j/4AAQSkZJRgABAQAAAQABAAD..." }
],
"output_format": "jpeg",
"size": "512x512"
}
Пример ответа при ошибке
400 invalid_request — сторона картинки больше 1024 пикселей:
{
"error": {
"message": "size: each side must be between 64 and 1024 pixels",
"type": "invalid_request_error",
"code": "invalid_request"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | invalid_request |
Тело не прошло проверку: неизвестное поле, пустой prompt, сторона картинки вне диапазона 64–1024, n не равно 1, response_format не b64_json. Проверка идёт до квоты и генерации, списания нет |
| 400 | ai_provider_rejected |
Сервис генерации отклонил запрос своим ответом 400 или 422. Исходный статус приходит в поле providerStatusCode. Повторять запрос без изменений бессмысленно |
| 402 | insufficient_balance |
Предоплатный счёт портала ушёл за овердрафт. Проверяется до генерации |
| 402 | ai_quota_exhausted |
Месячная AI-квота портала исчерпана, а оплатить картинку сверх квоты нельзя — см. «Известные особенности» |
| 402 | account_frozen |
Счёт портала заморожен за долг, а картинка выходит за AI-квоту — расход сверх квоты платит баланс. Картинка внутри квоты под заморозкой продолжает работать. Пока сужение отказа не дошло до портала, заморозка закрывает ручку целиком и отвечает конвертом V1 с кодом ACCOUNT_FROZEN в верхнем регистре — состав отказа |
| 402 | company_budget_exhausted |
Исчерпан бюджет расхода компании, который задаёт администратор портала. Поле scope называет пробитый бюджет: USER — личный бюджет вызывающего, PORTAL — бюджет всего портала. Поле canRequest говорит, можно ли запросить увеличение. Отказ приходит только на картинках сверх квоты, которые списывают средства с баланса портала |
| 402 | ai_credentials_not_configured |
На платформе не настроен доступ к сервису генерации |
| 403 | scope_missing |
API-ключу не хватает скоупа vibe:ai |
| 404 | not_found |
Генерация изображений недоступна вашему ключу или порталу |
| 404 | ai_model_not_found |
В поле model не модель генерации изображений, доступная ключу. Доступные модели — в ответе GET /v1/models, у них есть capabilities.image_generation. Списания нет |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 429 | ai_image_congested |
Сервис генерации занят другими запросами. Запрос не выполнялся, списания нет — повторите через число секунд из заголовка Retry-After |
| 429 | ai_congested |
Пул AI-кластера перегружен. Запрос не выполнялся, списания нет — повторите по заголовку Retry-After. Ответ несёт заголовок X-AI-Admission: shed |
| 429 | ai_pacing_limited |
Превышено суточное или недельное окно равномерного расходования квоты. Это не исчерпание квоты — повторите запрос по заголовку Retry-After. Подробнее — «Равномерное расходование» |
| 429 | rate_limit_exceeded |
Превышен лимит запросов к AI-эндпоинтам либо сервис генерации ограничил частоту запросов. Во втором случае в ответе есть поле providerStatusCode. Время до повтора — в заголовке Retry-After |
| 429 | ai_provider_cooldown |
Сервис генерации временно недоступен, и платформа держит паузу. Запрос не выполнялся, списания нет — повторите через число секунд из Retry-After |
| 502 | ai_provider_unavailable |
Сервис генерации недоступен, ответил внутренней ошибкой или вернул ответ без картинки. Списания нет, повторите запрос |
| 502 | ai_provider_network |
Платформа не смогла соединиться с сервисом генерации. Списания нет, повторите запрос |
| 503 | ai_provider_timeout |
Картинка не готова за 60 секунд. Списания нет — повторите через число секунд из Retry-After |
| 503 | ai_cluster_not_configured |
Генерация изображений не настроена на этой установке платформы |
Полный список общих ошибок API — Ошибки.
Известные особенности
Модель ищется по возможности, а не по имени. Модель генерации изображений приходит в общем списке GET /v1/models вместе с чат-моделями и отличается от них полем capabilities.image_generation. Если такой модели в списке нет, генерация изображений вашему ключу или порталу недоступна, и ручка ответит 404. Вшивать идентификатор модели в код не нужно.
Только текстовое описание. Картинку на вход эндпоинт не принимает — поля для изображения-образца в теле запроса нет. Что должно быть на картинке, задаёт prompt, чего на ней быть не должно — negative_prompt.
В рамках квоты — без списаний, сверх квоты — по цене за картинку. Каждая успешная картинка расходует месячную AI-квоту портала. Пока расход укладывается в квоту тарифа, деньги с баланса не списываются. Сверх квоты картинка оплачивается с баланса портала по цене из pricing.perCall. Когда квота исчерпана, а оплата сверх неё невозможна, ручка отвечает 402 ai_quota_exhausted. Поле reason различает три случая: breaker — сработал часовой предохранитель расходов сверх квоты, wallet_empty — на балансе портала нет средств, wallet_off — расход сверх квоты для портала недоступен. Поле resetAt — момент, когда запросы снова начнут проходить, для wallet_off оно может отсутствовать.
Одновременных запросов ограниченное число. Сервис генерации обрабатывает ограниченное число запросов одновременно, остальные ждут своей очереди. Когда очередь заполнена, запрос сразу получает 429 ai_image_congested и в генерацию не попадает. Картинка, которая не готова за 60 секунд, заканчивается ответом 503 ai_provider_timeout. Чем больше num_inference_steps и размер картинки, тем дольше ждёт и ваш запрос, и очередь за ним.
Картинки не хранятся. Изображение приходит только в ответе, в поле data[].b64_json: ссылок на файлы платформа не выдаёт, повторно скачать картинку с платформы нельзя. Сохраните её сразу после ответа.