HTTP 400
Проверьте image-model ID, prompt, n=1–4, size и response_format=b64_json, затем ограничения модели.
Рабочий POST /v1/images/generations: image-модель, Idempotency-Key, размеры, b64_json, сохранение файла, стоимость и ошибки.
Базовый адрес — https://tokenmost.ru/v1. Создайте ключ в личном кабинете, выберите модель в каталоге и отправьте первый запрос. Методы, которые ещё не доступны, отмечены отдельно.
Публичный Images API Токенмоста создаёт изображения по текстовому prompt и возвращает результат в data[].b64_json. Нужны Bearer-ключ с доступом к Images, положительный баланс, точный ID image-модели и уникальный Idempotency-Key. Редактирование входного изображения этим методом не поддерживается.
curl "https://tokenmost.ru/v1/images/generations" \
-H "Authorization: Bearer $TOKENMOST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: image-demo-0001" \
-d '{
"model": "google/gemini-3.1-flash-image",
"prompt": "Синий стеклянный мост над спокойной рекой, мягкий утренний свет",
"n": 1,
"size": "1024x1024",
"response_format": "b64_json"
}' > image-response.jsonimport { readFile, writeFile } from "node:fs/promises";
const response = JSON.parse(await readFile("image-response.json", "utf8"));
if (!response.data?.[0]?.b64_json) throw new Error("Изображение отсутствует");
const bytes = Buffer.from(response.data[0].b64_json, "base64");
await writeFile("result.png", bytes);
console.log({ id: response.id, bytes: bytes.length });$response = Get-Content .image-response.json -Raw | ConvertFrom-Json
if (-not $response.data[0].b64_json) { throw "Изображение отсутствует" }
[IO.File]::WriteAllBytes(
(Join-Path $PWD "result.png"),
[Convert]::FromBase64String($response.data[0].b64_json)
)Укажите TOKENMOST_BASE_URL=https://tokenmost.ru/v1, ключ проекта и точный ID модели из каталога. Пример отправляет запрос в публичный API и может списать средства с баланса по тарифу модели.
curl "https://tokenmost.ru/v1/images/generations" \
-H "Authorization: Bearer $TOKENMOST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: image-example-0001" \
-d '{
"model": "IMAGE_MODEL_ID_FROM_CATALOG",
"prompt": "Минималистичная иллюстрация синего моста на светлом фоне",
"n": 1,
"size": "1024x1024",
"response_format": "b64_json"
}'Генерация выполняет реальный платный запрос. Начните с n: 1, поддерживаемого размера и отдельного ключа с небольшим бюджетом. Не записывайте API-ключ или b64_json в логи.
model и prompt обязательны. n — целое число от 1 до 4, по умолчанию 1. Общий контракт принимает 256x256, 512x512 и 1024x1024; маршрут конкретной модели может разрешать только часть размеров и меньшее n. response_format сейчас только b64_json.
Ответ содержит id, created и data. В каждом элементе есть b64_json; дополнительно могут прийти revised_prompt и media_type. Допустимы PNG, JPEG, WebP и SVG. Расширение файла выбирайте по фактическому media_type, если оно передано.
Изображения оплачиваются по единице и тарифу модели, а не по текстовым токенам. Сервис резервирует сумму для запрошенного n и маршрута, затем фиксирует фактический результат. Не запускайте автоматические повторы с новым Idempotency-Key.
JSON-запрос ограничен 20 000 байтами, а каждый base64-результат — 16 МиБ. Base64 увеличивает объём ответа; декодируйте и удаляйте его из памяти как можно раньше. Endpoint создаёт новое изображение и не принимает входной файл.
Проверьте image-model ID, prompt, n=1–4, size и response_format=b64_json, затем ограничения модели.
Уменьшите n либо пополните баланс или бюджет ключа.
Проверьте историю и повторяйте только неизменный запрос с прежним Idempotency-Key.
Сократите prompt и уберите неподдерживаемые данные; входное изображение сюда не передаётся.
Проверьте историю операции и не создавайте новый платный запрос вслепую.
Декодируйте b64_json без data-URL-префикса, проверьте media_type и не сохраняйте JSON как бинарный файл.