Nodaro 문서
문서노드 레퍼런스모델템플릿AI 에이전트(MCP)개발자셀프 호스팅리서치비교
REST API

Cast Swap

REST, SDK, MCP로 4~30초 동영상 속 인물이나 장소를 내 레퍼런스 이미지로 교체하세요. 움직임, 구도, 소리는 그대로 유지됩니다.

Nodaro Cloud에서 사용할 수 있습니다

Cast Swap API는 짧은 동영상 속 인물, 장소 또는 둘 다를 내 레퍼런스 이미지로 교체합니다. 동영상의 움직임, 구도, 타이밍, 소리는 그대로 유지됩니다. 실행 견적을 무료로 받고, 실행을 시작한 뒤, 다른 작업처럼 그 작업을 추적하세요.

Cast Swap은 Nodaro Cloud에서만 실행됩니다. 셀프 호스팅 설치에서는 두 라우트 모두 404로 응답합니다. 라우트는 Bearer 토큰을 받습니다. 인증을 참조하세요.

엔드포인트

메서드경로하는 일비용
POST/v1/cast-swap/estimate실행 견적을 받습니다. 아무것도 만들거나 예약하지 않습니다.무료
POST/v1/cast-swap실행을 시작합니다. 202 { jobId }로 응답합니다. GET /v1/jobs/:id로 작업을 추적하세요.견적을 받은 실행 금액

요청 본문

두 라우트는 같은 본문을 받습니다.

필드하는 일
videoUrl필수입니다. 4~30초 길이의 원본 클립입니다.
roles필수입니다. 인물 역할 최대 6개와 장소 역할 1개입니다. 아래를 참조하세요.
postPrompt선택 사항입니다. 모델에 전달할 내 문구로, 최대 4,000자입니다. 역할은 {role:N}으로 언급하며, N은 빈 역할을 포함해 roles에서 1부터 셉니다.
preview선택 사항입니다. true이면 previewStart부터 클립의 4초를 렌더링합니다.
previewStart선택 사항입니다. 미리보기가 시작되는 지점(초)입니다. 기본값은 0입니다.
quality선택 사항입니다. 현재 유일한 값인 "draft"입니다.
sessionId, origin선택 사항입니다. 결과를 보관할 세션과 내 앱의 출처 레이블입니다.

역할은 동영상 속 누군가나 배경을 지정하며, 한 사람이나 한 장소의 이미지를 0~3장 받습니다.

  • 인물: { kind: "person", name, images, body?, outfit?, hair? }. name은 동영상 속 누구인지를 말합니다. 예: "the woman dancing". body, outfit, hair는 각각 내 이미지에서 가져오는 기본값 "new", 또는 동영상에서 유지하는 "original"입니다.
  • 장소: { kind: "location", name?, images }. 기본 이름은 "the setting"입니다.

이미지가 없는(비어 있거나 null인) 역할은 그 인물이나 장소를 동영상 그대로 유지합니다. 이미지가 있는 역할이 하나 이상 있거나 postPrompt가 있어야 합니다.

{
  "videoUrl": "https://example.com/clip.mp4",
  "roles": [
    { "kind": "person", "name": "the woman dancing", "images": ["https://example.com/me.jpg"], "outfit": "original" }
  ],
  "preview": true
}

견적

POST /v1/cast-swap/estimate는 { totalCredits, breakdown: { castSwap, seedance }, settlesLower }로 응답합니다.

  • totalCredits는 실행 자체인 breakdown.castSwap과, 실행이 호출하는 동영상 모델인 breakdown.seedance를 더한 값입니다.
  • settlesLower: true는 결과의 길이를 모델이 정한다는 뜻이므로, 최종 청구액이 견적보다 낮을 것으로 예상됩니다.

반복 요청

실행을 재시도할 때는 8~200자의 같은 Idempotency-Key 헤더를 보내세요. 약 10초 안에 반복된 요청은 X-Dedup-Hit: 1 헤더와 함께 200 { jobId, deduped: true }로 응답합니다. 그 뒤에 반복된 요청은 첫 실행의 작업으로 202 { jobId }라고 응답합니다. 어느 경우든 새로 시작되거나 청구되는 것은 없습니다. 키가 없으면 요청마다 새 실행이 됩니다.

오류

모든 거부는 아무것도 청구되기 전에 일어납니다. 본문은 { error: { code, message } }입니다.

상태code발생 시점
400validation_error본문이 유효하지 않습니다. 이미지가 있는 역할도 postPrompt도 없거나, 역할이 너무 많거나, 한 역할의 이미지가 3장을 넘거나, postPrompt가 4,000자를 넘거나, origin이 유효하지 않은 경우입니다.
400raw_reference_token역할의 name이나 postPrompt에 원시 레퍼런스 토큰 {image:, {video:, {audio:가 대소문자와 관계없이 들어 있습니다.
400invalid_role_mentionpostPrompt가 1부터 역할 수까지의 범위를 벗어난 N으로 {role:N}을 언급합니다.
400unsafe_urlvideoUrl이나 역할 이미지가 공개 http 또는 https 주소가 아닙니다.
400video_unreadable클립의 길이를 읽을 수 없습니다. 재생할 수 있는 동영상이 아닙니다.
400clip_out_of_range클립이 4초보다 짧거나 30초보다 깁니다.
400preview_out_of_range미리보기가 클립의 끝을 넘습니다. previewStart에 4를 더한 값이 클립 길이 이하여야 합니다.
401unauthorized인증된 사용자가 없습니다.
402insufficient_credits내 크레딧으로 실행 비용을 감당할 수 없습니다. POST /v1/cast-swap 전용입니다. 워크스페이스에서는 거부한 한도에 따라 budget_exceeded, member_cap_exceeded, user_allowance_exceeded로 응답할 수도 있습니다.
404not_foundsessionId가 내가 쓸 수 없는 세션을 가리킵니다. POST /v1/cast-swap 전용입니다.
422job_blocked배포 환경의 작업 정책이 요청을 막았습니다. POST /v1/cast-swap 전용입니다.
503host_too_old이 플랫폼 버전에서는 Cast Swap을 실행할 수 없습니다.
503estimate_unavailable지금은 동영상 모델의 가격을 견적 낼 수 없습니다. 잠시 후 다시 시도하세요. /estimate 전용입니다.

SDK에서 사용

client.castSwap은 두 라우트를 감쌉니다. @nodaro/sdk/cast-swap으로도 가져올 수 있습니다.

run(params: CastSwapParams, options?: { idempotencyKey?: string }): Promise<{ jobId: string; deduped?: boolean }>
estimate(params: CastSwapParams): Promise<CastSwapEstimate>

CastSwapParams는 위의 요청 본문입니다. CastSwapEstimate는 견적입니다. run()은 idempotencyKey를 그대로 Idempotency-Key 헤더로 보냅니다. 없으면 헤더를 보내지 않습니다.

const params: CastSwapParams = {
  videoUrl,
  roles: [{ kind: "person", name: "the woman dancing", images: [myPhotoUrl], outfit: "original" }],
  preview: true,
}
const quote = await client.castSwap.estimate(params)
const { jobId } = await client.castSwap.run(params, { idempotencyKey: crypto.randomUUID() })

client.jobs.get(jobId)로 작업을 추적하세요. 미리보기 작업은 모든 입력을 input_data에 보관하므로, preview: false로 다시 실행해 같은 선택으로 클립 전체를 렌더링할 수 있습니다.

MCP에서 사용

MCP 도구는 cast_swap입니다. confirm이 없으면 견적을 반환하고 아무것도 청구하지 않습니다. 사용자가 가격을 수락한 뒤 confirm: true로 호출하면 실행을 시작하고 작업 ID를 반환합니다.

자주 묻는 질문

Cast Swap은 무엇을 하나요?

Cast Swap은 짧은 동영상 속 인물, 장소 또는 둘 다를 내 레퍼런스 이미지로 교체합니다. 동영상의 움직임, 구도, 타이밍, 소리는 그대로 유지됩니다.

원본 동영상은 얼마나 길 수 있나요?

4~30초입니다. 더 짧거나 긴 클립은 아무것도 청구되기 전에 clip_out_of_range로 거부됩니다.

Cast Swap 실행 비용은 어떻게 알 수 있나요?

실행할 때와 같은 본문으로 POST /v1/cast-swap/estimate를 호출하세요. 무료이며, 실행 자체와 실행이 호출하는 동영상 모델의 내역과 함께 totalCredits를 반환합니다.

클립 전체를 렌더링하기 전에 결과를 미리 볼 수 있나요?

네. preview를 true로 보내면 previewStart부터 클립의 4초를 렌더링합니다. 미리보기는 비용이 더 적고, 그 작업은 모든 입력을 보관하므로 preview를 false로 해서 다시 실행할 수 있습니다.

Cast Swap은 셀프 호스팅 설치에서도 작동하나요?

아니요. Cast Swap은 Nodaro Cloud에서만 실행됩니다. 셀프 호스팅 설치에서는 두 라우트 모두 404로 응답합니다.

최종 업데이트

목차