Асинхронная очередь
Submit возвращает requestId сразу. Прогресс — через polling каждые 2 секунды.
Полный код
const NA_API_KEY = process.env.NA_API_KEY
const BASE = 'https://api.neuroartist.ru'
async function runAsync(modelId, input) {
// 1. Submit
const submit = await fetch(`${BASE}/queue/${modelId}`, {
method: 'POST',
headers: { Authorization: `Bearer ${NA_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(input)
}).then(r => r.json())
if (!submit.requestId) throw new Error(`Submit failed: ${submit.message ?? submit.code}`)
// 2. Poll until terminal state
while (true) {
const status = await fetch(
`${BASE}/queue/${modelId}/requests/${submit.requestId}/status`,
{ headers: { Authorization: `Bearer ${NA_API_KEY}` } }
).then(r => r.json())
if (status.state === 'completed') break
if (status.state === 'failed') throw new Error(status.error ?? 'Generation failed')
await new Promise(r => setTimeout(r, 2000))
}
// 3. Fetch result
return fetch(
`${BASE}/queue/${modelId}/requests/${submit.requestId}`,
{ headers: { Authorization: `Bearer ${NA_API_KEY}` } }
).then(r => r.json())
}
const result = await runAsync('flux/dev', {
prompt: 'editorial portrait',
image_size: 'portrait_4_3'
})
console.log(result.images[0].url)Эндпоинты в очереди
POST /queue/{modelId}— отправляет задачу, возвращаетrequestId.GET /queue/{modelId}/requests/{id}/status— статус:in_queue→in_progress→completed|failed.GET /queue/{modelId}/requests/{id}— финальный результат, можно перечитывать.PUT /queue/{modelId}/requests/{id}/cancel— отмена с возвратом средств.
Параллельные запросы
const ids = await Promise.all([
submit({ prompt: 'red flower' }),
submit({ prompt: 'blue flower' }),
submit({ prompt: 'yellow flower' })
])
const results = await Promise.all(ids.map(waitForCompletion))Отмена
curl -X PUT https://api.neuroartist.ru/queue/flux/dev/requests/req_abc/cancel \
-H "Authorization: Bearer na_live_xxxx"Деньги возвращаются (refund-транзакция).
Дальше
/queueв справочнике — все методы async-очереди.