Claude Opus 5.5을(를) SeedRouter에서 사용할 수 있습니다

Claude Opus 5.5와 Seedance 2.5로 AI 단편 영화 만드는 방법

Claude Opus 5.5에게 감독을 맡기세요. 콘티와 프롬프트를 쓰고, GPT Image 2.5가 캐릭터를 그리며, Seedance 2.5가 샷마다 소리가 있는 동영상을 만듭니다.

Markdown으로 읽기

Claude Opus 5.5와 Seedance 2.5로 단편 영화를 만들려면 Opus에게 감독을 맡기고, 그림과 촬영은 나머지 두 모델에게 맡기면 됩니다. Opus에게 이야기 아이디어 하나를 주면, 고정된 캐릭터 묘사, 캐릭터 시트 프롬프트, 샷별 동영상 프롬프트를 작성합니다. GPT Image 2.5는 이 프롬프트로 캐릭터 시트와 시작 프레임을 그립니다. Seedance 2.5는 이 이미지들을 참조해 대사와 사운드가 있는 샷을 하나씩 생성합니다. 마지막으로 샷들을 하나의 파일로 이어 붙입니다. 세 모델 모두 SeedRouter에서 같은 API 키로 호출할 수 있습니다. 아래 요청은 모두 SeedRouter API 레퍼런스를 따르며, 2026년 9월 30일에 확인했습니다.

Claude Opus 5.5와 Seedance 2.5 워크플로는 어떻게 작동하나요?

이 아이디어는 한 크리에이터가 2026년 9월 r/Seedance_AI에 공유한 워크플로에서 나왔습니다(원문 게시물). "프롬프트는 단 하나도 직접 쓰지 않았습니다. Opus 5.5에게 핵심 콘셉트 하나와 원하는 스타일의 참고 스크린샷 몇 장만 줬습니다." Opus가 캐릭터 시트, 시작 프레임, 카메라 움직임, 대사 타이밍, 사운드 프롬프트를 썼고, GPT Image 2.5가 캐릭터 시트와 시작 프레임을 그렸으며, Seedance 2.5가 샷을 렌더링했습니다.

모델마다 맡은 일은 하나입니다.

단계모델입력출력
1. 기획Claude Opus 5.5이야기 아이디어, 선택 사항인 스타일 이미지캐릭터 묘사, 시트 프롬프트, 샷별 시작 프레임 프롬프트와 동영상 프롬프트
2. 디자인GPT Image 2.5시트 프롬프트, 이어서 시트를 참조로 한 시작 프레임 프롬프트캐릭터 시트와 시작 프레임(이미지 URL)
3. 촬영Seedance 2.5동영상 프롬프트와 참조 이미지로 쓰는 시트와 시작 프레임샷마다 소리가 있는 동영상 하나
4. 편집ffmpeg 또는 원하는 편집 도구샷 파일완성된 영화

각 단계는 URL로 연결됩니다. GPT Image 2.5가 반환하는 이미지는 SeedRouter 스토리지에 호스팅되고, Seedance 2.5는 참조 이미지를 공개 URL로 받기 때문에 2단계의 결과를 내려받거나 다시 올리지 않고 바로 3단계에 넣을 수 있습니다.

시작하기 전에 무엇이 필요한가요?

  • 환경 변수에 넣은 SeedRouter API 키:
export SEEDROUTER_API_KEY="your-key"
  • requests와 Anthropic SDK가 설치된 Python 3: pip install requests anthropic.
  • 마지막에 샷을 이어 붙일 ffmpeg.
  • 크레딧. 모든 호출은 유료 요청입니다. 실패한 작업은 과금되지 않으며, 새 계정에는 소액의 무료 잔액이 있습니다.

아래의 모든 Python 코드는 다음 두 줄을 공통으로 사용합니다.

import os
import requests

HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}

1단계: Claude Opus 5.5에게 샷 계획을 맡기려면?

Seedance 2.5가 프롬프트를 어떻게 읽는지 설명하는 시스템 프롬프트를 Opus에게 주고, 스크립트에서 쓸 수 있도록 계획을 JSON으로 요청합니다. 이 시스템 프롬프트의 규칙은 ByteDance의 공식 Seedance 프롬프트 가이드에서 가져왔으며 Seedance 2.5 프롬프트 가이드에 정리해 두었습니다. 주체와 동작을 먼저 쓰고, 샷마다 카메라 움직임은 하나만, 긴 샷은 시간 구간으로 나누고, 참조 파일은 번호로 부릅니다.

import json
import anthropic

client = anthropic.Anthropic(
    api_key=os.environ["SEEDROUTER_API_KEY"],
    base_url="https://api.seedrouter.ai",
)

DIRECTOR = """You are the director of a short film made with AI models.
Return only JSON, no other text, in this shape:
{"character": "...", "sheet_prompt": "...",
 "shots": [{"duration": 5, "frame_prompt": "...", "video_prompt": "..."}]}

character: one fixed paragraph describing the main character's face, hair,
build and clothes. Repeat it word for word inside every other prompt.

sheet_prompt: an image prompt for one character reference sheet: a front,
three-quarter, profile and back view, plus four facial expressions, on a plain
light background, with no text other than small panel labels.

shots: 3 to 5 shots, each 4 to 15 seconds.
frame_prompt: an image prompt for the first frame of the shot.
video_prompt: a video prompt for Seedance 2.5. Write it in this order: subject
and action, scene, visual style, camera, audio. Image 1 is the character sheet
and Image 2 is the start frame of the shot; refer to them by those names.
Use one camera move per shot. Say who is holding the camera and how they move.
For shots longer than 5 seconds, split the action into time ranges such as
0-3s. Put dialogue in quotes as: Character's line (emotion): content.
Describe the ambient sound. Do not ask for subtitles or on-screen text.

The character must not look like a real, identifiable person. Use a stylized
look, such as a 3D animated or illustrated character."""

message = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    system=DIRECTOR,
    messages=[{
        "role": "user",
        "content": "A lighthouse keeper finds a lost robot on the rocks during a storm and teaches it to wave at passing ships.",
    }],
)
text = "".join(block.text for block in message.content if block.type == "text")
plan = json.loads(text)

몇 가지 세부 사항이 중요합니다.

  • max_tokens에는 사고 과정이 포함됩니다. Opus 5.5는 항상 적응형 사고를 사용하며, Opus 5.5 API 레퍼런스에 따르면 사고 토큰도 max_tokens에 포함됩니다. 여유를 두지 않으면 JSON이 중간에 잘릴 수 있습니다.
  • temperature, top_p, top_k는 보내지 말고, assistant 턴을 미리 채우지도 마세요. 샘플링 값이 기본값이 아니거나 응답을 미리 채우면 Opus 5.5는 400 오류를 반환합니다. 사고의 깊이를 조절하려면 output_config.effort를 쓰세요.
  • "누가 카메라를 들고 있는가"는 원문 게시물의 팁입니다. 작성자에 따르면 Opus에게 "친구가 뒷좌석에서 찍고 있다"고 알려 주자 미세한 손떨림, 한 박자 늦은 프레이밍, 초점을 찾아 헤매는 오토포커스까지 써 넣었고, "그 하나의 상황 설정이 'AI 느낌'을 없애 준다"고 말합니다.
  • 스타일 참고 이미지는 선택 사항입니다. Opus는 이미지를 읽을 수 있으므로 원하는 분위기의 스크린샷을 user 턴에 URL 소스의 image 블록으로 추가할 수 있습니다.

json.loads가 실패하면 text를 출력한 뒤 Opus에게 다시 요청하세요. 무언가를 렌더링하기 전에 계획을 읽어 보는 것이 이야기를 고치는 가장 저렴한 시점이기도 합니다. 여기서의 수정은 텍스트 요청 한 번이면 되지만, 렌더링 후의 수정은 동영상 비용이 듭니다.

2단계: GPT Image 2.5로 캐릭터 시트와 시작 프레임을 만들려면?

먼저 plan["sheet_prompt"]를 GPT Image 2.5에 보냅니다. 그다음 각 샷의 frame_prompt를 시트를 참조 이미지로 붙여 보내면, 모든 시작 프레임에 같은 캐릭터가 나옵니다. 이미지 작업은 /v1/images/generations로 제출하고 /v1/tasks/{id}에서 결과를 읽습니다.

import time

def image(prompt, size, refs=()):
    body = {"model": "gpt-image-2.5-flare", "prompt": prompt, "size": size, "quality": "high"}
    if refs:
        body["images"] = [{"image_url": url} for url in refs]
    task_id = requests.post(
        "https://api.seedrouter.ai/v1/images/generations",
        headers=HEADERS, json=body, timeout=60,
    ).json()["id"]
    while True:
        task = requests.get(
            f"https://api.seedrouter.ai/v1/tasks/{task_id}", headers=HEADERS, timeout=30,
        ).json()
        if task["status"] == "completed":
            return task["output"]["data"][0]["url"]
        if task["status"] == "failed":
            raise RuntimeError(task["error"]["message"])
        time.sleep(3)

sheet = image(plan["sheet_prompt"], "1536x1024")
frames = [image(shot["frame_prompt"], "1792x1008", [sheet]) for shot in plan["shots"]]

이렇게 설정한 이유:

  • 1792x1008은 16:9입니다. GPT Image 2.5의 size는 두 변이 모두 16의 배수인 WIDTHxHEIGHT 형식이라, 16:9 화면은 픽셀 수로 적어야 합니다. 16:9는 올바른 size 값이 아닙니다. Seedance에 지정할 ratio와 맞추세요.
  • 대부분의 시트는 Flare로 충분합니다. Sunburst는 여러 번의 편집에서 더 정밀하게 제어되지만 더 느립니다. 언제 쓸 만한지는 GPT Image 2.5 Flare vs Sunburst에서 다룹니다.
  • 초안은 낮은 quality로. 캐릭터를 계속 고치는 동안에는 low나 medium이 더 빨리 나옵니다. 촬영에 쓸 이미지에만 high를 쓰세요.

위 함수는 코드를 짧게 하려고 기한 없이 폴링합니다. 실제 코드에서는 시간 제한을 두고 작업 ID를 저장해 두세요. 그래야 중단되더라도 새 요청에 다시 비용을 내지 않고 같은 작업을 다시 확인할 수 있습니다.

3단계: Seedance 2.5로 샷을 하나씩 렌더링하려면?

각 video_prompt를 Seedance 2.5에 보내면서 참조 이미지 두 장을 붙입니다. 캐릭터 시트가 Image 1, 해당 샷의 시작 프레임이 Image 2입니다. Seedance는 참조 파일에 첨부한 순서대로 번호를 매기므로 이 순서를 지켜야 합니다. 동영상 작업은 별도의 엔드포인트 /v1/contents/generations/tasks를 사용하며, 완료되면 status: "succeeded"가 됩니다.

def shot(prompt, refs, duration):
    content = [{"type": "text", "text": prompt}]
    for url in refs:
        content.append({"type": "image_url", "image_url": {"url": url}, "role": "reference_image"})
    task_id = requests.post(
        "https://api.seedrouter.ai/v1/contents/generations/tasks",
        headers=HEADERS,
        json={
            "model": "dreamina-seedance-2-5",
            "content": content,
            "resolution": "480p",
            "ratio": "16:9",
            "duration": duration,
            "generate_audio": True,
        },
        timeout=60,
    ).json()["id"]
    while True:
        task = requests.get(
            f"https://api.seedrouter.ai/v1/contents/generations/tasks/{task_id}",
            headers=HEADERS, timeout=30,
        ).json()
        if task["status"] == "succeeded":
            return task["content"]["video_url"]
        if task["status"] in ("failed", "expired"):
            raise RuntimeError(task["error"]["message"])
        time.sleep(15)

videos = [shot(s["video_prompt"], [sheet, frame], s["duration"]) for s, frame in zip(plan["shots"], frames)]

요청을 이렇게 구성한 이유:

  • 시작 프레임이 아니라 참조 이미지를 씁니다. Seedance 2.5는 샷을 정확한 첫 프레임에 고정할 수도 있지만(role: "first_frame"), Seedance 2.5 API 레퍼런스에 따르면 첫 프레임 모드는 "참조 항목과 함께 쓸 수 없어" 캐릭터 시트를 쓸 수 없게 됩니다. 두 이미지를 모두 reference_image로 보내면, 프롬프트에서 Image 2가 시작 프레임이라고 Seedance에 알려 줍니다. 도입부는 그 이미지를 잘 따르지만 픽셀 단위로 똑같지는 않습니다.
  • 초안은 480p로. 먼저 모든 샷을 480p로 렌더링하고, 잘 안 된 프롬프트를 고친 뒤, 확정된 샷만 같은 프롬프트로 720p나 1080p로 렌더링합니다.
  • generate_audio: true 설정은 프롬프트에 따라 대사, 환경음, 효과음을 화면과 함께 생성합니다.
  • ratio를 고정합니다. 모든 샷의 비율과 해상도가 같으면 ffmpeg가 다시 인코딩하지 않고 파일을 이어 붙일 수 있습니다.

샷 하나는 4~30초이며, 프롬프트에서 컷마다 시간 구간을 지정하면 한 작업 안에 여러 컷을 넣을 수도 있습니다. 예를 들어 원문 작성자의 두 번째 장면은 드럼 비트에 맞춰 10초 안에 샷 여섯 개를 담았습니다.

모든 샷에서 같은 캐릭터를 유지하려면?

일관성은 프롬프트와 참조 모두에서 같은 것을 반복하는 데서 나옵니다.

  • 같은 묘사를 반복하세요. 1단계의 character 단락을 모든 이미지·동영상 프롬프트에 글자 그대로 넣습니다. 같은 인물을 두 가지로 묘사하면 캐릭터가 변하거나 중복되는 원인이 됩니다.
  • 모든 샷에 같은 시트를 보내세요. 시트는 항상 Image 1입니다. Seedance 2.5는 멀티뷰 시트를 받아들입니다. 이전 버전인 Seedance 2.0은 여러 각도가 담긴 시트를 여러 사람으로 읽을 수 있어서, 프롬프트 가이드는 캐릭터마다 얼굴 클로즈업 한 장과 전신 이미지 한 장을 쓰라고 권합니다.
  • 캐릭터를 매번 같은 방식으로 부르세요. 예를 들어 "Image 1의 등대지기"처럼 부르고, 이미지 안에 적힌 이름에 의존하지 마세요.
  • 모든 샷에서 같은 목소리를 유지하세요. Seedance 2.5는 참조 오디오를 최대 10개(WAV 또는 MP3, 2~30초)까지 받습니다. 같은 음성 클립을 각 샷에 붙이고 텍스트에서 연결하세요. ByteDance 예시처럼 쓰면 됩니다: "Image 1은 주인공 John이며 Audio 1의 음색을 사용한다."

두 샷을 눈에 띄는 끊김 없이 이어야 한다면 두 번째 방법이 있습니다. 첫 샷에 "return_last_frame": true를 설정하고, 반환된 content.last_frame_url을 다음 샷의 first_frame으로 보냅니다. 이음새는 고정되지만 다음 샷은 캐릭터 시트를 쓸 수 없으므로, 모든 컷이 아니라 한 장면 안의 연속된 동작에 쓰세요.

실제 인물 사진을 캐릭터로 쓸 수 있나요?

아니요. Seedance 2.5는 실제 사람의 얼굴이 담긴 참조 이미지나 동영상을 받지 않으며, 이런 작업은 실패하고 과금되지 않습니다. Seedance 실제 인물 오류에서 ByteDance의 규칙과 ByteDance가 자사 플랫폼에서 제공하는 대안을 설명합니다.

이는 사실적인 AI 캐릭터에도 영향을 줍니다. 원문 게시물은 사진처럼 사실적인 여성을 촬영했지만, 다른 모델이 그린 사실적인 얼굴을 ByteDance의 얼굴 검사가 어떻게 처리하는지는 문서에 나와 있지 않습니다. 위 시스템 프롬프트가 요구하는 3D 애니메이션이나 일러스트 같은 스타일화된 캐릭터를 쓰면 이 문제를 피할 수 있습니다. 사실적인 룩을 원한다면 영화 전체를 기획하기 전에 먼저 480p로 짧은 샷 하나를 시험해 보세요.

샷을 이어 붙여 영화 한 편으로 만들려면?

동영상을 순서대로 내려받아 텍스트 파일에 나열하고 ffmpeg로 이어 붙입니다.

names = []
for index, url in enumerate(videos):
    name = f"shot-{index + 1}.mp4"
    with open(name, "wb") as file:
        file.write(requests.get(url, timeout=300).content)
    names.append(name)
with open("shots.txt", "w") as file:
    file.writelines(f"file '{name}'\n" for name in names)
ffmpeg -f concat -safe 0 -i shots.txt -c copy film.mp4

-c copy는 다시 인코딩하지 않고 파일을 이어 붙입니다. 모든 샷의 해상도, 비율, 형식이 같기 때문에 가능합니다. 설정이 섞여 있다면 -c copy를 빼고 ffmpeg가 다시 인코딩하게 하세요. 동영상 URL은 SeedRouter 스토리지에 호스팅되므로 보관하고 싶은 파일은 내려받아 두세요.

Seedance 2.5 단편 영화 비용은 얼마인가요?

모델마다 과금 단위가 다르며, 현재 요금은 각 모델 페이지에 있습니다.

  • Claude Opus 5.5는 사고를 포함한 입력·출력 토큰으로 과금됩니다. 영화 기획은 요청 한 번에서 몇 번이면 됩니다. 요금.
  • GPT Image 2.5의 Flare와 Sunburst는 전달된 이미지 한 장당 고정 가격입니다. 단편 영화라면 시트 한 장과 샷마다 시작 프레임 한 장으로 4~6장입니다. 요금.
  • Seedance 2.5는 동영상 토큰으로 과금됩니다: 출력 초 × 너비 × 높이 × 24 ÷ 1024. 16:9 영상 1초는 480p에서 9,607.5토큰, 720p에서 21,600토큰, 1080p에서 48,600토큰이며, 1080p에는 별도 요금이 적용됩니다. 요금.

비용의 대부분은 동영상입니다. 480p 초안은 720p의 절반도 안 되는 토큰을 쓰므로, 480p에서 프롬프트를 고치고 최종본만 높은 해상도로 렌더링하는 것이 가장 크게 절약하는 방법입니다. 더 많은 계산 예시는 Seedance API 요금에 있습니다.

자주 묻는 질문

Claude Opus 5.5가 혼자서 동영상을 만들 수 있나요?

아니요. Opus 5.5는 텍스트 모델입니다. 이미지를 읽을 수는 있지만 이미지나 동영상을 생성하지는 않습니다. 이 워크플로에서 Opus는 프롬프트를 쓰고, 그림과 영상은 GPT Image 2.5와 Seedance 2.5가 만듭니다.

Opus 5.5 대신 Claude Fable 5.1을 써도 되나요?

네. Fable 5.1은 같은 Messages 요청을 받으므로 model만 claude-fable-5-1로 바꾸면 됩니다. 세 모델 비교는 Claude Fable 5.1 vs Fable 5 vs Opus 5.5를 참고하세요.

Seedance 2.5 단편 영화는 얼마나 길게 만들 수 있나요?

Seedance 2.5 작업 하나는 4~30초를 렌더링하며, duration: -1로 길이를 모델에 맡길 수도 있습니다. 더 긴 영화는 여러 샷을 이어 붙여 만들기 때문에 전체 길이에 정해진 한도는 없습니다.

샷마다 캐릭터가 달라지는 이유는 무엇인가요?

대개 프롬프트마다 캐릭터 묘사가 다르거나, 일부 샷에서 시트가 빠졌거나, 참조 파일의 첨부 순서가 프롬프트의 번호와 맞지 않기 때문입니다. 모든 동영상 프롬프트에 같은 캐릭터 단락이 들어 있는지, 시트가 항상 첫 번째 이미지인지 확인하세요.

이 워크플로에 Seedance 2.0을 써도 되나요?

네. 요청 형태는 같고 모델 ID만 바꾸면 됩니다. 캐릭터 시트는 한 장의 멀티뷰 시트 대신 얼굴 이미지와 전신 이미지를 따로 Seedance 2.0에 주세요. 다른 차이점은 Seedance 2.5 vs 2.0에 정리되어 있습니다.

첫 단편 영화 만들기

480p로 샷 세 개짜리 이야기부터 시작해 샷을 확인한 뒤, 최종본을 더 높은 해상도로 렌더링하세요. Seedance 2.5 페이지에서 현재 요금과 샷 하나를 시험할 수 있는 Playground를 볼 수 있고, 전체 요청 레퍼런스는 Seedance 2.5 API 문서, GPT Image 2.5 API 문서, Claude Opus 5.5 API 문서에 있습니다.

관련 가이드