promptstringОбязательноОбязательное описание сцены для Sunburst длиной до 5 000 символов; готового текста по умолчанию нет. Очень длинные промпты требуют небольшой доплаты за токен.
- По умолчанию
- Не задано
- Ограничения
- minLength:1maxLength:5000
GPT Image 2.6 Sunburst создаёт новое изображение по описанию сцены; качество и разрешение выбираются независимо.
Примеры используют публичные параметры выбранного эндпоинта. Замените API-ключ и примеры медиафайлов, затем отправьте запрос со своего сервера.
SDK и интеграцииhttps://api.spicyapi.ai/api/v1/jobs/createTaskХраните API-ключ в серверной переменной окружения SPICY_API_KEY. Используйте Bearer-аутентификацию и Content-Type: application/json для JSON-запросов.
Authorization: Bearer $SPICY_API_KEY# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "openai/gpt-image-2.6-sunburst/text-to-image",
"input": {
"prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
"quality": "medium",
"background": "auto",
"resolution": "1k",
"num_outputs": 1,
"aspect_ratio": "1:1"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Пример построен по входной схеме этой модели — той же, по которой API проверяет каждый запрос.
Поместите эти поля в объект input тела запроса. Имена и типы соответствуют API. Не предполагайте значение по умолчанию, если оно не задано.
promptstringОбязательноОбязательное описание сцены для Sunburst длиной до 5 000 символов; готового текста по умолчанию нет. Очень длинные промпты требуют небольшой доплаты за токен.
output_qualityintegerНеобязательноЗадайте сжатие JPEG или WebP для Sunburst от 0 до 100: чем выше значение, тем больше деталей и тяжелее файл, PNG и GIF его игнорируют, а цена Sunburst не меняется.
frame_duration_msintegerНеобязательноSunburst: frame_duration_ms задаёт от 20 до 2000 мс на кадр, по умолчанию 200 мс.
frame_countintegerНеобязательноВлияет на ценуSunburst: frame_count задаёт от 2 до 16 кадров, по умолчанию 9; верхний предел зависит от выбранного размера кадра.
output_formatstringНеобязательноSunburst возвращает png по умолчанию, также доступны jpeg, webp и gif; анимированный GIF поддерживается только при генерации по тексту и несовместим с прозрачным фоном.
"png""jpeg""webp""gif"backgroundstringНеобязательноSunburst поддерживает auto, opaque и transparent; прозрачность требует PNG или WebP и недоступна для GIF.
"auto""transparent""opaque"num_outputsintegerНеобязательноВлияет на ценуЗапросите у Sunburst 1–10 изображений за раз; число по умолчанию здесь не указано, каждый результат оплачивается.
reasoning_effortstringНеобязательноSunburst: reasoning_effort принимает low, medium и high (по умолчанию, если параметр пропущен); задаёт глубину планирования перед отрисовкой, а повышение помогает с плотным текстом и сложными макетами, увеличивает время, но не стоимость.
"low""medium""high"qualitystringНеобязательноВлияет на ценуВыберите детализацию Sunburst: low, medium (по умолчанию), high, xhigh или max; повышение уровня добавляет детали, время отрисовки и стоимость.
"low""medium""high""xhigh""max"resolutionstringНеобязательноВлияет на ценуSunburst: для статичных изображений доступны 1k, 2k и 4k; для GIF параметр resolution задаёт размер одного кадра: 512 (около 0,26 МП) допускает до 16 кадров, а 768 (около 0,59 МП) — до 12.
"1k""2k""4k""512""768"aspect_ratiostringНеобязательноSunburst использует 1:1 по умолчанию для статичных изображений и предлагает 15 соотношений от 1:3 до 3:1; для GIF обязательно укажите aspect_ratio.
"1:1""16:9""9:16""4:3""3:4""3:2""2:3""21:9""9:21""2:1""1:2""3:1""1:3""5:4""4:5"{
"type": "object",
"required": [
"prompt"
],
"x-pricing": {
"billingMode": "formula",
"variantFields": [
"quality",
"resolution"
]
},
"properties": {
"prompt": {
"type": "string",
"x-ui": {
"order": 100,
"widget": "textarea"
},
"maxLength": 5000,
"minLength": 1,
"description": "Describe the picture: subject, setting, light and any short text to render in quotes."
},
"quality": {
"enum": [
"low",
"medium",
"high",
"xhigh",
"max"
],
"type": "string",
"x-ui": {
"order": 76,
"widget": "select",
"affects_price": true
},
"default": "medium",
"description": "Rendering quality. Higher tiers add detail, time and cost."
},
"background": {
"enum": [
"auto",
"transparent",
"opaque"
],
"type": "string",
"x-ui": {
"order": 50,
"widget": "radio"
},
"default": "auto",
"description": "Background treatment. Transparent needs PNG or WebP output."
},
"resolution": {
"enum": [
"1k",
"2k",
"4k",
"512",
"768"
],
"type": "string",
"x-ui": {
"order": 78,
"widget": "radio",
"affects_price": true
},
"default": "1k",
"description": "Output size tier: 1k is about 1 megapixel, 2k about 3.7, 4k about 8.3. For GIF output use 512 or 768, the size of one frame."
},
"frame_count": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 19,
"widget": "slider",
"affects_price": true
},
"maximum": 16,
"minimum": 2,
"description": "Number of frames in a GIF, 2 to 16 (default 9). Every 8 frames are billed as one more frame sheet. Only with gif output."
},
"num_outputs": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 60,
"widget": "slider",
"affects_price": true
},
"default": 1,
"maximum": 10,
"minimum": 1,
"description": "How many images to return, each billed separately."
},
"aspect_ratio": {
"enum": [
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3",
"21:9",
"9:21",
"2:1",
"1:2",
"3:1",
"1:3",
"5:4",
"4:5"
],
"type": "string",
"x-ui": {
"order": 80,
"widget": "select"
},
"default": "1:1",
"description": "Output aspect ratio."
},
"output_format": {
"enum": [
"png",
"jpeg",
"webp",
"gif"
],
"type": "string",
"x-ui": {
"order": 20,
"widget": "select"
},
"default": "png",
"description": "File format of the returned images. gif returns an animated loop; describe the motion in the prompt."
},
"output_quality": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 15,
"widget": "slider"
},
"maximum": 100,
"minimum": 0,
"description": "Compression quality for JPEG and WebP output, from 0 to 100."
},
"reasoning_effort": {
"enum": [
"low",
"medium",
"high"
],
"type": "string",
"x-ui": {
"order": 74,
"widget": "select"
},
"description": "How much the model plans the picture before drawing. Higher helps dense text and complex layouts and takes longer; the price does not change. Leave it unset for the model default (high)."
},
"frame_duration_ms": {
"type": "integer",
"x-ui": {
"step": 10,
"unit": "ms",
"order": 18,
"widget": "slider"
},
"maximum": 2000,
"minimum": 20,
"description": "How long each GIF frame stays on screen, 20 to 2000 milliseconds (default 200). Only with gif output."
}
},
"additionalProperties": false
}HTTP 202 означает принятие задачи, а не завершение генерации. Сохраните полученный taskId и проверяйте эту задачу. Не создавайте новую, пока ждёте результат.
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3
{
"code": 200,
"msg": "success",
"request_id": "req_example_create",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"state": "queued",
"estimatedCost": "0.750000"
}
}В ответе о приёме есть оценка стоимости — приложение сможет показать ту же сумму в истории задач и в расчётах.
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
--data-urlencode "taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Начните с интервала около 2 секунд и постепенно увеличивайте его. Прекратите опрос при конечном состоянии. После сбоя соединения используйте исходный taskId. Повторно создавать задачу можно только с исходным ключом идемпотентности и исходным телом запроса.
import { verifyWebhook } from "@spicyapi/sdk";
// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
const { payload } = verifyWebhook({
rawBody: req.body,
timestamp: req.header("X-Webhook-Timestamp"),
signature: req.header("X-Webhook-Signature"),
payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
secret: process.env.SPICY_WEBHOOK_SECRET,
});
res.status(200).end();
void handleFinishedTask(payload);
});Передайте callBackUrl при создании задачи — готовая запись придёт к вам POST-запросом, и никакого опроса не понадобится. В каждой доставке есть X-Webhook-Timestamp, X-Webhook-Signature и X-Webhook-Payload-Version. Подпись — это HMAC-SHA256 в base64 от taskId.timestamp.sha256(body), поэтому проверять её нужно по исходным байтам: если разобрать JSON и сериализовать заново, байты изменятся и проверка не пройдёт. Неудачные доставки повторяются, так что один и тот же taskId может прийти дважды — сделайте обработчик идемпотентным. Сначала ответьте 2xx, работу выполняйте после: медленный обработчик считается неудачной доставкой.
Обрабатывайте output только при state, равном succeeded. При ошибке проверьте errorCode, errorMessage и request_id. Стоимость и состояния в примерах не являются фактическим счётом.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "openai/gpt-image-2.6-sunburst/text-to-image",
"state": "succeeded",
"output": {
"assets": [
{
"key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
"mime": "image/png",
"url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
"expiresAt": "2026-08-28T12:20:08.000Z"
}
]
},
"cost": "0.750000",
"settled": true,
"createdAt": "2026-08-28T12:00:00Z",
"completedAt": "2026-08-28T12:00:30Z"
}
}Доступные файлы можно открыть или скачать по assets[].url без заголовка API Authorization. Подписанная ссылка действует до expiresAt. Чтобы обновить её, повторно запросите задачу в течение срока хранения файла. У ожидающих или недоступных файлов URL отсутствует. Не передавайте подписанные ссылки посторонним.
Используйте SpicyAPI в приложении, терминале, ИИ-ассистенте или визуальном процессе. Выберите руководство по настройке.
Писать код выше вовсе не обязательно. Подключите сервер MCP один раз — и любой агент, который говорит на MCP (Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat), вызовет эту модель по имени. Либо запустите её из терминала одной командой.
Возьми openai/gpt-image-2.6-sunburst/text-to-image и сгенерируй портрет танцовщицы в неоновом свете, сохрани в ./out/.
Агент найдёт модель в каталоге, сам загрузит локальный файл, покажет точную смету и предельную сумму списания — и дождётся вашего согласия. До этого ничего не списывается.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillПервая строка даёт агенту инструменты, вторая — Skill, то есть правила обращения с ними: сначала смета, потом списание; локальные файлы загружать, а не вставлять байтами; URL готового результата читать, а не угадывать. Остальные клиенты подключают тот же сервер через собственный файл настроек — см. раздел для разработчиков.
npx @spicyapi/cli tasks create --model openai/gpt-image-2.6-sunburst/text-to-image \
--input-json '{"prompt":"A ceramic teapot on a linen cloth, soft window light, muted palette","quality":"medium","background":"auto","resolution":"1k","num_outputs":1,"aspect_ratio":"1:1"}' \
--waitВходные данные взяты из схемы этого эндпоинта — той же, что и в примерах выше. --wait дождётся завершения задачи и выведет её, а --yes пропустит подтверждение в CI. Сначала задайте SPICY_API_KEY: один ключ работает и для API, и для CLI, и для сервера MCP.
npx @spicyapi/cli tasks create --model openai/gpt-image-2.6-sunburst/text-to-image \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that appliedКлюч --retention только сокращает срок — 30m, 1h, 7d или 0, чтобы удалить сразу после перехода задачи в конечное состояние. Реально действует наименьшее из трёх: ваш запрос, настройки аккаунта и предел платформы, — поэтому считайте его из записи задачи, а не исходите из того, что запрошенное число применилось. Запросить срок больше разрешённого аккаунтом нельзя: это ничего не изменит.
Установите узлы SpicyAPI через ComfyUI Manager или командой ниже и найдите на холсте GPT Image 2.6 Sunburst · Text to Image. У узла те же параметры, что и на этой странице, а цена показывается до запуска.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiВстроенная панель читает ту же схему, что и эта страница, поэтому не может разойтись с API. Если содержимое должно индексироваться поиском по документации, возьмите JSON из /api/embed/models/ и отрисуйте его самостоятельно.
<iframe src="https://spicyapi.ai/embed/ru/models/gpt-image-2-6-sunburst/api?model=openai%2Fgpt-image-2.6-sunburst%2Ftext-to-image" width="100%" height="560" loading="lazy" title="Пример запроса" style="border:1px solid rgba(0,0,0,.12)"></iframe>