
일관된 3D 캐릭터 이미지 API $0.143에 구현
Wan 2.7을 사용하여 마스터 이미지와 5개의 장면 후보를 $0.143에 생성하는 일관된 3D 스타일 캐릭터 이미지 생성 API 워크플로우 완전 가이드.
가능합니다. 일관된 3D 스타일 캐릭터 이미지를 생성하는 API 워크플로우는 하나의 마스터 이미지와 5개의 장면 후보를 15센트 이하로 제작할 수 있습니다. 9월 3일 테스트에서 마스터 이미지는 24크레딧으로 32.1초 만에 완성되었습니다. 두 번째 Wan 2.7 이미지 요청은 119크레딧으로 59.0초 만에 5개의 장면 파일을 반환했습니다. 총합은 143크레딧, 즉 $0.143입니다.[1]
이 결과에는 중요한 제한이 있습니다. 이 테스트는 작업 상태, 출력 수, 타이밍 및 크레딧을 기록했지만 시각적 검토는 포함하지 않았습니다. 따라서 이것은 생성 및 비용 측정 테스트이며 5개의 이미지가 캐릭터 검토를 통과했다는 주장이 아닙니다. 아래 튜토리얼은 동일한 워크플로우를 실행하고 사용자가 결과를 검토한 후 승인된 이미지당 비용을 계산하는 방법을 보여줍니다.
TL;DR
- 워크플로우는
wan2.7-image를 두 번 사용합니다. 한 번은 마스터 캐릭터 후보용이고 승인 후 다시 한 번 5개 이미지 시리즈용입니다. - Wan 2.7 이미지 그룹 모드는
enable_sequential: true로 활성화됩니다.n제한은 4개에서 12개 이미지로 증가합니다.[3] - 측정된 API 요금은 **마스터 24크레딧 + 5개 장면 119크레딧 = 143크레딧($0.143)**입니다.[1]
- 날짜가 지정된 테스트 레코드를 다운로드하세요. 두 작업 ID, 설정, 완성 시간 및 확정 크레딧이 나열되어 있으며 임시 출력 URL에 의존하지 않습니다.
- 5개 장면 배치 비용은 완성된 후보당 $0.0238입니다. 마스터를 포함하면 마스터가 승인되고 5개 장면 모두가 검토를 통과한 경우에만 유효 비용은 장면당 $0.0286입니다.
- "3D 스타일"은 3차원 카툰 모양으로 렌더링된 플랫 이미지 파일을 의미합니다. 이 워크플로우는 메시, 스켈레톤, 리그 또는 편집 가능한 3D 모델을 생성하지 않습니다.
- 일관성은 보장되지 않습니다. 참조 이미지, 고정된 ID 계약, 그룹 생성 및 검토 게이트는 편차를 줄입니다. 어떤 것도 영구적인 캐릭터 잠금이 아닙니다.
일관된 캐릭터 API 테스트가 답하는 것
API로 같은 3D 스타일의 카툰 캐릭터를 여러 장면에서 일관되게 유지할 수 있을까요? 이미지 한 장이나 배치 하나에는 얼마가 들까요? 참조 이미지가 이미 캐릭터를 정의했다면 남은 과제는 사람의 검토 단계를 유지하면서 과정을 자동화하는 것입니다. 작업이 완료됐다고 해서 결과물이 바로 쓸 만하다는 뜻은 아닙니다.
따라서 이 테스트는 API 작업 완료 여부, 반환된 후보 한 장당 비용, 검토를 통과한 장면 한 장당 비용을 따로 기록합니다. 앞의 두 값은 작업 및 청구 기록에서 확인할 수 있지만, 마지막 값은 실제 이미지를 검토해야 계산할 수 있습니다.
5개 장면 캐릭터 세트에 Wan 2.7 이미지가 적합한 이유
Wan의 공식 제품 페이지는 최대 12개 이미지와 주제/스타일 연속성을 사용한 시퀀셜 스토리텔링을 설명합니다.[2] reAPI 라우트는 해당 기능을 직접 노출합니다. enable_sequential을 true로 설정하고 n을 이미지 수로 설정한 다음 순서가 지정된 URL 배열에 대해 하나의 작업을 폴링합니다.[3]
이 요청 형태는 하나의 작업에 캐릭터 참조, ID 계약 및 전체 장면 목록을 제공합니다. 5개의 관련 없는 텍스트-이미지 호출은 5번 산문에서 캐릭터를 다시 발견해야 합니다.
이것은 워크플로우 선택이며 보편적인 품질 주장이 아닙니다. Wan은 이 테스트에 필요한 그룹 시리즈 제어를 제공합니다.
첫 번째 API 요청을 하기 전에
4가지가 필요합니다.
REAPI_API_KEY에 저장된 reAPI 키.- 사용할 권리가 있는 원본 허구 캐릭터.
- 모든 장면에서 생존해야 하는 시각적 특성의 짧은 목록.
- 생성된 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"귀여운," "영화 같은," "프리미엄" 같은 설명은 감시하기에 너무 광범위합니다. 귀 노치 또는 2개 줄무늬 스카프는 검토자에게 관찰 가능한 것을 제공합니다.
단계 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를 반환합니다. 상태가 completed 또는 failed가 될 때까지 GET /api/v1/tasks/{id}를 폴링합니다. 폴링은 크레딧을 소비하지 않습니다.[5]
프로덕션 워크플로우에서는 여기서 멈추고 시리즈를 생성하기 전에 마스터를 검사합니다. 세 가지 보기가 일치하지 않거나 앵커가 누락되었거나 기능이 다른 포즈에서 인식하기 어려운 경우 거부합니다. 측정된 테스트는 시각적 승인 게이트 없이 계속되었으므로 마스터는 완성된 후보로 남아 있습니다.
단계 2: 5개의 연결된 장면 요청
완성된 마스터의 output.image_urls 배열에서 첫 번째 URL을 가져와 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 출력을 지원합니다. Pro 모델의 4K 옵션은 텍스트-이미지만 가능하므로 이 참조 기반 요청을 4K로 올리는 것은 잘못된 구성입니다.[3]
단계 3: Node.js에서 승인 게이트를 안전하게 실행
아래의 전체 예를 character-series.mjs로 저장하고 Node.js 18 이상을 사용합니다. 첫 번째 실행은 마스터만 생성하고 작업 ID를 출력 및 기록한 다음 중지합니다. 그 이미지를 검토한 후 APPROVED_MASTER_URL을 설정하고 5개 장면 그룹에 대해 스크립트를 다시 실행합니다.
스크립트는 일시적인 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 실행이 반환한 것
2개의 요청은 다음과 같이 완성되었습니다.[1]
| 단계 | 작업 ID | 시간 | 크레딧 | 반환된 파일 |
|---|---|---|---|---|
| Character master | task_01a065451919736985878cfcbd2eb8a8 | 32.1s | 24 | 1 |
| Five-scene group | task_01a06545f23474bca896f6b98ee252bc | 59.0s | 119 | 5 |
| Total | — | — | 143 | 6 including master |
이들은 2개의 관찰된 작업 시간이며 레이턴시 벤치마크가 아닙니다. p95 성능, 다른 지역, 다른 프롬프트 또는 향후 용량에 대해 아무 말도 하지 않습니다. 출력 URL도 임시이므로 생략됩니다.
가장 중요한 것은 "files returned: 5"는 5개의 완성된 후보를 의미합니다. 모든 출력이 여우를 올바르게 표현하거나 의도한 장면에 매핑되거나 시각적 결함을 피하는지 증명하지 않습니다.
장면별로 캐릭터 일관성을 검토하는 방법
마스터를 각 장면 옆에 놓습니다. 작은 썸네일에서 판단하지 마세요. 얼굴, 의류, 액세서리, 실루엣 및 요청된 액션을 유용한 줌에서 검사합니다.
| 검토 영역 | 합격 조건 | 전형적인 실패 |
|---|---|---|
| Fur, face, and species | Warm orange fur, cream muzzle, and fox proportions match | Fur color drifts or the face becomes another species |
| Left-ear anchor | Notch remains on the left ear when that ear is visible | Notch disappears or swaps sides |
| Scarf | Teal color and two white stripes remain | Color shifts, stripe count changes, scarf vanishes |
| Goggles and proportions | Brass goggles stay on the forehead; body proportions match | Goggles move to the eyes or the body is redesigned |
| Satchel | Navy cross-body satchel and yellow triangle patch remain | Patch changes shape or the satchel changes sides without cause |
| Tail | Two dark rings and cream tip remain when visible | Markings change between full-body scenes |
| Scene instruction | Setting, prop, action, and framing match the assigned scene | Two scenes merge or an output becomes a collage |
| Structural quality | No duplicate limbs, fused props, or extra main character | Umbrella, hands, or tail merge into the body |
앵커가 실제로 프레이밍을 숨기는 경우 N/A로 표시합니다. 숨겨진 특성에 대해 합격을 주지 마세요. 하지만 그것을 모순이라고 부르지도 마세요. 이미지는 모든 보이는 ID 앵커가 올바르고 요청된 장면이 있으며 주요 구조적 결함이 없을 때만 수락됩니다.
이 루브릭은 의도적으로 단순합니다. 자동화된 비전 점수는 큰 배치를 정렬하는 데 도움이 될 수 있지만 새 캐릭터에 대한 릴리스 결정을 조용히 대체해서는 안 됩니다.
완성 및 승인된 이미지당 비용 계산
현재 Wan 2.7 이미지 레이트는 reAPI의 생성된 표준 이미지당 $0.0238입니다. 크레딧은 작업 합계에서 한 번에 확정되고 전체 크레딧으로 올림됩니다.
ceil($0.0238 × 1 × 1,000) = 24 마스터용, ceil($0.0238 × 5 × 1,000) = 119 그룹용.[3][4]
이 실행의 경우:
group candidate cost = $0.119 / 5 = $0.0238
project cost = $0.024 + $0.119 = $0.143
accepted-image cost = $0.143 / accepted scene count| 5개 후보에서 승인된 장면 | 승인된 장면당 유효 비용 |
|---|---|
| 5 | $0.0286 |
| 4 | $0.0358 |
| 3 | $0.0477 |
| 2 | $0.0715 |
| 1 | $0.1430 |
아무 것도 합격하지 못하면 프로젝트는 승인된 이미지를 생산하지 않았으므로 승인된 이미지당 수치는 정의되지 않습니다. $0.143은 생성만 포함합니다. 저장소, 오케스트레이션, 인간 검토 및 나중의 애니메이션은 완전한 본 예산에 속합니다.
요금은 변합니다. 위의 수치는 2026년 9월 3일에 확인되고 테스트되었습니다. 고유한 제품에 가격을 배치하기 전에 Wan 2.7 이미지 모델 페이지의 라이브 데이터를 사용합니다.
가장 작은 실패한 부분 수정
마스터가 잘못되면 멈추고 다시 생성합니다. 약한 참조를 기반으로 5개 이미지 시리즈에 비용을 지불하는 것은 문제를 곱하기만 합니다.
한 장면이 소품을 놓치지만 캐릭터가 안정적이면 더 짧은 장면 프롬프트로 단일 n: 1 참조 기반 교체를 시도합니다. 테스트된 레이트에서 약 24크레딧을 추가합니다. 여러 프레임이 캐릭터를 재설계하면 마스터를 수정하거나 충돌하는 명령어를 제거한 다음 연결된 그룹을 다시 실행합니다.
Wan의 현재 모델 문서에 따르면 실패한 요청과 거부된 요청은 청구되지 않습니다. 여전히 모든 터미널 작업에서 usage.credits를 읽습니다. canonical Tasks API는 모델별 정책이 생성 후 요금을 유지할 때 실패한 작업에 대한 양수 값을 허용합니다.[3][5]
팀이 크리에이티브하게 거부한 완성 이미지는 청구 가능한 상태로 남아 있으며 이것이 승인된 이미지 비용이 유용한 프로덕션 메트릭인 이유입니다.
장면이 합격하면 작업 ID, 프롬프트 버전, 참조 버전 및 검토 결과와 함께 보관합니다. 생성된 URL은 만료되므로 승인된 자산을 제어하는 저장소로 가능한 한 빨리 이동합니다.[3]
초보자의 일반적인 실수
모든 장면을 텍스트에서 생성합니다. 세부 설명을 반복하는 것은 5개의 독립적인 샘플이 ID를 공유함을 의미하지 않습니다. 승인된 픽셀을 재사용하세요.
장면 프롬프트 내에서 캐릭터 계약을 변경합니다. "겨울 코트 추가"는 합리적인 스토리 변경일 수 있지만 쉬운 연속성 앵커를 제거합니다. 안정적인 ID를 먼저 테스트한 다음 나중에 의도적인 의류 변경을 도입하세요.
참조를 너무 많이 공급합니다. 얼굴, 꼬리 또는 의류에 대해 동의하지 않는 참조는 모델에 여러 유효한 답변을 제공합니다. 승인된 마스터 하나로 시작하세요.
완성된 모든 파일이 사용 가능합니다. 완성은 시스템 상태입니다. 창의적 승인은 검토 결정입니다.
헤드라인 가격만 게시합니다. 그림이 마스터, 재시도, 창의적으로 거부된 완성 출력, 저장소 및 인간 검토를 포함하는지 여부를 나타냅니다.
FAQ
이 API는 실제 3D 캐릭터 모델을 생성하나요?
아니요. 스타일화된 3D 모양의 이미지 파일을 반환합니다. 메시, 리그, 텍스처 패키지, 스켈레톤 또는 편집 가능한 장면을 반환하지 않습니다.
Wan 2.7은 모든 이미지에서 동일한 캐릭터를 보장하나요?
아니요. 그룹 모드와 참조 이미지는 모델에 더 강력한 연속성 신호를 제공하지만 영구 캐릭터 ID를 만들지 않습니다. 모든 장면을 검토해야 합니다.
5개 장면 배치 비용은 얼마였나요?
그룹 작업은 119크레딧, 즉 $0.119를 사용하고 5개의 완성 후보를 반환했습니다. 별도로 생성된 마스터는 24크레딧을 사용하여 테스트 총계를 $0.143으로 올렸습니다.[1]
유효 비용이 단순히 이미지당 $0.0238이 아닌 이유는 무엇인가요?
$0.0238은 완성된 후보당 그룹 비용입니다. 프로젝트에는 마스터도 필요하며 일부 후보는 시각적 검토에 실패할 수 있습니다. 전체 프로젝트 지출을 승인된 장면 수로 나누면 유용한 수치가 나옵니다.
자신의 캐릭터 참조 이미지를 사용할 수 있나요?
예, 소유하거나 사용 권한이 있으며 공개 HTTPS URL을 통해 사용 가능한 경우입니다. Wan 2.7 이미지는 최대 9개의 참조 이미지를 허용하지만 단일 명확한 마스터가 합리적인 시작점입니다.[3]
모든 장면에 동일한 시드를 사용해야 하나요?
Wan은 시드를 노출하지만 ID 잠금이 아닙니다. 연결된 시리즈의 경우 승인된 참조 및 그룹 요청이 더 중요합니다. 변경된 입력으로 반복된 시드는 동일한 얼굴이나 액세서리를 보장하지 않습니다.
한 요청에서 5개 이상의 장면을 생성할 수 있나요?
예. enable_sequential: true를 사용하면 n은 12까지 가능합니다. 시퀀스 길이가 증가하면 검토와 프롬프트 복잡성도 함께 증가하므로 작은 세트로 시작하세요.
승인된 이미지를 비디오로 바꾸려면 어떻게 하나요?
각 승인된 장면을 제어된 시작 프레임으로 사용하여 이미지-비디오 모델을 사용합니다. GPT Image 2 + Seedance 2.0: 캐릭터 일관성 워크플로우는 별도의 애니메이션 단계를 설명합니다. 별도로 유지하면 동작 실패가 캐릭터 재설계를 강제하는 것을 방지합니다.
실제로 출하할 것을 기록하세요
API 레코드에는 1개의 마스터, 1개의 5개 이미지 그룹, 6개의 반환된 파일 및 총 $0.143의 요금이 포함됩니다. 시각적 점수가 이 테스트 외부에 있었기 때문에 창의적 수용률은 포함되지 않습니다.
완성, 비용 및 인간 수용을 별도 필드로 유지하세요. 루브릭을 적용한 후 전체 프로젝트 비용을 실제로 출하할 장면 수로 나누세요.
완전한 요청 스키마, 제한 및 현재 청구 동작은 Wan 2.7 이미지 API 문서를 사용합니다.
참고 자료
- 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
더 읽을 거리
- 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
작성자

카테고리
더 많은 게시물

Sora 2 API 대체 솔루션 비교: 동영상 길이·음성·요금
Sora 2 API를 대신할 서비스 선택의 결정 기준은 동영상 길이, 음성 요금 체계, 초당 실제 비용입니다. 2026년 8월 확인한 각 모델의 최신 요금을 비교 검증합니다.


AtlasCloud 대안 5가지 비교: 2026년 가격·모델 총정리
2026년 AtlasCloud 대안을 찾고 계신가요? fal.ai, Replicate, Together AI, RunPod, reAPI를 가격, 모델 라인업, OpenAI 호환 API 기준으로 비교했습니다.


FLUX 3 vs MiniMax H3: 키프레임, 오디오, 가격 비교
FLUX 3과 MiniMax H3를 지속 시간, 키프레임 제어, 연속 생성, 해상도, 로컬 가중치, 라이선스, 오디오, 실제 API 요금으로 비교합니다.
