
Стабильные 3D-персонажи через API за $0.143
Постройте рабочий процесс 3D-персонажей с Wan 2.7. Создайте одного персонажа и пять кандидатов сцен за $0.143, рассчитайте стоимость принятых результатов.
Да — API-рабочий процесс для стабильных 3D-персонажей может создать одного персонажа и пять кандидатов сцен менее чем за пятнадцать центов. В тесте от 3 сентября основное изображение завершилось за 32,1 секунды и обошлось в 24 кредита. Второй запрос Wan 2.7 Image вернул пять файлов сцен за 59,0 секунд и 119 кредитов. Итого 143 кредита, или $0.143.[1]
Этот результат имеет важное ограничение. Тест записал статус задачи, количество выходных файлов, время и кредиты — но не включал визуальную оценку. Это тест генерации и стоимости, а не утверждение, что все пять изображений прошли проверку. Руководство ниже показывает, как запустить тот же рабочий процесс и рассчитать стоимость принятого изображения после человеческой проверки.
TL;DR
- Рабочий процесс два раза использует
wan2.7-image: сначала для кандидата персонажа, затем, после одобрения, для пяти связанных сцен. - Групповой режим Wan 2.7 Image активируется флагом
enable_sequential: trueи повышает лимитnс четырёх до двенадцати изображений в одной задаче.[3] - Измеренный расход API: 24 кредита за персонажа + 119 кредитов за пять сцен = 143 кредита ($0.143).[1]
- Скачайте датированный отчёт теста с обоими ID задач, настройками, временем выполнения и окончательными кредитами без привязки к временным URL.
- Пакет из пяти сцен стоил $0.0238 за завершённый кандидат. Включая персонажа, эффективная стоимость $0.0286 за сцену только если персонаж одобрен и все пять сцен прошли проверку.
- "3D-стиль" означает плоские файлы, отрендеренные размерным мультяшным стилем. Этот процесс не создаёт меш, скелет, риг или редактируемую 3D-модель.
- Стабильность не гарантирована. Референсное изображение, фиксированный контракт идентичности, групповая генерация и ворота проверки снижают дрейф; ничего не блокирует персонаж навсегда.
Что измеряет этот тест
Может ли API держать 3D-персонажа стабильным на нескольких сценах и во сколько это обойдётся? Если референс уже определяет персонажа, остаётся автоматизация с проверкой. Завершённая задача и полезный творческий актив — это не одно и то же.
Тест разделяет три числа: завершение API, стоимость за возвращённый кандидат и стоимость за принятую сцену. Первые два из журналов задачи и биллинга. Третье требует, чтобы кто-то посмотрел изображения.
Почему Wan 2.7 Image подходит для набора из пяти сцен
На странице Wan описана последовательная история с до двенадцати изображениями и постоянством субъекта и стиля.[2] Маршрут reAPI прямо это обнажает: установите enable_sequential: true, установите n на количество изображений и запросите одну задачу с упорядоченным массивом URL.[3]
Эта форма запроса даёт одной задаче референс персонажа, контракт идентичности и полный список сцен. Пять независимых вызовов text-to-image пришлось бы заново изучать персонажа по описанию пять раз.
Это выбор рабочего процесса, а не универсальное утверждение качества. Wan предоставляет управление группой и последовательностью, необходимое для этого теста.
Перед первым запросом API
Нужны четыре вещи:
- ключ reAPI в
REAPI_API_KEY; - оригинальный вымышленный персонаж, который вы имеете право использовать;
- краткий список визуальных черт, которые должны пережить каждую сцену;
- место для сохранения одобренных файлов, потому что генерируемые URL временные.
Используйте оригинального персонажа, который вы имеете право воспроизводить, а не знаменитого персонажа или фирменный стиль. Оценить легче.
Для этого теста контракт персонажа специально конкретен:
CHARACTER: an original adult anthropomorphic warm orange fox explorer
FACE: cream muzzle, small notch in the left ear
CLOTHING: teal scarf with exactly two white stripes
ACCESSORIES: round brass goggles on forehead, navy cross-body satchel
ANCHORS: yellow triangle patch on satchel, two dark tail rings, cream tail tip
DO NOT CHANGE: warm orange fur, cream muzzle, ear-notch side, scarf pattern,
goggles, satchel patch, tail markings, compact athletic body proportionsОписания вроде "милый", "кинематографичный" и "премиум" слишком широки для проверки. Царапина на ухе или двухполосный шарф даёт проверяющему что-то наблюдаемое.
Шаг 1: Создайте нейтрального персонажа
Персонаж должен объяснить себя, а не рассказать историю. Используйте ровный свет, простой фон и углы, обнажающие лицо, одежду, сумку и хвост. Сохраняйте запланированное соотношение сторон для набора сцен; в референсном режиме Wan следует последнему соотношению входного изображения.[5]
curl https://reapi.ai/api/v1/images/generations \
-H "Authorization: Bearer $REAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "wan2.7-image",
"prompt": "Original stylized 3D cartoon character reference sheet for an adult anthropomorphic fox explorer. The same character shown in a clean front view and two three-quarter views. Identity anchors: a small notch in the left ear, teal scarf with exactly two white stripes, round brass goggles resting on the forehead, navy cross-body satchel with one yellow triangle patch, two dark rings on the tail and a cream tail tip. Warm orange fur, cream muzzle, compact athletic proportions, friendly alert expression. Neutral warm-gray studio background, soft even product lighting, full body visible, no text, no labels, no logo, no second character, no collage borders.",
"size": "16:9",
"resolution": "1K",
"n": 1,
"watermark": false
}'POST возвращает ID задачи, а не само изображение. Запросите GET /api/v1/tasks/{id} до статуса completed или failed. Запросы статуса не потребляют кредиты.[5]
В продакшене остановитесь и посмотрите персонажа перед генерацией сцен. Отклоните, если три вида не совпадают, якоря отсутствуют, или черта будет трудна для узнавания в другой позе. Измеренный тест продолжался без ворот одобрения, поэтому его персонаж остался завершённым кандидатом.
Шаг 2: Запросите пять связанных сцен
Возьмите первый URL из массива output.image_urls завершённого персонажа и поместите в MASTER_IMAGE_URL. Wan принимает публичные HTTPS-референсы; base64 и data: URL не поддерживаются этим маршрутом.[3]
export MASTER_IMAGE_URL="https://your-temporary-or-hosted-url.example/master.png"
curl https://reapi.ai/api/v1/images/generations \
-H "Authorization: Bearer $REAPI_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<JSON
{
"model": "wan2.7-image",
"prompt": "Use the reference image only to preserve the identity of the original adult fox explorer. Create a connected five-image story sequence, one separate scene per output, in the same polished stylized 3D cartoon rendering language. Preserve all identity anchors exactly: left-ear notch, teal scarf with exactly two white stripes, round brass forehead goggles, navy cross-body satchel with one yellow triangle patch, two dark tail rings, cream tail tip, muzzle shape and body proportions. Scene 1: dawn railway platform, medium-wide view, holding one red paper ticket. Scene 2: sunlit workshop, medium view, repairing a small wooden toy airplane. Scene 3: rainy night market, full-body view, carrying one yellow umbrella. Scene 4: snowy wooden footbridge at dusk, three-quarter view, holding a small warm lantern. Scene 5: rooftop at blue hour, rear three-quarter view with face still visible, looking across the city. One fox only in every image. No text, no logo, no wardrobe change, no extra limbs, no duplicate character, and do not combine scenes into a collage.",
"image_urls": ["$MASTER_IMAGE_URL"],
"size": "16:9",
"resolution": "1K",
"n": 5,
"enable_sequential": true,
"watermark": false
}
JSONГрупповой и редакторский режимы поддерживают вывод до 2K. Опция 4K модели Pro только текст-в-изображение, так что повышение референсного запроса до 4K — неправильная конфигурация.[3]
Шаг 3: Запустите ворота одобрения безопасно в Node.js
Сохраните полный пример ниже как character-series.mjs и используйте Node.js 18 или новее. Первый запуск создаёт только персонажа, печатает и записывает его ID задачи, затем останавливается. Посмотрите это изображение перед установкой APPROVED_MASTER_URL и повторным запуском скрипта для пяти сцен.
Скрипт повторяет переходящие ошибки GET, но никогда не повторяет POST. Если соединение разорвётся во время отправки, поставщик может уже получить запрос; проверьте журнал задачи или панель вместо слепого создания ещё одной платной задачи.
import { appendFile } from 'node:fs/promises';
const baseUrl = 'https://reapi.ai';
const apiKey = process.env.REAPI_API_KEY;
const approvedMasterUrl = process.env.APPROVED_MASTER_URL?.trim();
const taskLogUrl = new URL(
'./character-series-task-ids.jsonl',
import.meta.url,
);
const masterPrompt = process.env.MASTER_PROMPT ??
'Original stylized 3D cartoon character reference sheet for an adult anthropomorphic fox explorer. The same character shown in a clean front view and two three-quarter views. Identity anchors: a small notch in the left ear, teal scarf with exactly two white stripes, round brass goggles resting on the forehead, navy cross-body satchel with one yellow triangle patch, two dark rings on the tail and a cream tail tip. Warm orange fur, cream muzzle, compact athletic proportions, friendly alert expression. Neutral warm-gray studio background, soft even product lighting, full body visible, no text, no labels, no logo, no second character, no collage borders.';
const groupPrompt = process.env.GROUP_PROMPT ??
"Use the reference image only to preserve the identity of the original adult fox explorer. Create a connected five-image story sequence, one separate scene per output, in the same polished stylized 3D cartoon rendering language. Preserve all identity anchors exactly: left-ear notch, teal scarf with exactly two white stripes, round brass forehead goggles, navy cross-body satchel with one yellow triangle patch, two dark tail rings, cream tail tip, muzzle shape and body proportions. Scene 1: dawn railway platform, medium-wide view, holding one red paper ticket. Scene 2: sunlit workshop, medium view, repairing a small wooden toy airplane. Scene 3: rainy night market, full-body view, carrying one yellow umbrella. Scene 4: snowy wooden footbridge at dusk, three-quarter view, holding a small warm lantern. Scene 5: rooftop at blue hour, rear three-quarter view with face still visible, looking across the city. One fox only in every image. No text, no logo, no wardrobe change, no extra limbs, no duplicate character, and do not combine scenes into a collage.";
if (!apiKey) {
throw new Error('Set REAPI_API_KEY before running this script.');
}
for (const [name, value] of [
['MASTER_PROMPT', masterPrompt],
['GROUP_PROMPT', groupPrompt],
]) {
if (!value.trim()) throw new Error(`${name} cannot be empty.`);
}
const headers = {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
};
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function readJson(response) {
const text = await response.text();
if (!text) return {};
try {
return JSON.parse(text);
} catch {
return { raw: text };
}
}
async function submitGeneration(body) {
let response;
try {
response = await fetch(`${baseUrl}/api/v1/images/generations`, {
method: 'POST',
headers,
body: JSON.stringify(body),
});
} catch (error) {
const detail = error instanceof Error ? error.message : String(error);
throw new Error(
`POST outcome is uncertain; do not submit it again automatically. ${detail}`,
);
}
const result = await readJson(response);
if (!response.ok) {
throw new Error(`${response.status}: ${JSON.stringify(result)}`);
}
if (!result.id) {
throw new Error(
'POST returned no task ID; do not resubmit automatically until checked.',
);
}
return result;
}
function retryDelayMs(response, attempt) {
const retryAfter = response?.headers.get('retry-after');
if (retryAfter) {
const seconds = Number(retryAfter);
if (Number.isFinite(seconds)) return Math.max(0, seconds * 1000);
const retryAt = Date.parse(retryAfter);
if (Number.isFinite(retryAt)) return Math.max(0, retryAt - Date.now());
}
return Math.min(1000 * (2 ** Math.min(attempt, 5)), 30000);
}
async function getTaskWithRetry(id, attempt) {
let response;
try {
response = await fetch(`${baseUrl}/api/v1/tasks/${id}`, { headers });
} catch (error) {
const delay = retryDelayMs(null, attempt);
console.warn(`Task GET failed; retrying in ${delay}ms.`);
await sleep(delay);
return null;
}
if (response.status === 429 || response.status >= 500) {
const delay = retryDelayMs(response, attempt);
await response.text();
console.warn(`Task GET returned ${response.status}; retrying in ${delay}ms.`);
await sleep(delay);
return null;
}
const task = await readJson(response);
if (!response.ok) {
throw new Error(`${response.status}: ${JSON.stringify(task)}`);
}
return task;
}
async function waitForTask(id, timeoutMs = 10 * 60 * 1000) {
const deadline = Date.now() + timeoutMs;
let transientAttempt = 0;
while (Date.now() < deadline) {
const task = await getTaskWithRetry(id, transientAttempt);
if (!task) {
transientAttempt += 1;
continue;
}
transientAttempt = 0;
if (task.status === 'completed') return task;
if (task.status === 'failed') {
console.error(JSON.stringify({
taskId: id,
status: task.status,
usageCredits: task.usage?.credits ?? null,
error: task.error ?? null,
}, null, 2));
throw new Error(`Task ${id} failed; see the record above.`);
}
await sleep(5000);
}
throw new Error(
`Polling timed out for ${id}. The task was not cancelled; resume GET polling instead of submitting another POST.`,
);
}
async function recordSubmission(stage, taskId) {
const record = {
stage,
taskId,
submittedAt: new Date().toISOString(),
};
console.log(`Submitted ${stage}: ${taskId}`);
try {
await appendFile(taskLogUrl, `${JSON.stringify(record)}\n`, 'utf8');
} catch (error) {
console.warn(`Could not write ${taskLogUrl.pathname}; keep task ID ${taskId}.`);
}
}
function requirePublicHttpsUrl(value) {
let parsed;
try {
parsed = new URL(value);
} catch {
throw new Error('APPROVED_MASTER_URL must be a valid public HTTPS URL.');
}
if (parsed.protocol !== 'https:') {
throw new Error('APPROVED_MASTER_URL must use HTTPS.');
}
}
async function main() {
if (!approvedMasterUrl) {
const submission = await submitGeneration({
model: 'wan2.7-image',
prompt: masterPrompt,
size: '16:9',
resolution: '1K',
n: 1,
watermark: false,
});
await recordSubmission('character_master', submission.id);
const task = await waitForTask(submission.id);
const masterUrl = task.output?.image_urls?.[0];
if (!masterUrl) throw new Error('Master task returned no image URL.');
console.log(JSON.stringify({
nextStep: 'Review this master. Rerun only after setting APPROVED_MASTER_URL.',
masterTaskId: task.id,
usageCredits: task.usage?.credits ?? null,
masterUrl,
}, null, 2));
return;
}
requirePublicHttpsUrl(approvedMasterUrl);
const submission = await submitGeneration({
model: 'wan2.7-image',
prompt: groupPrompt,
image_urls: [approvedMasterUrl],
size: '16:9',
resolution: '1K',
n: 5,
enable_sequential: true,
watermark: false,
});
await recordSubmission('five_scene_group', submission.id);
const task = await waitForTask(submission.id);
const sceneUrls = task.output?.image_urls ?? [];
console.log(JSON.stringify({
groupTaskId: task.id,
usageCredits: task.usage?.credits ?? null,
returnedSceneCount: sceneUrls.length,
sceneUrls,
}, null, 2));
}
main().catch((error) => {
console.error(error instanceof Error ? error.message : error);
process.exitCode = 1;
});Запустите node character-series.mjs первым. После проверки персонажа повторно запустите с APPROVED_MASTER_URL="https://..." node character-series.mjs. Скрипт пишет ID задач в character-series-task-ids.jsonl; результаты содержат окончательные usageCredits. Можете переопределить встроенные подсказки через MASTER_PROMPT или GROUP_PROMPT, но пустое значение отклоняется.
В n8n соблюдайте ту же границу: основная ветка должна заканчиваться шагом человеческой проверки, одобренный URL входит только в ветку групповой генерации.
Что вернул измеренный API тест
Два запроса завершились так:[1]
| Этап | ID задачи | Время | Кредиты | Файлов возвращено |
|---|---|---|---|---|
| Персонаж | task_01a065451919736985878cfcbd2eb8a8 | 32,1s | 24 | 1 |
| Пять сцен | task_01a06545f23474bca896f6b98ee252bc | 59,0s | 119 | 5 |
| Итого | — | — | 143 | 6 включая персонажа |
Это два наблюдаемых времени задачи, не латентный тест. Ничего не говорит о производительности p95, другом регионе, другом промпте или будущей пропускной способности. URL выходных файлов опущены, потому что они временные.
Главное: "файлов: 5" означает пять завершённых кандидатов. Это не доказывает, что каждый кандидат правильно изображает лису, соответствует задуманной сцене или избегает визуальных дефектов.
Как проверять персонажа сцена за сценой
Откройте персонажа рядом с каждой сценой. Не судите по миниатюрам; рассмотрите лицо, одежду, аксессуары, силуэт и действие при полезном увеличении.
| Область проверки | Условие принятия | Типичный отказ |
|---|---|---|
| Мех, лицо, вид | Оранжевый мех, кремовая морда и пропорции совпадают | Цвет меха смещается или лицо становится другим видом |
| Якорь левого уха | Царапина остаётся на левом ухе, когда оно видно | Царапина исчезает или меняет сторону |
| Шарф | Цвет сохраняется и две белые полосы на месте | Цвет смещается, количество полос меняется, шарф исчезает |
| Очки и пропорции | Очки остаются на лбу; тело соответствует | Очки сдвигаются на глаза или тело переделано |
| Сумка | Сумка и жёлтый патч остаются на месте | Патч меняет форму или сумка переходит на другую сторону |
| Хвост | Два тёмных кольца и кремовый кончик видны | Отметины меняются между полнофигурными сценами |
| Инструкция сцены | Обстановка, предметы, действие и кадр совпадают | Две сцены сливаются или выход становится коллажем |
| Структурное качество | Нет дублирующихся конечностей, слитых предметов | Зонт, руки или хвост сливаются с телом |
Отметьте якорь N/A, если кадр его скрывает. Не одобряйте скрытую черту, но и не называйте её ошибкой. Изображение принимается только если все видимые якори верны, сцена присутствует и нет крупных структурных дефектов.
Эта рубрика специально простая. Автоматическая визуальная оценка может помочь отсортировать большой пакет, но не должна молча заменять решение о выпуске.
Рассчитайте стоимость завершённого и принятого изображения
Текущая ставка Wan 2.7 Image — $0.0238 за Standard-изображение на reAPI. Кредиты оседают один раз в итоге задачи и округляются: ceil($0.0238 × 1 × 1,000) = 24 для персонажа, ceil($0.0238 × 5 × 1,000) = 119 для группы.[3][4]
Для этого запуска:
стоимость кандидата группы = $0.119 / 5 = $0.0238
стоимость проекта = $0.024 + $0.119 = $0.143
стоимость за принятое = $0.143 / число принятых сцен| Принято из пяти кандидатов | Эффективная стоимость сцены |
|---|---|
| 5 | $0.0286 |
| 4 | $0.0358 |
| 3 | $0.0477 |
| 2 | $0.0715 |
| 1 | $0.1430 |
Если ничего не прошло, проект не выпустил ни одного изображения, и фигура за принятое остаётся неопределённой. $0.143 учитывает только генерацию. Хранилище, оркестровка, проверка и позже анимация входят в полный продакшен-бюджет.
Ставки меняются. Эти цифры проверены и протестированы 3 сентября 2026; используйте живую страницу модели Wan 2.7 Image перед размещением цены в своём продукте.
Исправьте самую маленькую сломанную часть
Если персонаж неправильный, остановитесь и переделайте. Платить за пять сцен на основе слабой основы только умножает проблему.
Если одна сцена теряет предмет но персонаж стабилен, попробуйте одиночную замену n: 1 с более коротким промптом. При тестовой ставке это добавляет примерно 24 кредита. Если несколько кадров переделывают персонажа, переделайте основу или удалите конфликтующие инструкции, затем повторите группу.
Документация Wan говорит, что отклонённые запросы не платят. Всё равно читайте usage.credits в каждой терминальной задаче: API позволяет положительное значение при отказе, если модель-специфический полис сохраняет постгенерационный заряд.[3][5] Завершённое изображение, которое ваша команда творчески отклоняет, всё равно платит. Вот почему стоимость принятого — полезная метрика.
Как только сцена прошла, сохраните её с ID задачи, версией промпта, версией референса и результатом. URL-ы истекают, поэтому переместите одобренные материалы в ваше хранилище поскорее.[3]
Типичные ошибки новичков
Генерировать каждую сцену с текста. Повтор описания не делает пять выборок единым персонажем. Переиспользуйте пиксели.
Менять персонаж внутри промптов. "Добавь зимнее пальто" — резонный поворот, но теряет якорь. Сначала тестируйте стабильность, потом меняйте.
Слишком много референсов. Противоречивые референсы дают модели разные ответы. Начните с одного.
Считать завершённое полезным. Завершение — системный статус. Творческое одобрение — решение проверяющего.
Публиковать только цену. Уточните, включена ли персонаж, переделки, хранилище и проверка.
Часто спрашивают
Эта API создаёт настоящую 3D-модель?
Нет. Возвращает файлы с 3D-стилем. Не возвращает меш, риг, текстуры, скелет или редактируемую сцену.
Wan 2.7 гарантирует одного персонажа?
Нет. Группа и референс помогают, но не создают постоянный ID. Каждая сцена требует проверки.
Сколько стоили пять сцен?
Группа использовала 119 кредитов ($0.119) и вернула пять кандидатов. Персонаж отдельно — 24 кредита. Итого $0.143.[1]
Почему не просто $0.0238 за изображение?
$0.0238 — это группа за кандидат. Проект нужен персонаж, и некоторые могут не пройти. Делите итоговый расход на число принятых.
Могу ли я использовать свой референс персонажа?
Да, если он у вас есть и доступен по публичному HTTPS-URL. Wan принимает до девяти референсов, но один чистый — обоснованно.[3]
Должен ли я использовать одинаковое семя?
Wan обнажает seed, но это не блокировка. Для ряда важнее референс и групповой запрос. Повторное семя при изменённых входах не гарантирует одно лицо.
Могу ли я создать больше пяти?
Да. С enable_sequential: true, n до двенадцати. Начните меньше — рецензия растёт.
Как сделать видео?
Используйте каждую сцену как стартовый кадр для image-to-video. Гид GPT Image 2 + Seedance 2.0 объясняет анимацию отдельно — отделение предотвращает переделку.
Запишите, что вы выпустите
Запись содержит персонажа, группу из пяти, шесть файлов и $0.143. Нет творческой ставки, потому что оценка вне теста.
Разделите завершение, стоимость и одобрение. После рубрики делите итог на число выпущенных.
Для полной схемы, лимитов и актуального биллинга см. документацию Wan 2.7 Image.
Ссылки
- reAPI. Wan 2.7 Image character-series test
record.
September 3, 2026. Master task
task_01a065451919736985878cfcbd2eb8a8; group tasktask_01a06545f23474bca896f6b98ee252bc. - Alibaba Wan. Wan official product page — Multi-Image Editing and Sequential Storytelling. Retrieved September 3, 2026. wan.video
- reAPI. Wan 2.7 Image API — group mode, reference inputs, resolution limits, task response, and errors. Retrieved September 3, 2026. reapi.ai/docs/wan-2-7-image
- reAPI. Wan 2.7 Image live model page and price estimator. Retrieved September 3, 2026. reapi.ai/models/wan-2-7-image
- reAPI. Tasks API — asynchronous status and polling behavior. Retrieved September 3, 2026. reapi.ai/docs/api/tasks
Further reading
- reAPI. GPT Image 2 + Seedance 2.0: A Character Consistency Workflow. Read the video workflow
- reAPI. AI Image Generation Cost vs Video: 2–9x More Per Frame. Read the cost analysis
Автор

Категории
Ещё статьи

Альтернативы Together AI в 2026: сравнение 5 сервисов
Ищете аналоги Together AI в 2026 году? Сравниваем OpenRouter, Replicate, RunPod, Hugging Face и reAPI по каталогу моделей, ценам, скорости и дизайну API.


DeepSeek Harness и OpenAI-совместимый API: кэширование
Интеграция DeepSeek Harness с OpenAI-совместимым API: выбор Flash или Pro, проверка вызовов инструментов и расчёт стоимости кэшированных агентских циклов.


Лучшие модели видео с открытым кодом для локальных GPU (2026)
Сравниваем Wan 2.2, HunyuanVideo-1.5, CogVideoX1.5 и Mochi 1 по объёму памяти GPU, качеству выходных видео, лицензии, скорости и ограничениям развёртывания.
