[{"data":1,"prerenderedAt":41535},["ShallowReactive",2],{"blog-list-ko":3},[4,11294,13502,17394,23109,30414,32188,38618],{"id":5,"title":6,"body":7,"description":11283,"extension":11284,"meta":11285,"navigation":58,"path":11290,"seo":11291,"stem":11292,"__hash__":11293},"content/ko/blog/seedance-2-api-tutorial-python.md","Seedance 2.0 API 튜토리얼: Python으로 첫 AI 비디오 생성하기",{"type":8,"value":9,"toc":11225},"minimark",[10,14,17,32,44,47,52,55,66,69,91,96,125,128,201,203,207,216,219,247,250,271,290,299,307,309,313,316,330,336,470,473,509,512,1027,1030,1066,1239,1249,1252,1261,1263,1267,1270,1736,1739,1827,1830,1842,1846,1853,2031,2034,2155,2169,2173,2178,2186,2189,2197,2204,2211,2213,2217,2224,2260,2263,2267,2273,2342,2346,2352,2358,2419,2436,2440,2443,2569,2582,2589,2600,2602,2606,2618,2624,2887,2890,2940,2944,2971,2974,3056,3059,3211,3217,3221,3275,3285,3293,3297,3300,3379,3386,3388,3392,3395,3614,3643,3647,3652,3656,3747,3755,3760,3855,3862,3867,3955,3960,4035,4052,4056,4059,4130,4143,4161,4163,4167,4170,4174,4177,4235,4256,4259,4264,4307,4313,4318,4372,4377,4382,4434,4443,4448,4500,4517,4522,4565,4572,4577,4631,4637,4642,4685,4688,4693,4736,4739,4744,4798,4804,4808,5018,5022,5025,5029,5788,5791,5823,5830,5834,5837,6417,6428,6430,6434,6441,6445,6451,6456,6614,6620,6624,6686,6690,6693,7883,7886,7909,7912,7939,7943,7952,8000,8003,8009,8015,8062,8077,8081,8084,8256,8260,8339,8346,8348,8352,8355,8360,8908,8911,8933,8935,8939,8942,8946,8985,8989,9011,9015,9018,9052,9062,9064,9068,9072,9082,9086,9092,9096,9102,9106,9117,9121,9134,9138,9148,9152,9168,9172,9179,9183,9199,9203,9210,9212,9216,9219,11199,11213,11221],[11,12,13],"p",{},"Seedance 2.0은 ByteDance의 가장 강력한 AI 비디오 생성 모델입니다 — 멀티모달 참조, 네이티브 오디오 생성, 시네마틱 카메라 제어, 최대 1080p에서 4~15초 비디오 생성을 지원합니다. 이 튜토리얼에서는 API Key 발급부터 첫 번째 비디오 다운로드까지 Python으로 전체 API 워크플로우를 안내합니다.",[11,15,16],{},"이 튜토리얼을 마치면 텍스트-투-비디오, 이미지-투-비디오, 비동기 polling, webhook 처리, 오류 복구를 위한 바로 실행할 수 있는 코드를 갖게 됩니다. 모든 코드 예제는 실제 API에서 테스트되었습니다.",[18,19,20],"blockquote",{},[11,21,22,26,27,31],{},[23,24,25],"strong",{},"참고 — Seedance 2.0 vs 1.5:"," Seedance 2.0은 점진적으로 출시 중입니다. 지금 바로 ",[28,29,30],"code",{},"seedance-1.5-pro","로 전체 워크플로우를 테스트할 수 있습니다 — 2.0이 완전히 출시되면 모델 이름만 변경하면 됩니다. 모든 엔드포인트, 파라미터, 응답 형식이 동일합니다. 2.0의 주요 차이점: 멀티모달 참조(이미지, 비디오, 오디오 혼합 입력), 네이티브 오디오 생성, 향상된 물리 시뮬레이션, 비디오 편집 기능. 이 튜토리얼의 모든 내용은 두 버전 모두에서 작동합니다.",[11,33,34],{},[23,35,36,43],{},[37,38,42],"a",{"href":39,"rel":40},"https://evolink.ai/early-access",[41],"nofollow","무료 API Key 발급받기"," — 튜토리얼을 따라해 보세요.",[45,46],"hr",{},[48,49,51],"h2",{"id":50},"이-튜토리얼에서-만들-것-그리고-필요한-것","이 튜토리얼에서 만들 것 (그리고 필요한 것)",[11,53,54],{},"Seedance로 생성한 비디오가 어떤 모습인지 먼저 확인해 보세요 — 단 한 번의 API 호출로 만들어졌습니다:",[56,57,60,61],"video",{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},true,"width:100%;border-radius:12px;margin:1.5em 0","\n  ",[62,63],"source",{"src":64,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%B0%8F%E5%A5%B3%E5%AD%A9%E5%9B%BE%E4%B9%A6%E9%A6%86%E5%A5%87%E9%81%87.mp4","video/mp4",[11,67,68],{},"이 튜토리얼에서 작성할 Python 코드:",[70,71,72,76,79,82,85,88],"ol",{},[73,74,75],"li",{},"텍스트 프롬프트 전송 → 생성된 비디오 수신",[73,77,78],{},"이미지 전송 → 비디오로 애니메이션화",[73,80,81],{},"비동기로 결과 polling",[73,83,84],{},"프로덕션 코드처럼 오류와 재시도 처리",[73,86,87],{},"webhook으로 결과 수신 (polling 불필요)",[73,89,90],{},"진행 중인 작업 취소",[92,93,95],"h3",{"id":94},"사전-요구사항","사전 요구사항",[97,98,99,109,119],"ul",{},[73,100,101,104,105,108],{},[23,102,103],{},"Python 3.8+"," (",[28,106,107],{},"python3 --version","으로 확인)",[73,110,111,114,115,118],{},[23,112,113],{},"requests"," 라이브러리 (",[28,116,117],{},"pip install requests",")",[73,120,121,124],{},[23,122,123],{},"EvoLink API Key"," (무료 가입 — 다음 섹션에서 발급 방법을 안내합니다)",[11,126,127],{},"GPU도, Docker도, 복잡한 설정도 필요 없습니다. Python과 API Key만 있으면 됩니다.",[18,129,130,136],{},[11,131,132,135],{},[23,133,134],{},"팁:"," 프로덕션 앱을 개발 중이라면 가상 환경으로 의존성을 격리하는 것을 권장합니다:",[137,138,143],"pre",{"className":139,"code":140,"language":141,"meta":142,"style":142},"language-bash shiki shiki-themes github-dark","python3 -m venv seedance-env\nsource seedance-env/bin/activate  # macOS/Linux\nseedance-env\\Scripts\\activate     # Windows\npip install requests flask\n","bash","",[28,144,145,165,177,186],{"__ignoreMap":142},[146,147,150,154,158,162],"span",{"class":148,"line":149},"line",1,[146,151,153],{"class":152},"svObZ","python3",[146,155,157],{"class":156},"sDLfK"," -m",[146,159,161],{"class":160},"sU2Wk"," venv",[146,163,164],{"class":160}," seedance-env\n",[146,166,168,170,173],{"class":148,"line":167},2,[146,169,62],{"class":156},[146,171,172],{"class":160}," seedance-env/bin/activate",[146,174,176],{"class":175},"sAwPA","  # macOS/Linux\n",[146,178,180,183],{"class":148,"line":179},3,[146,181,182],{"class":152},"seedance-env\\Scripts\\activate",[146,184,185],{"class":175},"     # Windows\n",[146,187,189,192,195,198],{"class":148,"line":188},4,[146,190,191],{"class":152},"pip",[146,193,194],{"class":160}," install",[146,196,197],{"class":160}," requests",[146,199,200],{"class":160}," flask\n",[45,202],{},[48,204,206],{"id":205},"api-key-발급","API Key 발급",[11,208,209,210,215],{},"Seedance 2.0은 ",[37,211,214],{"href":212,"rel":213},"https://evolink.ai",[41],"EvoLink","를 통해 제공됩니다. EvoLink는 하나의 API Key로 Seedance 2.0, Kling 등 여러 AI 비디오 모델에 통합 접근할 수 있는 API 게이트웨이입니다.",[11,217,218],{},"시작하는 방법:",[70,220,221,228,234,240],{},[73,222,223,227],{},[37,224,226],{"href":39,"rel":225},[41],"evolink.ai/early-access","에서 계정 생성",[73,229,230,233],{},[23,231,232],{},"Dashboard → API Keys","로 이동",[73,235,236,239],{},[23,237,238],{},"Create New Key"," 클릭",[73,241,242,243,246],{},"Key 복사 — ",[28,244,245],{},"sk-","로 시작합니다",[11,248,249],{},"Key를 안전하게 보관하세요. 버전 관리에 커밋하지 마세요. 환경 변수를 사용합니다:",[137,251,253],{"className":139,"code":252,"language":141,"meta":142,"style":142},"export EVOLINK_API_KEY=\"sk-your-api-key-here\"\n",[28,254,255],{"__ignoreMap":142},[146,256,257,261,265,268],{"class":148,"line":149},[146,258,260],{"class":259},"snl16","export",[146,262,264],{"class":263},"s95oV"," EVOLINK_API_KEY",[146,266,267],{"class":259},"=",[146,269,270],{"class":160},"\"sk-your-api-key-here\"\n",[11,272,273,274,277,278,281,282,285,286,289],{},"이 명령은 현재 터미널 세션에서 ",[28,275,276],{},"EVOLINK_API_KEY"," 환경 변수를 설정합니다. macOS/Linux에서는 ",[28,279,280],{},"~/.bashrc"," 또는 ",[28,283,284],{},"~/.zshrc","에 추가하여 영구적으로 유지할 수 있습니다. Windows에서는 명령 프롬프트에서 ",[28,287,288],{},"set EVOLINK_API_KEY=sk-your-api-key-here","를 사용하거나, 시스템 속성 → 환경 변수에서 설정하세요.",[11,291,292,293,298],{},"계정에는 체험용 초기 크레딧이 포함되어 있습니다. 현재 가격 정보는 ",[37,294,297],{"href":295,"rel":296},"https://seedance2api.app/docs/getting-started",[41],"시작하기 문서","를 확인하세요.",[18,300,301],{},[11,302,303,306],{},[23,304,305],{},"흔한 실수:"," API Key를 소스 파일에 하드코딩하지 마세요. GitHub에 푸시하면 자동화된 크롤러가 몇 분 안에 찾아냅니다. 반드시 환경 변수나 AWS Secrets Manager, HashiCorp Vault 같은 시크릿 관리 서비스를 사용하세요.",[45,308],{},[48,310,312],{"id":311},"python-환경-설정","Python 환경 설정",[11,314,315],{},"필요한 유일한 의존성을 설치합니다:",[137,317,319],{"className":139,"code":318,"language":141,"meta":142,"style":142},"pip install requests\n",[28,320,321],{"__ignoreMap":142},[146,322,323,325,327],{"class":148,"line":149},[146,324,191],{"class":152},[146,326,194],{"class":160},[146,328,329],{"class":160}," requests\n",[11,331,332,335],{},[28,333,334],{},"seedance_tutorial.py","라는 파일을 만들고 다음 기본 코드를 추가하세요. 이 튜토리얼의 모든 예제는 이 기반 위에 구축됩니다:",[137,337,341],{"className":338,"code":339,"language":340,"meta":142,"style":142},"language-python shiki shiki-themes github-dark","import requests\nimport time\nimport os\nimport json\n\n# ── 설정 ─────────────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n","python",[28,342,343,350,357,364,371,377,383,407,418,429,453,464],{"__ignoreMap":142},[146,344,345,348],{"class":148,"line":149},[146,346,347],{"class":259},"import",[146,349,329],{"class":263},[146,351,352,354],{"class":148,"line":167},[146,353,347],{"class":259},[146,355,356],{"class":263}," time\n",[146,358,359,361],{"class":148,"line":179},[146,360,347],{"class":259},[146,362,363],{"class":263}," os\n",[146,365,366,368],{"class":148,"line":188},[146,367,347],{"class":259},[146,369,370],{"class":263}," json\n",[146,372,374],{"class":148,"line":373},5,[146,375,376],{"emptyLinePlaceholder":58},"\n",[146,378,380],{"class":148,"line":379},6,[146,381,382],{"class":175},"# ── 설정 ─────────────────────────────────────────────────────\n",[146,384,386,389,392,395,398,401,404],{"class":148,"line":385},7,[146,387,388],{"class":156},"API_KEY",[146,390,391],{"class":259}," =",[146,393,394],{"class":263}," os.getenv(",[146,396,397],{"class":160},"\"EVOLINK_API_KEY\"",[146,399,400],{"class":263},", ",[146,402,403],{"class":160},"\"sk-your-api-key-here\"",[146,405,406],{"class":263},")\n",[146,408,410,413,415],{"class":148,"line":409},8,[146,411,412],{"class":156},"BASE_URL",[146,414,391],{"class":259},[146,416,417],{"class":160}," \"https://api.evolink.ai/v1\"\n",[146,419,421,424,426],{"class":148,"line":420},9,[146,422,423],{"class":156},"HEADERS",[146,425,391],{"class":259},[146,427,428],{"class":263}," {\n",[146,430,432,435,438,441,444,447,450],{"class":148,"line":431},10,[146,433,434],{"class":160},"    \"Authorization\"",[146,436,437],{"class":263},": ",[146,439,440],{"class":259},"f",[146,442,443],{"class":160},"\"Bearer ",[146,445,446],{"class":156},"{API_KEY}",[146,448,449],{"class":160},"\"",[146,451,452],{"class":263},",\n",[146,454,456,459,461],{"class":148,"line":455},11,[146,457,458],{"class":160},"    \"Content-Type\"",[146,460,437],{"class":263},[146,462,463],{"class":160},"\"application/json\"\n",[146,465,467],{"class":148,"line":466},12,[146,468,469],{"class":263},"}\n",[11,471,472],{},"한 줄씩 설명합니다:",[97,474,475,483,494],{},[73,476,477,482],{},[23,478,479],{},[28,480,481],{},"os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")"," — 환경 변수에서 API Key를 읽습니다. 두 번째 인자는 기본값입니다(로컬 테스트 시에만 실제 Key로 교체하세요).",[73,484,485,489,490,493],{},[23,486,487],{},[28,488,412],{}," — 모든 EvoLink API 엔드포인트의 루트 URL입니다. 모든 요청은 ",[28,491,492],{},"https://api.evolink.ai/v1/...","으로 전송됩니다.",[73,495,496,500,501,504,505,508],{},[23,497,498],{},[28,499,423],{}," — 모든 요청에 포함되는 두 개의 헤더: ",[28,502,503],{},"Authorization","은 Bearer Token 방식으로 API Key를 전달하고, ",[28,506,507],{},"Content-Type","은 서버에 JSON을 보내고 있음을 알립니다.",[11,510,511],{},"다음으로 재사용 가능한 헬퍼 함수를 추가합니다:",[137,513,515],{"className":338,"code":514,"language":340,"meta":142,"style":142},"# ── 재사용 가능한 Polling 헬퍼 ────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"\n    비디오 생성 작업을 완료 또는 실패할 때까지 polling합니다.\n    \n    Args:\n        task_id: 생성 엔드포인트가 반환한 작업 ID.\n        poll_interval: polling 간격 초(기본 10).\n        timeout: 최대 대기 시간 초(기본 600).\n    \n    Returns:\n        dict: 비디오 URL이 포함된 완료된 작업 응답.\n    \n    Raises:\n        TimeoutError: 작업이 타임아웃 내에 완료되지 않은 경우.\n        RuntimeError: 작업이 실패한 경우.\n    \"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        # GET 요청으로 작업의 현재 상태 확인\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        # HTTP 상태 코드가 오류를 나타내면 예외 발생\n        response.raise_for_status()\n        task = response.json()\n\n        # 응답에서 상태와 진행률 추출\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n\n        # 종료 상태 확인\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            error_info = task.get(\"error\", {})\n            raise RuntimeError(\n                f\"Task {task_id} failed: {error_info.get('message', 'Unknown error')}\"\n            )\n\n        # 다음 polling 전 대기\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n",[28,516,517,522,549,554,559,564,569,574,579,584,588,593,598,603,609,615,621,626,637,652,658,669,696,708,714,720,726,737,742,748,765,786,832,837,843,861,870,885,901,913,951,957,962,968,974,986,991],{"__ignoreMap":142},[146,518,519],{"class":148,"line":149},[146,520,521],{"class":175},"# ── 재사용 가능한 Polling 헬퍼 ────────────────────────────────\n",[146,523,524,527,530,533,535,538,541,543,546],{"class":148,"line":167},[146,525,526],{"class":259},"def",[146,528,529],{"class":152}," wait_for_video",[146,531,532],{"class":263},"(task_id, poll_interval",[146,534,267],{"class":259},[146,536,537],{"class":156},"10",[146,539,540],{"class":263},", timeout",[146,542,267],{"class":259},[146,544,545],{"class":156},"600",[146,547,548],{"class":263},"):\n",[146,550,551],{"class":148,"line":179},[146,552,553],{"class":160},"    \"\"\"\n",[146,555,556],{"class":148,"line":188},[146,557,558],{"class":160},"    비디오 생성 작업을 완료 또는 실패할 때까지 polling합니다.\n",[146,560,561],{"class":148,"line":373},[146,562,563],{"class":160},"    \n",[146,565,566],{"class":148,"line":379},[146,567,568],{"class":160},"    Args:\n",[146,570,571],{"class":148,"line":385},[146,572,573],{"class":160},"        task_id: 생성 엔드포인트가 반환한 작업 ID.\n",[146,575,576],{"class":148,"line":409},[146,577,578],{"class":160},"        poll_interval: polling 간격 초(기본 10).\n",[146,580,581],{"class":148,"line":420},[146,582,583],{"class":160},"        timeout: 최대 대기 시간 초(기본 600).\n",[146,585,586],{"class":148,"line":431},[146,587,563],{"class":160},[146,589,590],{"class":148,"line":455},[146,591,592],{"class":160},"    Returns:\n",[146,594,595],{"class":148,"line":466},[146,596,597],{"class":160},"        dict: 비디오 URL이 포함된 완료된 작업 응답.\n",[146,599,601],{"class":148,"line":600},13,[146,602,563],{"class":160},[146,604,606],{"class":148,"line":605},14,[146,607,608],{"class":160},"    Raises:\n",[146,610,612],{"class":148,"line":611},15,[146,613,614],{"class":160},"        TimeoutError: 작업이 타임아웃 내에 완료되지 않은 경우.\n",[146,616,618],{"class":148,"line":617},16,[146,619,620],{"class":160},"        RuntimeError: 작업이 실패한 경우.\n",[146,622,624],{"class":148,"line":623},17,[146,625,553],{"class":160},[146,627,629,632,634],{"class":148,"line":628},18,[146,630,631],{"class":263},"    elapsed ",[146,633,267],{"class":259},[146,635,636],{"class":156}," 0\n",[146,638,640,643,646,649],{"class":148,"line":639},19,[146,641,642],{"class":259},"    while",[146,644,645],{"class":263}," elapsed ",[146,647,648],{"class":259},"\u003C",[146,650,651],{"class":263}," timeout:\n",[146,653,655],{"class":148,"line":654},20,[146,656,657],{"class":175},"        # GET 요청으로 작업의 현재 상태 확인\n",[146,659,661,664,666],{"class":148,"line":660},21,[146,662,663],{"class":263},"        response ",[146,665,267],{"class":259},[146,667,668],{"class":263}," requests.get(\n",[146,670,672,675,677,680,683,686,689,692,694],{"class":148,"line":671},22,[146,673,674],{"class":259},"            f",[146,676,449],{"class":160},[146,678,679],{"class":156},"{BASE_URL}",[146,681,682],{"class":160},"/tasks/",[146,684,685],{"class":156},"{",[146,687,688],{"class":263},"task_id",[146,690,691],{"class":156},"}",[146,693,449],{"class":160},[146,695,452],{"class":263},[146,697,699,703,705],{"class":148,"line":698},23,[146,700,702],{"class":701},"s9osk","            headers",[146,704,267],{"class":259},[146,706,707],{"class":156},"HEADERS\n",[146,709,711],{"class":148,"line":710},24,[146,712,713],{"class":263},"        )\n",[146,715,717],{"class":148,"line":716},25,[146,718,719],{"class":175},"        # HTTP 상태 코드가 오류를 나타내면 예외 발생\n",[146,721,723],{"class":148,"line":722},26,[146,724,725],{"class":263},"        response.raise_for_status()\n",[146,727,729,732,734],{"class":148,"line":728},27,[146,730,731],{"class":263},"        task ",[146,733,267],{"class":259},[146,735,736],{"class":263}," response.json()\n",[146,738,740],{"class":148,"line":739},28,[146,741,376],{"emptyLinePlaceholder":58},[146,743,745],{"class":148,"line":744},29,[146,746,747],{"class":175},"        # 응답에서 상태와 진행률 추출\n",[146,749,751,754,756,759,762],{"class":148,"line":750},30,[146,752,753],{"class":263},"        status ",[146,755,267],{"class":259},[146,757,758],{"class":263}," task[",[146,760,761],{"class":160},"\"status\"",[146,763,764],{"class":263},"]\n",[146,766,768,771,773,776,779,781,784],{"class":148,"line":767},31,[146,769,770],{"class":263},"        progress ",[146,772,267],{"class":259},[146,774,775],{"class":263}," task.get(",[146,777,778],{"class":160},"\"progress\"",[146,780,400],{"class":263},[146,782,783],{"class":156},"0",[146,785,406],{"class":263},[146,787,789,792,795,797,800,802,805,807,810,812,815,817,820,822,825,827,830],{"class":148,"line":788},32,[146,790,791],{"class":156},"        print",[146,793,794],{"class":263},"(",[146,796,440],{"class":259},[146,798,799],{"class":160},"\"  [",[146,801,685],{"class":156},[146,803,804],{"class":263},"elapsed",[146,806,691],{"class":156},[146,808,809],{"class":160},"s] Status: ",[146,811,685],{"class":156},[146,813,814],{"class":263},"status",[146,816,691],{"class":156},[146,818,819],{"class":160}," | Progress: ",[146,821,685],{"class":156},[146,823,824],{"class":263},"progress",[146,826,691],{"class":156},[146,828,829],{"class":160},"%\"",[146,831,406],{"class":263},[146,833,835],{"class":148,"line":834},33,[146,836,376],{"emptyLinePlaceholder":58},[146,838,840],{"class":148,"line":839},34,[146,841,842],{"class":175},"        # 종료 상태 확인\n",[146,844,846,849,852,855,858],{"class":148,"line":845},35,[146,847,848],{"class":259},"        if",[146,850,851],{"class":263}," status ",[146,853,854],{"class":259},"==",[146,856,857],{"class":160}," \"completed\"",[146,859,860],{"class":263},":\n",[146,862,864,867],{"class":148,"line":863},36,[146,865,866],{"class":259},"            return",[146,868,869],{"class":263}," task\n",[146,871,873,876,878,880,883],{"class":148,"line":872},37,[146,874,875],{"class":259},"        elif",[146,877,851],{"class":263},[146,879,854],{"class":259},[146,881,882],{"class":160}," \"failed\"",[146,884,860],{"class":263},[146,886,888,891,893,895,898],{"class":148,"line":887},38,[146,889,890],{"class":263},"            error_info ",[146,892,267],{"class":259},[146,894,775],{"class":263},[146,896,897],{"class":160},"\"error\"",[146,899,900],{"class":263},", {})\n",[146,902,904,907,910],{"class":148,"line":903},39,[146,905,906],{"class":259},"            raise",[146,908,909],{"class":156}," RuntimeError",[146,911,912],{"class":263},"(\n",[146,914,916,919,922,924,926,928,931,933,936,939,941,944,946,948],{"class":148,"line":915},40,[146,917,918],{"class":259},"                f",[146,920,921],{"class":160},"\"Task ",[146,923,685],{"class":156},[146,925,688],{"class":263},[146,927,691],{"class":156},[146,929,930],{"class":160}," failed: ",[146,932,685],{"class":156},[146,934,935],{"class":263},"error_info.get(",[146,937,938],{"class":160},"'message'",[146,940,400],{"class":263},[146,942,943],{"class":160},"'Unknown error'",[146,945,118],{"class":263},[146,947,691],{"class":156},[146,949,950],{"class":160},"\"\n",[146,952,954],{"class":148,"line":953},41,[146,955,956],{"class":263},"            )\n",[146,958,960],{"class":148,"line":959},42,[146,961,376],{"emptyLinePlaceholder":58},[146,963,965],{"class":148,"line":964},43,[146,966,967],{"class":175},"        # 다음 polling 전 대기\n",[146,969,971],{"class":148,"line":970},44,[146,972,973],{"class":263},"        time.sleep(poll_interval)\n",[146,975,977,980,983],{"class":148,"line":976},45,[146,978,979],{"class":263},"        elapsed ",[146,981,982],{"class":259},"+=",[146,984,985],{"class":263}," poll_interval\n",[146,987,989],{"class":148,"line":988},46,[146,990,376],{"emptyLinePlaceholder":58},[146,992,994,997,1000,1002,1004,1006,1008,1010,1012,1015,1017,1020,1022,1025],{"class":148,"line":993},47,[146,995,996],{"class":259},"    raise",[146,998,999],{"class":156}," TimeoutError",[146,1001,794],{"class":263},[146,1003,440],{"class":259},[146,1005,921],{"class":160},[146,1007,685],{"class":156},[146,1009,688],{"class":263},[146,1011,691],{"class":156},[146,1013,1014],{"class":160}," timed out after ",[146,1016,685],{"class":156},[146,1018,1019],{"class":263},"timeout",[146,1021,691],{"class":156},[146,1023,1024],{"class":160},"s\"",[146,1026,406],{"class":263},[11,1028,1029],{},"이 함수의 주요 설계 결정:",[97,1031,1032,1040,1048,1056],{},[73,1033,1034,1039],{},[23,1035,1036],{},[28,1037,1038],{},"poll_interval=10"," — 10초가 최적입니다. 더 빠르면 API 할당량을 낭비하고, 더 느리면 워크플로우가 지연됩니다.",[73,1041,1042,1047],{},[23,1043,1044],{},[28,1045,1046],{},"timeout=600"," — 10분은 충분히 여유 있습니다. 대부분의 비디오는 30~120초 내에 완료되지만, 큐 혼잡 같은 극단적인 경우를 커버합니다.",[73,1049,1050,1055],{},[23,1051,1052],{},[28,1053,1054],{},"response.raise_for_status()"," — HTTP 오류(4xx/5xx)를 Python 예외로 변환하여 조용히 넘어가지 않게 합니다.",[73,1057,1058,1061,1062,1065],{},[23,1059,1060],{},"진행률 출력"," — ",[28,1063,1064],{},"[elapsed]s"," 접두사로 시간을 연관시킬 수 있습니다. 느린 생성을 디버깅할 때 유용합니다.",[137,1067,1069],{"className":338,"code":1068,"language":340,"meta":142,"style":142},"# ── 헬퍼: 비디오 다운로드 ─────────────────────────────────────\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"URL에서 비디오 파일을 다운로드합니다.\"\"\"\n    print(f\"Downloading video to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n",[28,1070,1071,1076,1093,1098,1122,1142,1147,1170,1194,1199],{"__ignoreMap":142},[146,1072,1073],{"class":148,"line":149},[146,1074,1075],{"class":175},"# ── 헬퍼: 비디오 다운로드 ─────────────────────────────────────\n",[146,1077,1078,1080,1083,1086,1088,1091],{"class":148,"line":167},[146,1079,526],{"class":259},[146,1081,1082],{"class":152}," download_video",[146,1084,1085],{"class":263},"(url, filename",[146,1087,267],{"class":259},[146,1089,1090],{"class":160},"\"output.mp4\"",[146,1092,548],{"class":263},[146,1094,1095],{"class":148,"line":179},[146,1096,1097],{"class":160},"    \"\"\"URL에서 비디오 파일을 다운로드합니다.\"\"\"\n",[146,1099,1100,1103,1105,1107,1110,1112,1115,1117,1120],{"class":148,"line":188},[146,1101,1102],{"class":156},"    print",[146,1104,794],{"class":263},[146,1106,440],{"class":259},[146,1108,1109],{"class":160},"\"Downloading video to ",[146,1111,685],{"class":156},[146,1113,1114],{"class":263},"filename",[146,1116,691],{"class":156},[146,1118,1119],{"class":160},"...\"",[146,1121,406],{"class":263},[146,1123,1124,1127,1129,1132,1135,1137,1140],{"class":148,"line":373},[146,1125,1126],{"class":263},"    resp ",[146,1128,267],{"class":259},[146,1130,1131],{"class":263}," requests.get(url, ",[146,1133,1134],{"class":701},"stream",[146,1136,267],{"class":259},[146,1138,1139],{"class":156},"True",[146,1141,406],{"class":263},[146,1143,1144],{"class":148,"line":379},[146,1145,1146],{"class":263},"    resp.raise_for_status()\n",[146,1148,1149,1152,1155,1158,1161,1164,1167],{"class":148,"line":385},[146,1150,1151],{"class":259},"    with",[146,1153,1154],{"class":156}," open",[146,1156,1157],{"class":263},"(filename, ",[146,1159,1160],{"class":160},"\"wb\"",[146,1162,1163],{"class":263},") ",[146,1165,1166],{"class":259},"as",[146,1168,1169],{"class":263}," f:\n",[146,1171,1172,1175,1178,1181,1184,1187,1189,1192],{"class":148,"line":409},[146,1173,1174],{"class":259},"        for",[146,1176,1177],{"class":263}," chunk ",[146,1179,1180],{"class":259},"in",[146,1182,1183],{"class":263}," resp.iter_content(",[146,1185,1186],{"class":701},"chunk_size",[146,1188,267],{"class":259},[146,1190,1191],{"class":156},"8192",[146,1193,548],{"class":263},[146,1195,1196],{"class":148,"line":420},[146,1197,1198],{"class":263},"            f.write(chunk)\n",[146,1200,1201,1203,1205,1207,1210,1212,1214,1216,1218,1220,1223,1226,1229,1232,1234,1237],{"class":148,"line":431},[146,1202,1102],{"class":156},[146,1204,794],{"class":263},[146,1206,440],{"class":259},[146,1208,1209],{"class":160},"\"Saved: ",[146,1211,685],{"class":156},[146,1213,1114],{"class":263},[146,1215,691],{"class":156},[146,1217,104],{"class":160},[146,1219,685],{"class":156},[146,1221,1222],{"class":263},"os.path.getsize(filename) ",[146,1224,1225],{"class":259},"/",[146,1227,1228],{"class":156}," 1024",[146,1230,1231],{"class":259},":.0f",[146,1233,691],{"class":156},[146,1235,1236],{"class":160}," KB)\"",[146,1238,406],{"class":263},[11,1240,1241,1242,1245,1246,1248],{},"이 함수는 전체 비디오를 메모리에 로드하는 대신 8 KB 청크 단위로 스트리밍 다운로드합니다. 이 점이 중요한데, 생성된 비디오는 10~50 MB가 될 수 있습니다. ",[28,1243,1244],{},"stream=True"," 파라미터는 ",[28,1247,113],{},"에 점진적으로 다운로드하도록 지시합니다.",[11,1250,1251],{},"이 세 가지 — 설정, polling, 다운로드 — 가 기본 뼈대입니다. 아래의 모든 코드 예제에서 사용됩니다. 반복하지 않고 새로운 payload만 보여드리겠습니다.",[11,1253,1254,1255,1260],{},"전체 API 레퍼런스는 ",[37,1256,1259],{"href":1257,"rel":1258},"https://seedance2api.app/docs/video-generation",[41],"비디오 생성 문서","를 참조하세요.",[45,1262],{},[48,1264,1266],{"id":1265},"첫-번째-비디오-생성-텍스트-투-비디오","첫 번째 비디오 생성 (텍스트-투-비디오)",[11,1268,1269],{},"비디오를 생성해 봅시다. 스크립트에 다음 코드를 추가하세요:",[137,1271,1273],{"className":338,"code":1272,"language":340,"meta":142,"style":142},"# ── 텍스트-투-비디오 ──────────────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",          # 사용할 AI 모델\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,                     # 비디오 길이: 4-15초\n        \"quality\": \"720p\",                 # 해상도: 480p, 720p, 1080p\n        \"aspect_ratio\": \"16:9\",            # 표준 와이드스크린\n        \"generate_audio\": True             # AI가 매칭되는 오디오 생성\n    }\n\n    print(\"Submitting text-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",  # 비디오 생성 엔드포인트\n        headers=HEADERS,                   # 인증 + content-type 헤더\n        json=payload                       # 자동으로 JSON 직렬화\n    )\n    response.raise_for_status()            # 200이 아니면 예외 발생\n    task = response.json()                 # JSON 응답 파싱\n\n    # 응답의 주요 정보 출력\n    print(f\"Task created: {task['id']}\")\n    print(f\"Estimated time: {task['task_info']['estimated_time']}s\")\n    print(f\"Credits reserved: {task['usage']['credits_reserved']}\")\n\n    # 비디오가 준비될 때까지 polling\n    result = wait_for_video(task[\"id\"])\n\n    # results 배열에 하나 이상의 비디오 URL 포함\n    video_url = result[\"results\"][0]\n    print(f\"\\nVideo URL: {video_url}\")\n    download_video(video_url, \"my_first_video.mp4\")\n\n    return result\n\n\nif __name__ == \"__main__\":\n    text_to_video()\n",[28,1274,1275,1280,1290,1299,1315,1323,1328,1333,1338,1343,1359,1375,1391,1403,1408,1412,1423,1433,1451,1466,1479,1484,1492,1505,1509,1514,1542,1574,1605,1609,1614,1630,1634,1639,1658,1685,1695,1699,1707,1711,1715,1731],{"__ignoreMap":142},[146,1276,1277],{"class":148,"line":149},[146,1278,1279],{"class":175},"# ── 텍스트-투-비디오 ──────────────────────────────────────────\n",[146,1281,1282,1284,1287],{"class":148,"line":167},[146,1283,526],{"class":259},[146,1285,1286],{"class":152}," text_to_video",[146,1288,1289],{"class":263},"():\n",[146,1291,1292,1295,1297],{"class":148,"line":179},[146,1293,1294],{"class":263},"    payload ",[146,1296,267],{"class":259},[146,1298,428],{"class":263},[146,1300,1301,1304,1306,1309,1312],{"class":148,"line":188},[146,1302,1303],{"class":160},"        \"model\"",[146,1305,437],{"class":263},[146,1307,1308],{"class":160},"\"seedance-2.0\"",[146,1310,1311],{"class":263},",          ",[146,1313,1314],{"class":175},"# 사용할 AI 모델\n",[146,1316,1317,1320],{"class":148,"line":373},[146,1318,1319],{"class":160},"        \"prompt\"",[146,1321,1322],{"class":263},": (\n",[146,1324,1325],{"class":148,"line":379},[146,1326,1327],{"class":160},"            \"A golden retriever puppy chases a butterfly through \"\n",[146,1329,1330],{"class":148,"line":385},[146,1331,1332],{"class":160},"            \"a sunlit meadow. The camera follows the puppy with a \"\n",[146,1334,1335],{"class":148,"line":409},[146,1336,1337],{"class":160},"            \"smooth tracking shot as wildflowers sway in the breeze.\"\n",[146,1339,1340],{"class":148,"line":420},[146,1341,1342],{"class":263},"        ),\n",[146,1344,1345,1348,1350,1353,1356],{"class":148,"line":431},[146,1346,1347],{"class":160},"        \"duration\"",[146,1349,437],{"class":263},[146,1351,1352],{"class":156},"5",[146,1354,1355],{"class":263},",                     ",[146,1357,1358],{"class":175},"# 비디오 길이: 4-15초\n",[146,1360,1361,1364,1366,1369,1372],{"class":148,"line":455},[146,1362,1363],{"class":160},"        \"quality\"",[146,1365,437],{"class":263},[146,1367,1368],{"class":160},"\"720p\"",[146,1370,1371],{"class":263},",                 ",[146,1373,1374],{"class":175},"# 해상도: 480p, 720p, 1080p\n",[146,1376,1377,1380,1382,1385,1388],{"class":148,"line":466},[146,1378,1379],{"class":160},"        \"aspect_ratio\"",[146,1381,437],{"class":263},[146,1383,1384],{"class":160},"\"16:9\"",[146,1386,1387],{"class":263},",            ",[146,1389,1390],{"class":175},"# 표준 와이드스크린\n",[146,1392,1393,1396,1398,1400],{"class":148,"line":600},[146,1394,1395],{"class":160},"        \"generate_audio\"",[146,1397,437],{"class":263},[146,1399,1139],{"class":156},[146,1401,1402],{"class":175},"             # AI가 매칭되는 오디오 생성\n",[146,1404,1405],{"class":148,"line":605},[146,1406,1407],{"class":263},"    }\n",[146,1409,1410],{"class":148,"line":611},[146,1411,376],{"emptyLinePlaceholder":58},[146,1413,1414,1416,1418,1421],{"class":148,"line":617},[146,1415,1102],{"class":156},[146,1417,794],{"class":263},[146,1419,1420],{"class":160},"\"Submitting text-to-video request...\"",[146,1422,406],{"class":263},[146,1424,1425,1428,1430],{"class":148,"line":623},[146,1426,1427],{"class":263},"    response ",[146,1429,267],{"class":259},[146,1431,1432],{"class":263}," requests.post(\n",[146,1434,1435,1438,1440,1442,1445,1448],{"class":148,"line":628},[146,1436,1437],{"class":259},"        f",[146,1439,449],{"class":160},[146,1441,679],{"class":156},[146,1443,1444],{"class":160},"/videos/generations\"",[146,1446,1447],{"class":263},",  ",[146,1449,1450],{"class":175},"# 비디오 생성 엔드포인트\n",[146,1452,1453,1456,1458,1460,1463],{"class":148,"line":639},[146,1454,1455],{"class":701},"        headers",[146,1457,267],{"class":259},[146,1459,423],{"class":156},[146,1461,1462],{"class":263},",                   ",[146,1464,1465],{"class":175},"# 인증 + content-type 헤더\n",[146,1467,1468,1471,1473,1476],{"class":148,"line":654},[146,1469,1470],{"class":701},"        json",[146,1472,267],{"class":259},[146,1474,1475],{"class":263},"payload                       ",[146,1477,1478],{"class":175},"# 자동으로 JSON 직렬화\n",[146,1480,1481],{"class":148,"line":660},[146,1482,1483],{"class":263},"    )\n",[146,1485,1486,1489],{"class":148,"line":671},[146,1487,1488],{"class":263},"    response.raise_for_status()            ",[146,1490,1491],{"class":175},"# 200이 아니면 예외 발생\n",[146,1493,1494,1497,1499,1502],{"class":148,"line":698},[146,1495,1496],{"class":263},"    task ",[146,1498,267],{"class":259},[146,1500,1501],{"class":263}," response.json()                 ",[146,1503,1504],{"class":175},"# JSON 응답 파싱\n",[146,1506,1507],{"class":148,"line":710},[146,1508,376],{"emptyLinePlaceholder":58},[146,1510,1511],{"class":148,"line":716},[146,1512,1513],{"class":175},"    # 응답의 주요 정보 출력\n",[146,1515,1516,1518,1520,1522,1525,1527,1530,1533,1536,1538,1540],{"class":148,"line":722},[146,1517,1102],{"class":156},[146,1519,794],{"class":263},[146,1521,440],{"class":259},[146,1523,1524],{"class":160},"\"Task created: ",[146,1526,685],{"class":156},[146,1528,1529],{"class":263},"task[",[146,1531,1532],{"class":160},"'id'",[146,1534,1535],{"class":263},"]",[146,1537,691],{"class":156},[146,1539,449],{"class":160},[146,1541,406],{"class":263},[146,1543,1544,1546,1548,1550,1553,1555,1557,1560,1563,1566,1568,1570,1572],{"class":148,"line":728},[146,1545,1102],{"class":156},[146,1547,794],{"class":263},[146,1549,440],{"class":259},[146,1551,1552],{"class":160},"\"Estimated time: ",[146,1554,685],{"class":156},[146,1556,1529],{"class":263},[146,1558,1559],{"class":160},"'task_info'",[146,1561,1562],{"class":263},"][",[146,1564,1565],{"class":160},"'estimated_time'",[146,1567,1535],{"class":263},[146,1569,691],{"class":156},[146,1571,1024],{"class":160},[146,1573,406],{"class":263},[146,1575,1576,1578,1580,1582,1585,1587,1589,1592,1594,1597,1599,1601,1603],{"class":148,"line":739},[146,1577,1102],{"class":156},[146,1579,794],{"class":263},[146,1581,440],{"class":259},[146,1583,1584],{"class":160},"\"Credits reserved: ",[146,1586,685],{"class":156},[146,1588,1529],{"class":263},[146,1590,1591],{"class":160},"'usage'",[146,1593,1562],{"class":263},[146,1595,1596],{"class":160},"'credits_reserved'",[146,1598,1535],{"class":263},[146,1600,691],{"class":156},[146,1602,449],{"class":160},[146,1604,406],{"class":263},[146,1606,1607],{"class":148,"line":744},[146,1608,376],{"emptyLinePlaceholder":58},[146,1610,1611],{"class":148,"line":750},[146,1612,1613],{"class":175},"    # 비디오가 준비될 때까지 polling\n",[146,1615,1616,1619,1621,1624,1627],{"class":148,"line":767},[146,1617,1618],{"class":263},"    result ",[146,1620,267],{"class":259},[146,1622,1623],{"class":263}," wait_for_video(task[",[146,1625,1626],{"class":160},"\"id\"",[146,1628,1629],{"class":263},"])\n",[146,1631,1632],{"class":148,"line":788},[146,1633,376],{"emptyLinePlaceholder":58},[146,1635,1636],{"class":148,"line":834},[146,1637,1638],{"class":175},"    # results 배열에 하나 이상의 비디오 URL 포함\n",[146,1640,1641,1644,1646,1649,1652,1654,1656],{"class":148,"line":839},[146,1642,1643],{"class":263},"    video_url ",[146,1645,267],{"class":259},[146,1647,1648],{"class":263}," result[",[146,1650,1651],{"class":160},"\"results\"",[146,1653,1562],{"class":263},[146,1655,783],{"class":156},[146,1657,764],{"class":263},[146,1659,1660,1662,1664,1666,1668,1671,1674,1676,1679,1681,1683],{"class":148,"line":845},[146,1661,1102],{"class":156},[146,1663,794],{"class":263},[146,1665,440],{"class":259},[146,1667,449],{"class":160},[146,1669,1670],{"class":156},"\\n",[146,1672,1673],{"class":160},"Video URL: ",[146,1675,685],{"class":156},[146,1677,1678],{"class":263},"video_url",[146,1680,691],{"class":156},[146,1682,449],{"class":160},[146,1684,406],{"class":263},[146,1686,1687,1690,1693],{"class":148,"line":863},[146,1688,1689],{"class":263},"    download_video(video_url, ",[146,1691,1692],{"class":160},"\"my_first_video.mp4\"",[146,1694,406],{"class":263},[146,1696,1697],{"class":148,"line":872},[146,1698,376],{"emptyLinePlaceholder":58},[146,1700,1701,1704],{"class":148,"line":887},[146,1702,1703],{"class":259},"    return",[146,1705,1706],{"class":263}," result\n",[146,1708,1709],{"class":148,"line":903},[146,1710,376],{"emptyLinePlaceholder":58},[146,1712,1713],{"class":148,"line":915},[146,1714,376],{"emptyLinePlaceholder":58},[146,1716,1717,1720,1723,1726,1729],{"class":148,"line":953},[146,1718,1719],{"class":259},"if",[146,1721,1722],{"class":156}," __name__",[146,1724,1725],{"class":259}," ==",[146,1727,1728],{"class":160}," \"__main__\"",[146,1730,860],{"class":263},[146,1732,1733],{"class":148,"line":959},[146,1734,1735],{"class":263},"    text_to_video()\n",[11,1737,1738],{},"payload의 각 파라미터를 설명합니다:",[97,1740,1741,1756,1768,1776,1796,1816],{},[73,1742,1743,1748,1749,1752,1753,1755],{},[23,1744,1745],{},[28,1746,1747],{},"model"," — 사용할 Seedance 모델. 최신 버전은 ",[28,1750,1751],{},"seedance-2.0","으로 설정하고, 해당 지역에서 2.0을 아직 사용할 수 없다면 ",[28,1754,30],{},"를 사용하세요.",[73,1757,1758,1763,1764,1260],{},[23,1759,1760],{},[28,1761,1762],{},"prompt"," — 비디오 설명. 주체, 동작, 카메라 움직임, 분위기를 구체적으로 기술하세요. 위 프롬프트는 세 부분 구조를 사용합니다: 주체(\"golden retriever puppy\"), 동작(\"chases a butterfly\"), 카메라(\"smooth tracking shot\"). 고급 프롬프트 기법은 ",[37,1765,1767],{"href":1766},"/blog/seedance-2-prompt-guide","프롬프트 엔지니어링 가이드",[73,1769,1770,1775],{},[23,1771,1772],{},[28,1773,1774],{},"duration"," — 비디오 길이(초, 4~15). 짧은 비디오가 더 빠르게 생성되고 크레딧도 적게 소모됩니다. 테스트에는 5초를 권장합니다.",[73,1777,1778,1783,1784,1787,1788,1791,1792,1795],{},[23,1779,1780],{},[28,1781,1782],{},"quality"," — 해상도 등급. ",[28,1785,1786],{},"720p","는 개발 단계에서 품질과 속도의 최적 균형입니다. ",[28,1789,1790],{},"480p","는 빠른 반복에, ",[28,1793,1794],{},"1080p","는 최종 렌더링에 사용하세요.",[73,1797,1798,1803,1804,1807,1808,1811,1812,1815],{},[23,1799,1800],{},[28,1801,1802],{},"aspect_ratio"," — 출력 비율. ",[28,1805,1806],{},"16:9","는 YouTube/가로, ",[28,1809,1810],{},"9:16","은 TikTok/Reels/Shorts, ",[28,1813,1814],{},"1:1","은 Instagram 피드에 적합합니다.",[73,1817,1818,1061,1823,1826],{},[23,1819,1820],{},[28,1821,1822],{},"generate_audio",[28,1824,1825],{},"true","로 설정하면 Seedance가 시각적 콘텐츠에 맞는 환경음과 음악을 생성합니다. 생성 시간이 약 2초 추가됩니다.",[11,1828,1829],{},"실행:",[137,1831,1833],{"className":139,"code":1832,"language":141,"meta":142,"style":142},"python seedance_tutorial.py\n",[28,1834,1835],{"__ignoreMap":142},[146,1836,1837,1839],{"class":148,"line":149},[146,1838,340],{"class":152},[146,1840,1841],{"class":160}," seedance_tutorial.py\n",[92,1843,1845],{"id":1844},"api-응답-내용","API 응답 내용",[11,1847,1848,1849,1852],{},"생성 요청을 제출하면 즉시 ",[23,1850,1851],{},"task 객체","를 받습니다 — 비디오는 아직 준비되지 않았습니다. 실제 응답은 다음과 같습니다:",[137,1854,1858],{"className":1855,"code":1856,"language":1857,"meta":142,"style":142},"language-json shiki shiki-themes github-dark","{\n  \"created\": 1772203771,\n  \"id\": \"task-unified-1772203771-yf1dxogh\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 132\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n","json",[28,1859,1860,1865,1877,1889,1900,1912,1923,1935,1943,1954,1964,1969,1981,1988,2000,2012,2022,2027],{"__ignoreMap":142},[146,1861,1862],{"class":148,"line":149},[146,1863,1864],{"class":263},"{\n",[146,1866,1867,1870,1872,1875],{"class":148,"line":167},[146,1868,1869],{"class":156},"  \"created\"",[146,1871,437],{"class":263},[146,1873,1874],{"class":156},"1772203771",[146,1876,452],{"class":263},[146,1878,1879,1882,1884,1887],{"class":148,"line":179},[146,1880,1881],{"class":156},"  \"id\"",[146,1883,437],{"class":263},[146,1885,1886],{"class":160},"\"task-unified-1772203771-yf1dxogh\"",[146,1888,452],{"class":263},[146,1890,1891,1894,1896,1898],{"class":148,"line":188},[146,1892,1893],{"class":156},"  \"model\"",[146,1895,437],{"class":263},[146,1897,1308],{"class":160},[146,1899,452],{"class":263},[146,1901,1902,1905,1907,1910],{"class":148,"line":373},[146,1903,1904],{"class":156},"  \"object\"",[146,1906,437],{"class":263},[146,1908,1909],{"class":160},"\"video.generation.task\"",[146,1911,452],{"class":263},[146,1913,1914,1917,1919,1921],{"class":148,"line":379},[146,1915,1916],{"class":156},"  \"progress\"",[146,1918,437],{"class":263},[146,1920,783],{"class":156},[146,1922,452],{"class":263},[146,1924,1925,1928,1930,1933],{"class":148,"line":385},[146,1926,1927],{"class":156},"  \"status\"",[146,1929,437],{"class":263},[146,1931,1932],{"class":160},"\"pending\"",[146,1934,452],{"class":263},[146,1936,1937,1940],{"class":148,"line":409},[146,1938,1939],{"class":156},"  \"task_info\"",[146,1941,1942],{"class":263},": {\n",[146,1944,1945,1948,1950,1952],{"class":148,"line":420},[146,1946,1947],{"class":156},"    \"can_cancel\"",[146,1949,437],{"class":263},[146,1951,1825],{"class":156},[146,1953,452],{"class":263},[146,1955,1956,1959,1961],{"class":148,"line":431},[146,1957,1958],{"class":156},"    \"estimated_time\"",[146,1960,437],{"class":263},[146,1962,1963],{"class":156},"132\n",[146,1965,1966],{"class":148,"line":455},[146,1967,1968],{"class":263},"  },\n",[146,1970,1971,1974,1976,1979],{"class":148,"line":466},[146,1972,1973],{"class":156},"  \"type\"",[146,1975,437],{"class":263},[146,1977,1978],{"class":160},"\"video\"",[146,1980,452],{"class":263},[146,1982,1983,1986],{"class":148,"line":600},[146,1984,1985],{"class":156},"  \"usage\"",[146,1987,1942],{"class":263},[146,1989,1990,1993,1995,1998],{"class":148,"line":605},[146,1991,1992],{"class":156},"    \"billing_rule\"",[146,1994,437],{"class":263},[146,1996,1997],{"class":160},"\"per_second\"",[146,1999,452],{"class":263},[146,2001,2002,2005,2007,2010],{"class":148,"line":611},[146,2003,2004],{"class":156},"    \"credits_reserved\"",[146,2006,437],{"class":263},[146,2008,2009],{"class":156},"17.784",[146,2011,452],{"class":263},[146,2013,2014,2017,2019],{"class":148,"line":617},[146,2015,2016],{"class":156},"    \"user_group\"",[146,2018,437],{"class":263},[146,2020,2021],{"class":160},"\"default\"\n",[146,2023,2024],{"class":148,"line":623},[146,2025,2026],{"class":263},"  }\n",[146,2028,2029],{"class":148,"line":628},[146,2030,469],{"class":263},[11,2032,2033],{},"주요 필드 설명:",[2035,2036,2037,2050],"table",{},[2038,2039,2040],"thead",{},[2041,2042,2043,2047],"tr",{},[2044,2045,2046],"th",{},"필드",[2044,2048,2049],{},"의미",[2051,2052,2053,2064,2087,2099,2109,2119,2131,2141],"tbody",{},[2041,2054,2055,2061],{},[2056,2057,2058],"td",{},[28,2059,2060],{},"id",[2056,2062,2063],{},"작업 ID — 상태 확인과 결과 조회에 사용",[2041,2065,2066,2070],{},[2056,2067,2068],{},[28,2069,814],{},[2056,2071,2072,2075,2076,2079,2080,281,2083,2086],{},[28,2073,2074],{},"pending","으로 시작, ",[28,2077,2078],{},"processing","을 거쳐 ",[28,2081,2082],{},"completed",[28,2084,2085],{},"failed","로 변경",[2041,2088,2089,2093],{},[2056,2090,2091],{},[28,2092,824],{},[2056,2094,2095,2096,2098],{},"0~100 백분율. ",[28,2097,2078],{}," 단계에서 실시간 업데이트",[2041,2100,2101,2106],{},[2056,2102,2103],{},[28,2104,2105],{},"estimated_time",[2056,2107,2108],{},"예상 완료 시간(초), 서버 측 추정치",[2041,2110,2111,2116],{},[2056,2112,2113],{},[28,2114,2115],{},"credits_reserved",[2056,2117,2118],{},"이 작업에 예약된 크레딧. 작업 실패 시 자동 환불",[2041,2120,2121,2126],{},[2056,2122,2123],{},[28,2124,2125],{},"task_info.can_cancel",[2056,2127,2128,2129,118],{},"작업 취소 가능 여부 (완료 전에는 항상 ",[28,2130,1825],{},[2041,2132,2133,2138],{},[2056,2134,2135],{},[28,2136,2137],{},"created",[2056,2139,2140],{},"작업 제출 시간의 Unix 타임스탬프",[2041,2142,2143,2148],{},[2056,2144,2145],{},[28,2146,2147],{},"usage.billing_rule",[2056,2149,2150,2151,2154],{},"과금 방식 — ",[28,2152,2153],{},"per_second","는 비용이 길이에 비례",[18,2156,2157],{},[11,2158,2159,2161,2162,2164,2165,2168],{},[23,2160,134],{}," 제출 후 즉시 ",[28,2163,2060],{},"를 파일이나 데이터베이스에 저장하세요. polling 중 스크립트가 크래시되면 저장된 작업 ID로 ",[28,2166,2167],{},"wait_for_video()","를 호출하여 복구할 수 있습니다. 작업은 서버에 24시간 보관됩니다.",[92,2170,2172],{"id":2171},"polling-과정","Polling 과정",[11,2174,2175,2177],{},[28,2176,2167],{}," 함수는 10초마다 polling합니다. 실제 출력은 다음과 같습니다:",[137,2179,2184],{"className":2180,"code":2182,"language":2183},[2181],"language-text","Submitting text-to-video request...\nTask created: task-unified-1772203771-yf1dxogh\nEstimated time: 132s\nCredits reserved: 17.784\n  [0s] Status: pending | Progress: 0%\n  [10s] Status: processing | Progress: 7%\n  [20s] Status: processing | Progress: 13%\n  [30s] Status: processing | Progress: 20%\n  [40s] Status: processing | Progress: 27%\n  [50s] Status: completed | Progress: 100%\n\nVideo URL: https://files.evolink.ai/.../cgt-20260227224931-8vl7s.mp4\nDownloading video to my_first_video.mp4...\nSaved: my_first_video.mp4 (2847 KB)\n","text",[28,2185,2182],{"__ignoreMap":142},[11,2187,2188],{},"이것으로 끝입니다 — API 호출부터 비디오 파일 저장까지 약 50초.",[18,2190,2191],{},[11,2192,2193,2196],{},[23,2194,2195],{},"중요:"," 비디오 URL은 24시간 후 만료됩니다. 반드시 즉시 파일을 다운로드하거나 자체 스토리지(S3, GCS, Cloudflare R2 등)에 저장하세요.",[18,2198,2199],{},[11,2200,2201,2203],{},[23,2202,305],{}," 비디오 URL을 장기 저장용으로 사용하지 마세요. 파이프라인은 생성 완료 후 즉시 다운로드하도록 구축하세요. 비동기로 비디오를 처리하는 경우, webhook(아래에서 다룹니다)을 사용하여 준비되는 즉시 다운로드를 트리거하세요.",[11,2205,2206,2207,2210],{},"효과적인 프롬프트 작성 팁은 ",[37,2208,2209],{"href":1766},"Seedance 2.0 프롬프트 가이드","를 참조하세요 — 샷 스크립트 형식, 스타일 키워드, 타이밍 구문을 다룹니다.",[45,2212],{},[48,2214,2216],{"id":2215},"결과-polling-비동기-워크플로우-이해하기","결과 Polling: 비동기 워크플로우 이해하기",[11,2218,2219,2220,2223],{},"비디오 생성은 길이와 품질 설정에 따라 30~120초 이상 소요됩니다. API는 ",[23,2221,2222],{},"비동기 작업 패턴","을 사용합니다 — OpenAI, Stability AI 등 대부분의 생성형 AI API와 동일한 패턴입니다:",[70,2225,2226,2236,2246],{},[73,2227,2228,2231,2232,2235],{},[23,2229,2230],{},"제출"," → POST ",[28,2233,2234],{},"/v1/videos/generations"," → 즉시 작업 ID 수신",[73,2237,2238,2241,2242,2245],{},[23,2239,2240],{},"Polling"," → GET ",[28,2243,2244],{},"/v1/tasks/{task_id}"," → 주기적으로 상태 확인",[73,2247,2248,2251,2252,2255,2256,2259],{},[23,2249,2250],{},"조회"," → ",[28,2253,2254],{},"status: \"completed\"","일 때 ",[28,2257,2258],{},"results"," 배열에 비디오 URL 포함",[11,2261,2262],{},"비디오 생성은 계산량이 매우 크기 때문에 이런 패턴을 사용합니다. 동기 HTTP 요청은 비디오가 준비되기 훨씬 전에 타임아웃됩니다.",[92,2264,2266],{"id":2265},"작업-상태-생명주기","작업 상태 생명주기",[137,2268,2271],{"className":2269,"code":2270,"language":2183},[2181],"pending → processing → completed\n                    ↘ failed\n",[28,2272,2270],{"__ignoreMap":142},[2035,2274,2275,2288],{},[2038,2276,2277],{},[2041,2278,2279,2282,2285],{},[2044,2280,2281],{},"상태",[2044,2283,2284],{},"진행 상황",[2044,2286,2287],{},"일반적인 소요 시간",[2051,2289,2290,2302,2317,2331],{},[2041,2291,2292,2296,2299],{},[2056,2293,2294],{},[28,2295,2074],{},[2056,2297,2298],{},"작업이 큐에 대기 중, GPU 리소스 대기",[2056,2300,2301],{},"0~30초",[2041,2303,2304,2308,2314],{},[2056,2305,2306],{},[28,2307,2078],{},[2056,2309,2310,2311,2313],{},"비디오 생성 중 — ",[28,2312,824],{}," 실시간 업데이트",[2056,2315,2316],{},"30~120초",[2041,2318,2319,2323,2328],{},[2056,2320,2321],{},[28,2322,2082],{},[2056,2324,2325,2326,2259],{},"완료! ",[28,2327,2258],{},[2056,2329,2330],{},"종료 상태",[2041,2332,2333,2337,2340],{},[2056,2334,2335],{},[28,2336,2085],{},[2056,2338,2339],{},"오류 발생 — 오류 상세 정보 확인",[2056,2341,2330],{},[92,2343,2345],{"id":2344},"polling-모범-사례","Polling 모범 사례",[11,2347,2348,2351],{},[23,2349,2350],{},"Polling 간격:"," 10초가 적절한 기본값입니다. 너무 빠르면 요청을 낭비하고 속도 제한을 트리거할 수 있고, 너무 느리면 파이프라인이 지연됩니다. 시간에 민감한 애플리케이션에서는 5초마다 polling할 수 있지만, 그보다 빠르게 할 필요는 없습니다.",[11,2353,2354,2357],{},[23,2355,2356],{},"타임아웃:"," 파라미터에 따라 합리적인 상한을 설정하세요:",[2035,2359,2360,2373],{},[2038,2361,2362],{},[2041,2363,2364,2367,2370],{},[2044,2365,2366],{},"설정",[2044,2368,2369],{},"예상 소요 시간",[2044,2371,2372],{},"권장 타임아웃",[2051,2374,2375,2386,2397,2408],{},[2041,2376,2377,2380,2383],{},[2056,2378,2379],{},"4s, 480p",[2056,2381,2382],{},"20~40초",[2056,2384,2385],{},"120초",[2041,2387,2388,2391,2394],{},[2056,2389,2390],{},"5s, 720p",[2056,2392,2393],{},"30~60초",[2056,2395,2396],{},"180초",[2041,2398,2399,2402,2405],{},[2056,2400,2401],{},"10s, 720p",[2056,2403,2404],{},"60~90초",[2056,2406,2407],{},"300초",[2041,2409,2410,2413,2416],{},[2056,2411,2412],{},"15s, 1080p",[2056,2414,2415],{},"90~180초",[2056,2417,2418],{},"600초",[11,2420,2421,2424,2425,2427,2428,2435],{},[23,2422,2423],{},"진행률 추적:"," ",[28,2426,824],{}," 필드(0",[2429,2430,2431,2432,2434],"del",{},"100)는 세밀한 피드백을 제공합니다 — UI에서 진행률 표시줄을 구축하는 데 유용합니다. ",[28,2433,2078],{}," 단계에서 약 5","7초마다 업데이트됩니다.",[92,2437,2439],{"id":2438},"작업-취소","작업 취소",[11,2441,2442],{},"진행 중인 생성을 중지해야 할 때(잘못된 프롬프트, 마음이 바뀐 경우) 취소할 수 있습니다:",[137,2444,2446],{"className":338,"code":2445,"language":340,"meta":142,"style":142},"def cancel_task(task_id):\n    \"\"\"pending 또는 processing 상태의 작업을 취소합니다. 크레딧이 환불됩니다.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled. Credits refunded.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n",[28,2447,2448,2458,2463,2471,2492,2500,2504,2519,2540,2547],{"__ignoreMap":142},[146,2449,2450,2452,2455],{"class":148,"line":149},[146,2451,526],{"class":259},[146,2453,2454],{"class":152}," cancel_task",[146,2456,2457],{"class":263},"(task_id):\n",[146,2459,2460],{"class":148,"line":167},[146,2461,2462],{"class":160},"    \"\"\"pending 또는 processing 상태의 작업을 취소합니다. 크레딧이 환불됩니다.\"\"\"\n",[146,2464,2465,2467,2469],{"class":148,"line":179},[146,2466,1427],{"class":263},[146,2468,267],{"class":259},[146,2470,1432],{"class":263},[146,2472,2473,2475,2477,2479,2481,2483,2485,2487,2490],{"class":148,"line":188},[146,2474,1437],{"class":259},[146,2476,449],{"class":160},[146,2478,679],{"class":156},[146,2480,682],{"class":160},[146,2482,685],{"class":156},[146,2484,688],{"class":263},[146,2486,691],{"class":156},[146,2488,2489],{"class":160},"/cancel\"",[146,2491,452],{"class":263},[146,2493,2494,2496,2498],{"class":148,"line":373},[146,2495,1455],{"class":701},[146,2497,267],{"class":259},[146,2499,707],{"class":156},[146,2501,2502],{"class":148,"line":379},[146,2503,1483],{"class":263},[146,2505,2506,2509,2512,2514,2517],{"class":148,"line":385},[146,2507,2508],{"class":259},"    if",[146,2510,2511],{"class":263}," response.status_code ",[146,2513,854],{"class":259},[146,2515,2516],{"class":156}," 200",[146,2518,860],{"class":263},[146,2520,2521,2523,2525,2527,2529,2531,2533,2535,2538],{"class":148,"line":409},[146,2522,791],{"class":156},[146,2524,794],{"class":263},[146,2526,440],{"class":259},[146,2528,921],{"class":160},[146,2530,685],{"class":156},[146,2532,688],{"class":263},[146,2534,691],{"class":156},[146,2536,2537],{"class":160}," cancelled. Credits refunded.\"",[146,2539,406],{"class":263},[146,2541,2542,2545],{"class":148,"line":420},[146,2543,2544],{"class":259},"    else",[146,2546,860],{"class":263},[146,2548,2549,2551,2553,2555,2558,2560,2563,2565,2567],{"class":148,"line":431},[146,2550,791],{"class":156},[146,2552,794],{"class":263},[146,2554,440],{"class":259},[146,2556,2557],{"class":160},"\"Cancel failed: ",[146,2559,685],{"class":156},[146,2561,2562],{"class":263},"response.json()",[146,2564,691],{"class":156},[146,2566,449],{"class":160},[146,2568,406],{"class":263},[11,2570,2571,2573,2574,2576,2577,281,2579,2581],{},[28,2572,2125],{},"이 ",[28,2575,1825],{},"일 때 취소가 가능합니다. 작업이 ",[28,2578,2082],{},[28,2580,2085],{},"에 도달하면 취소할 수 없습니다. 취소 시 예약된 크레딧은 자동으로 환불됩니다.",[18,2583,2584],{},[11,2585,2586,2588],{},[23,2587,134],{}," UI에 취소 기능을 일찍 구축하세요. 사용자는 필연적으로 잘못된 프롬프트를 제출하게 되고, 원하지 않는 비디오를 2분 동안 기다리는 것은 시간과 크레딧 모두 낭비입니다.",[11,2590,2591,2592,2594,2595,2599],{},"앞서 설정한 ",[28,2593,2167],{}," 함수가 표준 polling 흐름을 처리합니다. polling을 완전히 건너뛰고 싶다면 아래 ",[37,2596,2598],{"href":2597},"#webhook-%EC%84%A4%EC%A0%95polling-%EA%B1%B4%EB%84%88%EB%9B%B0%EA%B8%B0","Webhook 섹션","으로 이동하세요.",[45,2601],{},[48,2603,2605],{"id":2604},"이미지-애니메이션-이미지-투-비디오","이미지 애니메이션 (이미지-투-비디오)",[11,2607,2608,2609,2612,2613,2617],{},"제품 사진, 캐릭터 일러스트, 풍경 사진을 살아 움직이게 만들고 싶으신가요? ",[28,2610,2611],{},"image_url","로 전달하면 Seedance가 애니메이션화합니다. ",[37,2614,2616],{"href":2615},"/blog/seedance-2-ecommerce-product-videos","이커머스 제품 비디오","에서 가장 강력한 기능 중 하나입니다 — 정적인 제품 사진을 매력적인 비디오 광고로 변환합니다.",[11,2619,2620],{},[2621,2622,2623],"em",{},"위 첫 번째 예제와 동일한 설정 및 polling 함수를 사용합니다.",[137,2625,2627],{"className":338,"code":2626,"language":340,"meta":142,"style":142},"# ── 이미지-투-비디오 ──────────────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame, and the subject blinks naturally.\"\n        ),\n        \"image_urls\": [\n            \"https://example.com/your-image.jpg\"\n        ],\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n\n    print(\"Submitting image-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n\n    print(f\"Task created: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n\n    video_url = result[\"results\"][0]\n    download_video(video_url, \"animated_image.mp4\")\n\n    return result\n",[28,2628,2629,2634,2643,2651,2661,2667,2672,2677,2682,2686,2694,2699,2704,2714,2724,2733,2737,2741,2752,2760,2772,2782,2791,2795,2800,2808,2812,2836,2848,2852,2868,2877,2881],{"__ignoreMap":142},[146,2630,2631],{"class":148,"line":149},[146,2632,2633],{"class":175},"# ── 이미지-투-비디오 ──────────────────────────────────────────\n",[146,2635,2636,2638,2641],{"class":148,"line":167},[146,2637,526],{"class":259},[146,2639,2640],{"class":152}," image_to_video",[146,2642,1289],{"class":263},[146,2644,2645,2647,2649],{"class":148,"line":179},[146,2646,1294],{"class":263},[146,2648,267],{"class":259},[146,2650,428],{"class":263},[146,2652,2653,2655,2657,2659],{"class":148,"line":188},[146,2654,1303],{"class":160},[146,2656,437],{"class":263},[146,2658,1308],{"class":160},[146,2660,452],{"class":263},[146,2662,2663,2665],{"class":148,"line":373},[146,2664,1319],{"class":160},[146,2666,1322],{"class":263},[146,2668,2669],{"class":148,"line":379},[146,2670,2671],{"class":160},"            \"@Image1 as the first frame. The scene slowly comes \"\n",[146,2673,2674],{"class":148,"line":385},[146,2675,2676],{"class":160},"            \"to life — leaves rustle gently, soft light shifts \"\n",[146,2678,2679],{"class":148,"line":409},[146,2680,2681],{"class":160},"            \"across the frame, and the subject blinks naturally.\"\n",[146,2683,2684],{"class":148,"line":420},[146,2685,1342],{"class":263},[146,2687,2688,2691],{"class":148,"line":431},[146,2689,2690],{"class":160},"        \"image_urls\"",[146,2692,2693],{"class":263},": [\n",[146,2695,2696],{"class":148,"line":455},[146,2697,2698],{"class":160},"            \"https://example.com/your-image.jpg\"\n",[146,2700,2701],{"class":148,"line":466},[146,2702,2703],{"class":263},"        ],\n",[146,2705,2706,2708,2710,2712],{"class":148,"line":600},[146,2707,1347],{"class":160},[146,2709,437],{"class":263},[146,2711,1352],{"class":156},[146,2713,452],{"class":263},[146,2715,2716,2718,2720,2722],{"class":148,"line":605},[146,2717,1363],{"class":160},[146,2719,437],{"class":263},[146,2721,1368],{"class":160},[146,2723,452],{"class":263},[146,2725,2726,2728,2730],{"class":148,"line":611},[146,2727,1379],{"class":160},[146,2729,437],{"class":263},[146,2731,2732],{"class":160},"\"16:9\"\n",[146,2734,2735],{"class":148,"line":617},[146,2736,1407],{"class":263},[146,2738,2739],{"class":148,"line":623},[146,2740,376],{"emptyLinePlaceholder":58},[146,2742,2743,2745,2747,2750],{"class":148,"line":628},[146,2744,1102],{"class":156},[146,2746,794],{"class":263},[146,2748,2749],{"class":160},"\"Submitting image-to-video request...\"",[146,2751,406],{"class":263},[146,2753,2754,2756,2758],{"class":148,"line":639},[146,2755,1427],{"class":263},[146,2757,267],{"class":259},[146,2759,1432],{"class":263},[146,2761,2762,2764,2766,2768,2770],{"class":148,"line":654},[146,2763,1437],{"class":259},[146,2765,449],{"class":160},[146,2767,679],{"class":156},[146,2769,1444],{"class":160},[146,2771,452],{"class":263},[146,2773,2774,2776,2778,2780],{"class":148,"line":660},[146,2775,1455],{"class":701},[146,2777,267],{"class":259},[146,2779,423],{"class":156},[146,2781,452],{"class":263},[146,2783,2784,2786,2788],{"class":148,"line":671},[146,2785,1470],{"class":701},[146,2787,267],{"class":259},[146,2789,2790],{"class":263},"payload\n",[146,2792,2793],{"class":148,"line":698},[146,2794,1483],{"class":263},[146,2796,2797],{"class":148,"line":710},[146,2798,2799],{"class":263},"    response.raise_for_status()\n",[146,2801,2802,2804,2806],{"class":148,"line":716},[146,2803,1496],{"class":263},[146,2805,267],{"class":259},[146,2807,736],{"class":263},[146,2809,2810],{"class":148,"line":722},[146,2811,376],{"emptyLinePlaceholder":58},[146,2813,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834],{"class":148,"line":728},[146,2815,1102],{"class":156},[146,2817,794],{"class":263},[146,2819,440],{"class":259},[146,2821,1524],{"class":160},[146,2823,685],{"class":156},[146,2825,1529],{"class":263},[146,2827,1532],{"class":160},[146,2829,1535],{"class":263},[146,2831,691],{"class":156},[146,2833,449],{"class":160},[146,2835,406],{"class":263},[146,2837,2838,2840,2842,2844,2846],{"class":148,"line":739},[146,2839,1618],{"class":263},[146,2841,267],{"class":259},[146,2843,1623],{"class":263},[146,2845,1626],{"class":160},[146,2847,1629],{"class":263},[146,2849,2850],{"class":148,"line":744},[146,2851,376],{"emptyLinePlaceholder":58},[146,2853,2854,2856,2858,2860,2862,2864,2866],{"class":148,"line":750},[146,2855,1643],{"class":263},[146,2857,267],{"class":259},[146,2859,1648],{"class":263},[146,2861,1651],{"class":160},[146,2863,1562],{"class":263},[146,2865,783],{"class":156},[146,2867,764],{"class":263},[146,2869,2870,2872,2875],{"class":148,"line":767},[146,2871,1689],{"class":263},[146,2873,2874],{"class":160},"\"animated_image.mp4\"",[146,2876,406],{"class":263},[146,2878,2879],{"class":148,"line":788},[146,2880,376],{"emptyLinePlaceholder":58},[146,2882,2883,2885],{"class":148,"line":834},[146,2884,1703],{"class":259},[146,2886,1706],{"class":263},[11,2888,2889],{},"텍스트-투-비디오와 다른 점을 살펴봅시다:",[97,2891,2892,2904,2925],{},[73,2893,2894,2899,2900,2903],{},[23,2895,2896],{},[28,2897,2898],{},"image_urls"," — 공개적으로 접근 가능한 이미지 URL 배열입니다. API가 직접 가져오므로 인터넷에서 접근 가능해야 합니다(",[28,2901,2902],{},"localhost","나 사설 네트워크 URL은 안 됩니다).",[73,2905,2906,2912,2913,2915,2916,400,2918,400,2921,2924],{},[23,2907,2908,2909],{},"프롬프트의 ",[28,2910,2911],{},"@Image1"," — 이 태그는 Seedance에 어떤 이미지를 어떻게 참조할지 알려줍니다. ",[28,2914,2898],{},"의 첫 번째 URL에 해당합니다. 세 장의 이미지를 전달하면 ",[28,2917,2911],{},[28,2919,2920],{},"@Image2",[28,2922,2923],{},"@Image3","을 사용합니다.",[73,2926,2927,2932,2933,2935,2936,2939],{},[23,2928,2929,2931],{},[28,2930,1822],{}," 없음"," — 여기서는 생략했으며, 기본값은 ",[28,2934,1825],{},"입니다. 무음 애니메이션을 원하면 ",[28,2937,2938],{},"false","로 설정하세요.",[92,2941,2943],{"id":2942},"image-태그-작동-방식","@Image 태그 작동 방식",[11,2945,2908,2946,2948,2949,2951,2952,2954,2955,2958,2959,2962,2963,2966,2967,1260],{},[28,2947,2911],{}," 태그는 Seedance에 이미지 사용 방법을 알려줍니다. ",[28,2950,2898],{}," 배열의 첫 번째 URL을 참조합니다. 최대 9장의 이미지를 전달할 수 있습니다(",[28,2953,2911],{},"부터 ",[28,2956,2957],{},"@Image9","까지). ",[28,2960,2961],{},"@Video","와 ",[28,2964,2965],{},"@Audio","를 포함한 멀티모달 태그의 전체 가이드는 ",[37,2968,2970],{"href":2969},"/blog/seedance-2-multimodal-tags-guide","멀티모달 @Tags 가이드",[11,2972,2973],{},"일반적인 패턴:",[2035,2975,2976,2989],{},[2038,2977,2978],{},[2041,2979,2980,2983,2986],{},[2044,2981,2982],{},"프롬프트 패턴",[2044,2984,2985],{},"효과",[2044,2987,2988],{},"적합한 용도",[2051,2990,2991,3004,3017,3030,3043],{},[2041,2992,2993,2998,3001],{},[2056,2994,2995],{},[28,2996,2997],{},"@Image1 as first frame",[2056,2999,3000],{},"이미지를 시작 프레임으로 사용",[2056,3002,3003],{},"제품 쇼케이스, 장면 설정",[2041,3005,3006,3011,3014],{},[2056,3007,3008],{},[28,3009,3010],{},"@Image1 as last frame",[2056,3012,3013],{},"이미지를 마지막 프레임으로 사용",[2056,3015,3016],{},"로고 공개, 전환",[2041,3018,3019,3024,3027],{},[2056,3020,3021],{},[28,3022,3023],{},"@Image1 as character reference",[2056,3025,3026],{},"캐릭터 외형 유지",[2056,3028,3029],{},"클립 간 캐릭터 일관성",[2041,3031,3032,3037,3040],{},[2056,3033,3034],{},[28,3035,3036],{},"@Image1 as style reference",[2056,3038,3039],{},"이미지의 시각적 스타일 적용",[2056,3041,3042],{},"브랜드 일관성, 아트 디렉션",[2041,3044,3045,3050,3053],{},[2056,3046,3047],{},[28,3048,3049],{},"@Image1 as first frame, @Image2 as last frame",[2056,3051,3052],{},"두 이미지 간 전환 생성",[2056,3054,3055],{},"전후 비교, 변형",[11,3057,3058],{},"테스트에서 받은 실제 응답:",[137,3060,3062],{"className":1855,"code":3061,"language":1857,"meta":142,"style":142},"{\n  \"created\": 1772204037,\n  \"id\": \"task-unified-1772204036-lify8u5p\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 145\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n",[28,3063,3064,3068,3079,3090,3100,3110,3120,3130,3136,3146,3155,3159,3169,3175,3185,3195,3203,3207],{"__ignoreMap":142},[146,3065,3066],{"class":148,"line":149},[146,3067,1864],{"class":263},[146,3069,3070,3072,3074,3077],{"class":148,"line":167},[146,3071,1869],{"class":156},[146,3073,437],{"class":263},[146,3075,3076],{"class":156},"1772204037",[146,3078,452],{"class":263},[146,3080,3081,3083,3085,3088],{"class":148,"line":179},[146,3082,1881],{"class":156},[146,3084,437],{"class":263},[146,3086,3087],{"class":160},"\"task-unified-1772204036-lify8u5p\"",[146,3089,452],{"class":263},[146,3091,3092,3094,3096,3098],{"class":148,"line":188},[146,3093,1893],{"class":156},[146,3095,437],{"class":263},[146,3097,1308],{"class":160},[146,3099,452],{"class":263},[146,3101,3102,3104,3106,3108],{"class":148,"line":373},[146,3103,1904],{"class":156},[146,3105,437],{"class":263},[146,3107,1909],{"class":160},[146,3109,452],{"class":263},[146,3111,3112,3114,3116,3118],{"class":148,"line":379},[146,3113,1916],{"class":156},[146,3115,437],{"class":263},[146,3117,783],{"class":156},[146,3119,452],{"class":263},[146,3121,3122,3124,3126,3128],{"class":148,"line":385},[146,3123,1927],{"class":156},[146,3125,437],{"class":263},[146,3127,1932],{"class":160},[146,3129,452],{"class":263},[146,3131,3132,3134],{"class":148,"line":409},[146,3133,1939],{"class":156},[146,3135,1942],{"class":263},[146,3137,3138,3140,3142,3144],{"class":148,"line":420},[146,3139,1947],{"class":156},[146,3141,437],{"class":263},[146,3143,1825],{"class":156},[146,3145,452],{"class":263},[146,3147,3148,3150,3152],{"class":148,"line":431},[146,3149,1958],{"class":156},[146,3151,437],{"class":263},[146,3153,3154],{"class":156},"145\n",[146,3156,3157],{"class":148,"line":455},[146,3158,1968],{"class":263},[146,3160,3161,3163,3165,3167],{"class":148,"line":466},[146,3162,1973],{"class":156},[146,3164,437],{"class":263},[146,3166,1978],{"class":160},[146,3168,452],{"class":263},[146,3170,3171,3173],{"class":148,"line":600},[146,3172,1985],{"class":156},[146,3174,1942],{"class":263},[146,3176,3177,3179,3181,3183],{"class":148,"line":605},[146,3178,1992],{"class":156},[146,3180,437],{"class":263},[146,3182,1997],{"class":160},[146,3184,452],{"class":263},[146,3186,3187,3189,3191,3193],{"class":148,"line":611},[146,3188,2004],{"class":156},[146,3190,437],{"class":263},[146,3192,2009],{"class":156},[146,3194,452],{"class":263},[146,3196,3197,3199,3201],{"class":148,"line":617},[146,3198,2016],{"class":156},[146,3200,437],{"class":263},[146,3202,2021],{"class":160},[146,3204,3205],{"class":148,"line":623},[146,3206,2026],{"class":263},[146,3208,3209],{"class":148,"line":628},[146,3210,469],{"class":263},[11,3212,3213,3214,3216],{},"이미지-투-비디오는 텍스트-투-비디오와 완전히 동일한 비동기 패턴을 따릅니다 — 제출, polling, 다운로드. 모델이 입력 이미지를 분석해야 하므로 ",[28,3215,2105],{},"이 약간 더 깁니다.",[92,3218,3220],{"id":3219},"이미지-요구사항","이미지 요구사항",[2035,3222,3223,3233],{},[2038,3224,3225],{},[2041,3226,3227,3230],{},[2044,3228,3229],{},"제약",[2044,3231,3232],{},"값",[2051,3234,3235,3243,3251,3259,3267],{},[2041,3236,3237,3240],{},[2056,3238,3239],{},"최대 이미지 수",[2056,3241,3242],{},"요청당 9장",[2041,3244,3245,3248],{},[2056,3246,3247],{},"최대 파일 크기",[2056,3249,3250],{},"이미지당 30 MB",[2041,3252,3253,3256],{},[2056,3254,3255],{},"지원 형식",[2056,3257,3258],{},"JPEG, PNG, WebP, BMP, TIFF, GIF",[2041,3260,3261,3264],{},[2056,3262,3263],{},"URL 요구사항",[2056,3265,3266],{},"공개적으로 접근 가능해야 함",[2041,3268,3269,3272],{},[2056,3270,3271],{},"권장 해상도",[2056,3273,3274],{},"짧은 변 최소 720px",[18,3276,3277],{},[11,3278,3279,3281,3282,3284],{},[23,3280,305],{}," URL 대신 로컬 파일 경로를 전달하는 것. ",[28,3283,2898],{}," 필드는 공개적으로 접근 가능한 HTTP/HTTPS URL이 필요합니다. 이미지가 로컬에 있다면 먼저 S3, Cloudflare R2 또는 임시 파일 호스팅 서비스에 업로드하세요.",[18,3286,3287],{},[11,3288,3289,3292],{},[23,3290,3291],{},"제한사항:"," Seedance는 사실적인 인물 얼굴 이미지 업로드를 지원하지 않습니다. 시스템이 자동으로 거부합니다. 일러스트나 스타일화된 캐릭터를 사용하세요.",[92,3294,3296],{"id":3295},"api용-이미지-호스팅","API용 이미지 호스팅",[11,3298,3299],{},"CDN이 없다면 공개 URL을 빠르게 얻는 방법:",[137,3301,3303],{"className":338,"code":3302,"language":340,"meta":142,"style":142},"# 방법 1: S3에 업로드 (AWS가 있는 경우)\nimport boto3\ns3 = boto3.client('s3')\ns3.upload_file('local_image.jpg', 'my-bucket', 'seedance/input.jpg')\nimage_url = f\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n\n# 방법 2: 임시 파일 호스팅 API 사용\n# 많은 서비스가 테스트용 무료 임시 호스팅을 제공합니다\n",[28,3304,3305,3310,3317,3332,3352,3365,3369,3374],{"__ignoreMap":142},[146,3306,3307],{"class":148,"line":149},[146,3308,3309],{"class":175},"# 방법 1: S3에 업로드 (AWS가 있는 경우)\n",[146,3311,3312,3314],{"class":148,"line":167},[146,3313,347],{"class":259},[146,3315,3316],{"class":263}," boto3\n",[146,3318,3319,3322,3324,3327,3330],{"class":148,"line":179},[146,3320,3321],{"class":263},"s3 ",[146,3323,267],{"class":259},[146,3325,3326],{"class":263}," boto3.client(",[146,3328,3329],{"class":160},"'s3'",[146,3331,406],{"class":263},[146,3333,3334,3337,3340,3342,3345,3347,3350],{"class":148,"line":188},[146,3335,3336],{"class":263},"s3.upload_file(",[146,3338,3339],{"class":160},"'local_image.jpg'",[146,3341,400],{"class":263},[146,3343,3344],{"class":160},"'my-bucket'",[146,3346,400],{"class":263},[146,3348,3349],{"class":160},"'seedance/input.jpg'",[146,3351,406],{"class":263},[146,3353,3354,3357,3359,3362],{"class":148,"line":373},[146,3355,3356],{"class":263},"image_url ",[146,3358,267],{"class":259},[146,3360,3361],{"class":259}," f",[146,3363,3364],{"class":160},"\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n",[146,3366,3367],{"class":148,"line":379},[146,3368,376],{"emptyLinePlaceholder":58},[146,3370,3371],{"class":148,"line":385},[146,3372,3373],{"class":175},"# 방법 2: 임시 파일 호스팅 API 사용\n",[146,3375,3376],{"class":148,"line":409},[146,3377,3378],{"class":175},"# 많은 서비스가 테스트용 무료 임시 호스팅을 제공합니다\n",[11,3380,3381,3382,1260],{},"고급 이미지-투-비디오 기법 — 첫/마지막 프레임 제어, 다중 이미지 합성, 이커머스 제품 애니메이션 — 은 ",[37,3383,3385],{"href":3384},"/blog/seedance-2-image-to-video-api","이미지-투-비디오 상세 가이드",[45,3387],{},[48,3389,3391],{"id":3390},"비디오-커스터마이징","비디오 커스터마이징",[11,3393,3394],{},"생성 요청에서 조정할 수 있는 모든 파라미터:",[2035,3396,3397,3416],{},[2038,3398,3399],{},[2041,3400,3401,3404,3407,3410,3413],{},[2044,3402,3403],{},"파라미터",[2044,3405,3406],{},"타입",[2044,3408,3409],{},"기본값",[2044,3411,3412],{},"옵션",[2044,3414,3415],{},"설명",[2051,3417,3418,3437,3453,3470,3493,3525,3547,3564,3581,3597],{},[2041,3419,3420,3424,3427,3430,3434],{},[2056,3421,3422],{},[28,3423,1747],{},[2056,3425,3426],{},"string",[2056,3428,3429],{},"—",[2056,3431,3432],{},[28,3433,1751],{},[2056,3435,3436],{},"필수. 사용할 모델.",[2041,3438,3439,3443,3445,3447,3450],{},[2056,3440,3441],{},[28,3442,1762],{},[2056,3444,3426],{},[2056,3446,3429],{},[2056,3448,3449],{},"≤2000 tokens",[2056,3451,3452],{},"필수. @tags를 포함한 비디오 설명.",[2041,3454,3455,3459,3462,3464,3467],{},[2056,3456,3457],{},[28,3458,1774],{},[2056,3460,3461],{},"integer",[2056,3463,1352],{},[2056,3465,3466],{},"4–15",[2056,3468,3469],{},"비디오 길이(초).",[2041,3471,3472,3476,3478,3482,3490],{},[2056,3473,3474],{},[28,3475,1782],{},[2056,3477,3426],{},[2056,3479,3480],{},[28,3481,1786],{},[2056,3483,3484,400,3486,400,3488],{},[28,3485,1790],{},[28,3487,1786],{},[28,3489,1794],{},[2056,3491,3492],{},"해상도 등급. 높을수록 크레딧 소모 증가.",[2041,3494,3495,3499,3501,3505,3522],{},[2056,3496,3497],{},[28,3498,1802],{},[2056,3500,3426],{},[2056,3502,3503],{},[28,3504,1806],{},[2056,3506,3507,400,3509,400,3511,400,3513,400,3516,400,3519],{},[28,3508,1806],{},[28,3510,1810],{},[28,3512,1814],{},[28,3514,3515],{},"4:3",[28,3517,3518],{},"3:4",[28,3520,3521],{},"21:9",[2056,3523,3524],{},"출력 화면 비율.",[2041,3526,3527,3531,3534,3538,3544],{},[2056,3528,3529],{},[28,3530,1822],{},[2056,3532,3533],{},"boolean",[2056,3535,3536],{},[28,3537,1825],{},[2056,3539,3540,400,3542],{},[28,3541,1825],{},[28,3543,2938],{},[2056,3545,3546],{},"AI 생성 오디오/음악 활성화.",[2041,3548,3549,3553,3556,3558,3561],{},[2056,3550,3551],{},[28,3552,2898],{},[2056,3554,3555],{},"array",[2056,3557,3429],{},[2056,3559,3560],{},"≤9장",[2056,3562,3563],{},"참조 이미지. 프롬프트에서 @Image1, @Image2...로 참조.",[2041,3565,3566,3571,3573,3575,3578],{},[2056,3567,3568],{},[28,3569,3570],{},"video_urls",[2056,3572,3555],{},[2056,3574,3429],{},[2056,3576,3577],{},"≤3개",[2056,3579,3580],{},"참조 비디오. 프롬프트에서 @Video1, @Video2...로 참조.",[2041,3582,3583,3588,3590,3592,3594],{},[2056,3584,3585],{},[28,3586,3587],{},"audio_urls",[2056,3589,3555],{},[2056,3591,3429],{},[2056,3593,3577],{},[2056,3595,3596],{},"참조 오디오. 프롬프트에서 @Audio1, @Audio2...로 참조.",[2041,3598,3599,3604,3606,3608,3611],{},[2056,3600,3601],{},[28,3602,3603],{},"callback_url",[2056,3605,3426],{},[2056,3607,3429],{},[2056,3609,3610],{},"HTTPS URL",[2056,3612,3613],{},"완료 시 webhook 콜백 주소.",[18,3615,3616],{},[11,3617,3618,3621,3622,3624,3625,3627,3628,400,3630,3632,3633,3635,3636,3638,3639,3642],{},[23,3619,3620],{},"Seedance 2.0 vs 1.5 참고:"," 위의 모든 파라미터는 ",[28,3623,1751],{},"과 ",[28,3626,30],{}," 모두에서 작동합니다. 주요 차이점: ",[28,3629,3570],{},[28,3631,3587],{},", 다중 이미지 참조(",[28,3634,2920],{},"~",[28,3637,2957],{},")는 2.0 전용 기능입니다. 1.5에서 사용하면 API가 해당 기능이 지원되지 않는다는 명확한 메시지와 함께 ",[28,3640,3641],{},"400"," 오류를 반환합니다.",[92,3644,3646],{"id":3645},"빠른-예제","빠른 예제",[11,3648,3649],{},[23,3650,3651],{},"세로형 소셜 미디어 비디오 (TikTok/Reels):",[11,3653,3654],{},[2621,3655,2623],{},[137,3657,3659],{"className":338,"code":3658,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A barista pours latte art in slow motion. Close-up overhead shot.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\",       # 모바일용 세로형\n    \"generate_audio\": True\n}\n",[28,3660,3661,3670,3681,3693,3705,3717,3733,3743],{"__ignoreMap":142},[146,3662,3663,3666,3668],{"class":148,"line":149},[146,3664,3665],{"class":263},"payload ",[146,3667,267],{"class":259},[146,3669,428],{"class":263},[146,3671,3672,3675,3677,3679],{"class":148,"line":167},[146,3673,3674],{"class":160},"    \"model\"",[146,3676,437],{"class":263},[146,3678,1308],{"class":160},[146,3680,452],{"class":263},[146,3682,3683,3686,3688,3691],{"class":148,"line":179},[146,3684,3685],{"class":160},"    \"prompt\"",[146,3687,437],{"class":263},[146,3689,3690],{"class":160},"\"A barista pours latte art in slow motion. Close-up overhead shot.\"",[146,3692,452],{"class":263},[146,3694,3695,3698,3700,3703],{"class":148,"line":188},[146,3696,3697],{"class":160},"    \"duration\"",[146,3699,437],{"class":263},[146,3701,3702],{"class":156},"8",[146,3704,452],{"class":263},[146,3706,3707,3710,3712,3715],{"class":148,"line":373},[146,3708,3709],{"class":160},"    \"quality\"",[146,3711,437],{"class":263},[146,3713,3714],{"class":160},"\"1080p\"",[146,3716,452],{"class":263},[146,3718,3719,3722,3724,3727,3730],{"class":148,"line":379},[146,3720,3721],{"class":160},"    \"aspect_ratio\"",[146,3723,437],{"class":263},[146,3725,3726],{"class":160},"\"9:16\"",[146,3728,3729],{"class":263},",       ",[146,3731,3732],{"class":175},"# 모바일용 세로형\n",[146,3734,3735,3738,3740],{"class":148,"line":385},[146,3736,3737],{"class":160},"    \"generate_audio\"",[146,3739,437],{"class":263},[146,3741,3742],{"class":156},"True\n",[146,3744,3745],{"class":148,"line":409},[146,3746,469],{"class":263},[11,3748,3749,3751,3752,3754],{},[28,3750,1810],{}," 비율은 1080×1920 비디오를 생성합니다 — TikTok, Instagram Reels, YouTube Shorts의 네이티브 해상도입니다. ",[28,3753,1794],{}," 품질 등급은 모바일 화면에서 선명한 비주얼을 보장합니다.",[11,3756,3757],{},[23,3758,3759],{},"시네마틱 와이드스크린 + 카메라 움직임:",[137,3761,3763],{"className":338,"code":3762,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Aerial drone shot over a misty mountain range at sunrise. \"\n        \"Camera slowly pushes forward, revealing a hidden valley. \"\n        \"Cinematic color grading, volumetric lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"21:9\",       # 울트라 와이드스크린 시네마틱\n    \"generate_audio\": True\n}\n",[28,3764,3765,3773,3783,3789,3794,3799,3804,3809,3819,3829,3843,3851],{"__ignoreMap":142},[146,3766,3767,3769,3771],{"class":148,"line":149},[146,3768,3665],{"class":263},[146,3770,267],{"class":259},[146,3772,428],{"class":263},[146,3774,3775,3777,3779,3781],{"class":148,"line":167},[146,3776,3674],{"class":160},[146,3778,437],{"class":263},[146,3780,1308],{"class":160},[146,3782,452],{"class":263},[146,3784,3785,3787],{"class":148,"line":179},[146,3786,3685],{"class":160},[146,3788,1322],{"class":263},[146,3790,3791],{"class":148,"line":188},[146,3792,3793],{"class":160},"        \"Aerial drone shot over a misty mountain range at sunrise. \"\n",[146,3795,3796],{"class":148,"line":373},[146,3797,3798],{"class":160},"        \"Camera slowly pushes forward, revealing a hidden valley. \"\n",[146,3800,3801],{"class":148,"line":379},[146,3802,3803],{"class":160},"        \"Cinematic color grading, volumetric lighting.\"\n",[146,3805,3806],{"class":148,"line":385},[146,3807,3808],{"class":263},"    ),\n",[146,3810,3811,3813,3815,3817],{"class":148,"line":409},[146,3812,3697],{"class":160},[146,3814,437],{"class":263},[146,3816,537],{"class":156},[146,3818,452],{"class":263},[146,3820,3821,3823,3825,3827],{"class":148,"line":420},[146,3822,3709],{"class":160},[146,3824,437],{"class":263},[146,3826,3714],{"class":160},[146,3828,452],{"class":263},[146,3830,3831,3833,3835,3838,3840],{"class":148,"line":431},[146,3832,3721],{"class":160},[146,3834,437],{"class":263},[146,3836,3837],{"class":160},"\"21:9\"",[146,3839,3729],{"class":263},[146,3841,3842],{"class":175},"# 울트라 와이드스크린 시네마틱\n",[146,3844,3845,3847,3849],{"class":148,"line":455},[146,3846,3737],{"class":160},[146,3848,437],{"class":263},[146,3850,3742],{"class":156},[146,3852,3853],{"class":148,"line":466},[146,3854,469],{"class":263},[11,3856,3857,3858,1260],{},"프로그래밍 방식의 카메라 제어 — 돌리 줌, 오비탈 샷, 히치콕 스타일 움직임 — 은 ",[37,3859,3861],{"href":3860},"/blog/seedance-2-camera-movement-api","카메라 움직임 API 가이드",[11,3863,3864],{},[23,3865,3866],{},"무음 웹사이트 배경 비디오:",[137,3868,3870],{"className":338,"code":3869,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\",\n    \"duration\": 15,               # 최대 길이, 심리스 루프에 적합\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"21:9\",       # 와이드 배경\n    \"generate_audio\": False       # 자동 재생 배경에는 오디오 불필요\n}\n",[28,3871,3872,3880,3890,3901,3916,3926,3939,3951],{"__ignoreMap":142},[146,3873,3874,3876,3878],{"class":148,"line":149},[146,3875,3665],{"class":263},[146,3877,267],{"class":259},[146,3879,428],{"class":263},[146,3881,3882,3884,3886,3888],{"class":148,"line":167},[146,3883,3674],{"class":160},[146,3885,437],{"class":263},[146,3887,1308],{"class":160},[146,3889,452],{"class":263},[146,3891,3892,3894,3896,3899],{"class":148,"line":179},[146,3893,3685],{"class":160},[146,3895,437],{"class":263},[146,3897,3898],{"class":160},"\"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\"",[146,3900,452],{"class":263},[146,3902,3903,3905,3907,3910,3913],{"class":148,"line":188},[146,3904,3697],{"class":160},[146,3906,437],{"class":263},[146,3908,3909],{"class":156},"15",[146,3911,3912],{"class":263},",               ",[146,3914,3915],{"class":175},"# 최대 길이, 심리스 루프에 적합\n",[146,3917,3918,3920,3922,3924],{"class":148,"line":373},[146,3919,3709],{"class":160},[146,3921,437],{"class":263},[146,3923,1368],{"class":160},[146,3925,452],{"class":263},[146,3927,3928,3930,3932,3934,3936],{"class":148,"line":379},[146,3929,3721],{"class":160},[146,3931,437],{"class":263},[146,3933,3837],{"class":160},[146,3935,3729],{"class":263},[146,3937,3938],{"class":175},"# 와이드 배경\n",[146,3940,3941,3943,3945,3948],{"class":148,"line":385},[146,3942,3737],{"class":160},[146,3944,437],{"class":263},[146,3946,3947],{"class":156},"False",[146,3949,3950],{"class":175},"       # 자동 재생 배경에는 오디오 불필요\n",[146,3952,3953],{"class":148,"line":409},[146,3954,469],{"class":263},[11,3956,3957],{},[23,3958,3959],{},"저비용 초안 (빠른 반복):",[137,3961,3963],{"className":338,"code":3962,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\",\n    \"duration\": 4,                # 최소 길이 = 가장 빠른 생성\n    \"quality\": \"480p\",            # 최저 품질 = 가장 저렴한 크레딧\n    \"aspect_ratio\": \"16:9\"\n}\n",[28,3964,3965,3973,3983,3994,4009,4023,4031],{"__ignoreMap":142},[146,3966,3967,3969,3971],{"class":148,"line":149},[146,3968,3665],{"class":263},[146,3970,267],{"class":259},[146,3972,428],{"class":263},[146,3974,3975,3977,3979,3981],{"class":148,"line":167},[146,3976,3674],{"class":160},[146,3978,437],{"class":263},[146,3980,1308],{"class":160},[146,3982,452],{"class":263},[146,3984,3985,3987,3989,3992],{"class":148,"line":179},[146,3986,3685],{"class":160},[146,3988,437],{"class":263},[146,3990,3991],{"class":160},"\"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\"",[146,3993,452],{"class":263},[146,3995,3996,3998,4000,4003,4006],{"class":148,"line":188},[146,3997,3697],{"class":160},[146,3999,437],{"class":263},[146,4001,4002],{"class":156},"4",[146,4004,4005],{"class":263},",                ",[146,4007,4008],{"class":175},"# 최소 길이 = 가장 빠른 생성\n",[146,4010,4011,4013,4015,4018,4020],{"class":148,"line":373},[146,4012,3709],{"class":160},[146,4014,437],{"class":263},[146,4016,4017],{"class":160},"\"480p\"",[146,4019,1387],{"class":263},[146,4021,4022],{"class":175},"# 최저 품질 = 가장 저렴한 크레딧\n",[146,4024,4025,4027,4029],{"class":148,"line":379},[146,4026,3721],{"class":160},[146,4028,437],{"class":263},[146,4030,2732],{"class":160},[146,4032,4033],{"class":148,"line":385},[146,4034,469],{"class":263},[18,4036,4037],{},[11,4038,4039,4041,4042,2962,4045,4048,4049,4051],{},[23,4040,134],{}," 개발 단계에서는 항상 ",[28,4043,4044],{},"duration: 4",[28,4046,4047],{},"quality: \"480p\"","를 사용하세요. 가장 저렴하고 빠른 조합으로 프롬프트 반복에 이상적입니다. 만족스러운 결과를 얻으면 원하는 길이와 ",[28,4050,1794],{},"로 최종 버전을 렌더링하세요.",[92,4053,4055],{"id":4054},"크레딧-비용-추정","크레딧 비용 추정",[11,4057,4058],{},"크레딧은 길이와 품질에 비례하여 증가합니다. 대략적인 가이드:",[2035,4060,4061,4080],{},[2038,4062,4063],{},[2041,4064,4065,4068,4071,4074,4077],{},[2044,4066,4067],{},"품질",[2044,4069,4070],{},"4s",[2044,4072,4073],{},"5s",[2044,4075,4076],{},"10s",[2044,4078,4079],{},"15s",[2051,4081,4082,4098,4114],{},[2041,4083,4084,4086,4089,4092,4095],{},[2056,4085,1790],{},[2056,4087,4088],{},"~8",[2056,4090,4091],{},"~10",[2056,4093,4094],{},"~20",[2056,4096,4097],{},"~30",[2041,4099,4100,4102,4105,4108,4111],{},[2056,4101,1786],{},[2056,4103,4104],{},"~14",[2056,4106,4107],{},"~18",[2056,4109,4110],{},"~36",[2056,4112,4113],{},"~53",[2041,4115,4116,4118,4121,4124,4127],{},[2056,4117,1794],{},[2056,4119,4120],{},"~22",[2056,4122,4123],{},"~28",[2056,4125,4126],{},"~55",[2056,4128,4129],{},"~83",[11,4131,4132],{},[2621,4133,4134,4135,4137,4138,4142],{},"대략적인 크레딧. 실제 비용은 ",[28,4136,2115],{}," 필드에 표시됩니다. 현재 요금은 ",[37,4139,4141],{"href":212,"rel":4140},[41],"EvoLink 대시보드","에서 확인하세요.",[11,4144,4145,4146,400,4149,400,4151,4153,4154,4157,4158,1260],{},"멀티모달 참조 시스템 — ",[28,4147,4148],{},"@Image",[28,4150,2961],{},[28,4152,2965],{}," 태그 — 은 Seedance 2.0이 가장 돋보이는 부분입니다. 참조 비디오에서 ",[37,4155,4156],{"href":3860},"카메라 움직임","을 복제하고, 샷 간 캐릭터 일관성을 유지하며, 오디오 비트에 동기화할 수 있습니다. 전체 가이드는 ",[37,4159,4160],{"href":2969},"@Tags 완벽 가이드",[45,4162],{},[48,4164,4166],{"id":4165},"오류-처리-전략","오류 처리 전략",[11,4168,4169],{},"API 호출은 실패합니다. 네트워크가 끊깁니다. 속도 제한에 걸립니다. 실제 발생하는 오류 시나리오에 대응하는 견고한 코드 작성법을 알아봅시다.",[92,4171,4173],{"id":4172},"일반적인-오류-응답","일반적인 오류 응답",[11,4175,4176],{},"모든 오류는 동일한 형식을 따릅니다:",[137,4178,4180],{"className":1855,"code":4179,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"description of what went wrong\",\n    \"type\": \"error_category\",\n    \"code\": \"specific_error_code\"\n  }\n}\n",[28,4181,4182,4186,4193,4205,4217,4227,4231],{"__ignoreMap":142},[146,4183,4184],{"class":148,"line":149},[146,4185,1864],{"class":263},[146,4187,4188,4191],{"class":148,"line":167},[146,4189,4190],{"class":156},"  \"error\"",[146,4192,1942],{"class":263},[146,4194,4195,4198,4200,4203],{"class":148,"line":179},[146,4196,4197],{"class":156},"    \"message\"",[146,4199,437],{"class":263},[146,4201,4202],{"class":160},"\"description of what went wrong\"",[146,4204,452],{"class":263},[146,4206,4207,4210,4212,4215],{"class":148,"line":188},[146,4208,4209],{"class":156},"    \"type\"",[146,4211,437],{"class":263},[146,4213,4214],{"class":160},"\"error_category\"",[146,4216,452],{"class":263},[146,4218,4219,4222,4224],{"class":148,"line":373},[146,4220,4221],{"class":156},"    \"code\"",[146,4223,437],{"class":263},[146,4225,4226],{"class":160},"\"specific_error_code\"\n",[146,4228,4229],{"class":148,"line":379},[146,4230,2026],{"class":263},[146,4232,4233],{"class":148,"line":385},[146,4234,469],{"class":263},[11,4236,4237,4240,4241,2962,4244,4247,4248,4250,4251,4253,4254,298],{},[28,4238,4239],{},"error"," 객체는 항상 ",[28,4242,4243],{},"message",[28,4245,4246],{},"type","을 포함합니다. ",[28,4249,28],{}," 필드는 대부분의 오류에 존재하지만 전부는 아닙니다. 먼저 ",[28,4252,4246],{},"을 확인하고, 세부 사항은 ",[28,4255,28],{},[11,4257,4258],{},"API에서 반환하는 실제 오류 응답들:",[11,4260,4261],{},[23,4262,4263],{},"401 — 잘못된 API Key:",[137,4265,4267],{"className":1855,"code":4266,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Invalid token (request id: 20260227225245660301729AApJNAhJ)\",\n    \"type\": \"evo_api_error\"\n  }\n}\n",[28,4268,4269,4273,4279,4290,4299,4303],{"__ignoreMap":142},[146,4270,4271],{"class":148,"line":149},[146,4272,1864],{"class":263},[146,4274,4275,4277],{"class":148,"line":167},[146,4276,4190],{"class":156},[146,4278,1942],{"class":263},[146,4280,4281,4283,4285,4288],{"class":148,"line":179},[146,4282,4197],{"class":156},[146,4284,437],{"class":263},[146,4286,4287],{"class":160},"\"Invalid token (request id: 20260227225245660301729AApJNAhJ)\"",[146,4289,452],{"class":263},[146,4291,4292,4294,4296],{"class":148,"line":188},[146,4293,4209],{"class":156},[146,4295,437],{"class":263},[146,4297,4298],{"class":160},"\"evo_api_error\"\n",[146,4300,4301],{"class":148,"line":373},[146,4302,2026],{"class":263},[146,4304,4305],{"class":148,"line":379},[146,4306,469],{"class":263},[11,4308,4309,4310,4312],{},"API Key가 잘못되었거나, 만료되었거나, 취소되었습니다. ",[28,4311,276],{}," 환경 변수를 다시 확인하세요. 흔한 원인: Key 복사 시 뒤에 공백이 포함된 경우.",[11,4314,4315],{},[23,4316,4317],{},"400 — 필수 필드 누락:",[137,4319,4321],{"className":1855,"code":4320,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"prompt cannot be empty\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4322,4323,4327,4333,4344,4355,4364,4368],{"__ignoreMap":142},[146,4324,4325],{"class":148,"line":149},[146,4326,1864],{"class":263},[146,4328,4329,4331],{"class":148,"line":167},[146,4330,4190],{"class":156},[146,4332,1942],{"class":263},[146,4334,4335,4337,4339,4342],{"class":148,"line":179},[146,4336,4221],{"class":156},[146,4338,437],{"class":263},[146,4340,4341],{"class":160},"\"invalid_parameter\"",[146,4343,452],{"class":263},[146,4345,4346,4348,4350,4353],{"class":148,"line":188},[146,4347,4197],{"class":156},[146,4349,437],{"class":263},[146,4351,4352],{"class":160},"\"prompt cannot be empty\"",[146,4354,452],{"class":263},[146,4356,4357,4359,4361],{"class":148,"line":373},[146,4358,4209],{"class":156},[146,4360,437],{"class":263},[146,4362,4363],{"class":160},"\"invalid_request_error\"\n",[146,4365,4366],{"class":148,"line":379},[146,4367,2026],{"class":263},[146,4369,4370],{"class":148,"line":385},[146,4371,469],{"class":263},[11,4373,4374,4376],{},[28,4375,1762],{}," 필드는 모든 생성 요청에서 필수입니다. 빈 문자열이나 공백만 있는 프롬프트도 이 오류를 트리거합니다.",[11,4378,4379],{},[23,4380,4381],{},"400 — 잘못된 파라미터 값:",[137,4383,4385],{"className":1855,"code":4384,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"duration must be between 4 and 15\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4386,4387,4391,4397,4407,4418,4426,4430],{"__ignoreMap":142},[146,4388,4389],{"class":148,"line":149},[146,4390,1864],{"class":263},[146,4392,4393,4395],{"class":148,"line":167},[146,4394,4190],{"class":156},[146,4396,1942],{"class":263},[146,4398,4399,4401,4403,4405],{"class":148,"line":179},[146,4400,4221],{"class":156},[146,4402,437],{"class":263},[146,4404,4341],{"class":160},[146,4406,452],{"class":263},[146,4408,4409,4411,4413,4416],{"class":148,"line":188},[146,4410,4197],{"class":156},[146,4412,437],{"class":263},[146,4414,4415],{"class":160},"\"duration must be between 4 and 15\"",[146,4417,452],{"class":263},[146,4419,4420,4422,4424],{"class":148,"line":373},[146,4421,4209],{"class":156},[146,4423,437],{"class":263},[146,4425,4363],{"class":160},[146,4427,4428],{"class":148,"line":379},[146,4429,2026],{"class":263},[146,4431,4432],{"class":148,"line":385},[146,4433,469],{"class":263},[11,4435,4436,281,4439,4442],{},[28,4437,4438],{},"duration: 3",[28,4440,4441],{},"duration: 20","을 전달할 때 발생합니다. 유효 범위는 4~15초(포함)입니다.",[11,4444,4445],{},[23,4446,4447],{},"400 — 지원하지 않는 품질 등급:",[137,4449,4451],{"className":1855,"code":4450,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"quality must be one of: 480p, 720p, 1080p\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4452,4453,4457,4463,4473,4484,4492,4496],{"__ignoreMap":142},[146,4454,4455],{"class":148,"line":149},[146,4456,1864],{"class":263},[146,4458,4459,4461],{"class":148,"line":167},[146,4460,4190],{"class":156},[146,4462,1942],{"class":263},[146,4464,4465,4467,4469,4471],{"class":148,"line":179},[146,4466,4221],{"class":156},[146,4468,437],{"class":263},[146,4470,4341],{"class":160},[146,4472,452],{"class":263},[146,4474,4475,4477,4479,4482],{"class":148,"line":188},[146,4476,4197],{"class":156},[146,4478,437],{"class":263},[146,4480,4481],{"class":160},"\"quality must be one of: 480p, 720p, 1080p\"",[146,4483,452],{"class":263},[146,4485,4486,4488,4490],{"class":148,"line":373},[146,4487,4209],{"class":156},[146,4489,437],{"class":263},[146,4491,4363],{"class":160},[146,4493,4494],{"class":148,"line":379},[146,4495,2026],{"class":263},[146,4497,4498],{"class":148,"line":385},[146,4499,469],{"class":263},[11,4501,4502,281,4505,4508,4509,400,4511,4513,4514,4516],{},[28,4503,4504],{},"\"quality\": \"4k\"",[28,4506,4507],{},"\"quality\": \"hd\"","를 전달할 때 흔히 발생합니다. 정확한 문자열을 사용하세요: ",[28,4510,1790],{},[28,4512,1786],{},", 또는 ",[28,4515,1794],{},".",[11,4518,4519],{},[23,4520,4521],{},"402 — 크레딧 부족:",[137,4523,4525],{"className":1855,"code":4524,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Insufficient credits. Required: 17.784, Available: 2.100\",\n    \"type\": \"insufficient_quota_error\"\n  }\n}\n",[28,4526,4527,4531,4537,4548,4557,4561],{"__ignoreMap":142},[146,4528,4529],{"class":148,"line":149},[146,4530,1864],{"class":263},[146,4532,4533,4535],{"class":148,"line":167},[146,4534,4190],{"class":156},[146,4536,1942],{"class":263},[146,4538,4539,4541,4543,4546],{"class":148,"line":179},[146,4540,4197],{"class":156},[146,4542,437],{"class":263},[146,4544,4545],{"class":160},"\"Insufficient credits. Required: 17.784, Available: 2.100\"",[146,4547,452],{"class":263},[146,4549,4550,4552,4554],{"class":148,"line":188},[146,4551,4209],{"class":156},[146,4553,437],{"class":263},[146,4555,4556],{"class":160},"\"insufficient_quota_error\"\n",[146,4558,4559],{"class":148,"line":373},[146,4560,2026],{"class":263},[146,4562,4563],{"class":148,"line":379},[146,4564,469],{"class":263},[11,4566,4567,4568,4571],{},"계정에 크레딧이 부족합니다. 메시지에 필요한 양과 보유한 양이 정확히 표시됩니다. ",[37,4569,4141],{"href":212,"rel":4570},[41],"에서 충전하세요.",[11,4573,4574],{},[23,4575,4576],{},"404 — 작업을 찾을 수 없음:",[137,4578,4580],{"className":1855,"code":4579,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Task not found\",\n    \"type\": \"invalid_request_error\",\n    \"code\": \"task_not_found\"\n  }\n}\n",[28,4581,4582,4586,4592,4603,4614,4623,4627],{"__ignoreMap":142},[146,4583,4584],{"class":148,"line":149},[146,4585,1864],{"class":263},[146,4587,4588,4590],{"class":148,"line":167},[146,4589,4190],{"class":156},[146,4591,1942],{"class":263},[146,4593,4594,4596,4598,4601],{"class":148,"line":179},[146,4595,4197],{"class":156},[146,4597,437],{"class":263},[146,4599,4600],{"class":160},"\"Task not found\"",[146,4602,452],{"class":263},[146,4604,4605,4607,4609,4612],{"class":148,"line":188},[146,4606,4209],{"class":156},[146,4608,437],{"class":263},[146,4610,4611],{"class":160},"\"invalid_request_error\"",[146,4613,452],{"class":263},[146,4615,4616,4618,4620],{"class":148,"line":373},[146,4617,4221],{"class":156},[146,4619,437],{"class":263},[146,4621,4622],{"class":160},"\"task_not_found\"\n",[146,4624,4625],{"class":148,"line":379},[146,4626,2026],{"class":263},[146,4628,4629],{"class":148,"line":385},[146,4630,469],{"class":263},[11,4632,4633,4634,4636],{},"보통 작업 ID가 잘못되었거나, 작업이 생성된 지 24시간이 지나 만료된 경우입니다. 생성 응답의 ",[28,4635,2060],{}," 필드를 사용하고 있는지 확인하세요.",[11,4638,4639],{},[23,4640,4641],{},"413 — 이미지가 너무 큼:",[137,4643,4645],{"className":1855,"code":4644,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Image file size exceeds 30MB limit\",\n    \"type\": \"request_too_large_error\"\n  }\n}\n",[28,4646,4647,4651,4657,4668,4677,4681],{"__ignoreMap":142},[146,4648,4649],{"class":148,"line":149},[146,4650,1864],{"class":263},[146,4652,4653,4655],{"class":148,"line":167},[146,4654,4190],{"class":156},[146,4656,1942],{"class":263},[146,4658,4659,4661,4663,4666],{"class":148,"line":179},[146,4660,4197],{"class":156},[146,4662,437],{"class":263},[146,4664,4665],{"class":160},"\"Image file size exceeds 30MB limit\"",[146,4667,452],{"class":263},[146,4669,4670,4672,4674],{"class":148,"line":188},[146,4671,4209],{"class":156},[146,4673,437],{"class":263},[146,4675,4676],{"class":160},"\"request_too_large_error\"\n",[146,4678,4679],{"class":148,"line":373},[146,4680,2026],{"class":263},[146,4682,4683],{"class":148,"line":379},[146,4684,469],{"class":263},[11,4686,4687],{},"업로드 전에 이미지를 압축하세요. API에서는 2~3 MB 이상의 이미지 품질 향상이 거의 없습니다.",[11,4689,4690],{},[23,4691,4692],{},"429 — 속도 제한:",[137,4694,4696],{"className":1855,"code":4695,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Rate limit exceeded. Please retry after 60 seconds.\",\n    \"type\": \"rate_limit_error\"\n  }\n}\n",[28,4697,4698,4702,4708,4719,4728,4732],{"__ignoreMap":142},[146,4699,4700],{"class":148,"line":149},[146,4701,1864],{"class":263},[146,4703,4704,4706],{"class":148,"line":167},[146,4705,4190],{"class":156},[146,4707,1942],{"class":263},[146,4709,4710,4712,4714,4717],{"class":148,"line":179},[146,4711,4197],{"class":156},[146,4713,437],{"class":263},[146,4715,4716],{"class":160},"\"Rate limit exceeded. Please retry after 60 seconds.\"",[146,4718,452],{"class":263},[146,4720,4721,4723,4725],{"class":148,"line":188},[146,4722,4209],{"class":156},[146,4724,437],{"class":263},[146,4726,4727],{"class":160},"\"rate_limit_error\"\n",[146,4729,4730],{"class":148,"line":373},[146,4731,2026],{"class":263},[146,4733,4734],{"class":148,"line":379},[146,4735,469],{"class":263},[11,4737,4738],{},"요청을 너무 자주 보내고 있습니다. 기본 제한은 개발에 충분히 여유롭지만, 배치 스크립트에서는 걸릴 수 있습니다. 지수 백오프를 구현하세요(아래 참조).",[11,4740,4741],{},[23,4742,4743],{},"422 — 콘텐츠 필터 거부:",[137,4745,4747],{"className":1855,"code":4746,"language":1857,"meta":142,"style":142},"{\n  \"error\": {\n    \"message\": \"Content rejected by safety filter\",\n    \"type\": \"content_policy_violation\",\n    \"code\": \"content_filtered\"\n  }\n}\n",[28,4748,4749,4753,4759,4770,4781,4790,4794],{"__ignoreMap":142},[146,4750,4751],{"class":148,"line":149},[146,4752,1864],{"class":263},[146,4754,4755,4757],{"class":148,"line":167},[146,4756,4190],{"class":156},[146,4758,1942],{"class":263},[146,4760,4761,4763,4765,4768],{"class":148,"line":179},[146,4762,4197],{"class":156},[146,4764,437],{"class":263},[146,4766,4767],{"class":160},"\"Content rejected by safety filter\"",[146,4769,452],{"class":263},[146,4771,4772,4774,4776,4779],{"class":148,"line":188},[146,4773,4209],{"class":156},[146,4775,437],{"class":263},[146,4777,4778],{"class":160},"\"content_policy_violation\"",[146,4780,452],{"class":263},[146,4782,4783,4785,4787],{"class":148,"line":373},[146,4784,4221],{"class":156},[146,4786,437],{"class":263},[146,4788,4789],{"class":160},"\"content_filtered\"\n",[146,4791,4792],{"class":148,"line":379},[146,4793,2026],{"class":263},[146,4795,4796],{"class":148,"line":385},[146,4797,469],{"class":263},[11,4799,4800,4801,4803],{},"프롬프트나 입력 이미지가 콘텐츠 안전 필터에 감지되었습니다. 제한된 콘텐츠를 피하도록 프롬프트를 수정하세요. ",[28,4802,2898],{},"의 사실적인 인물 얼굴 이미지는 자동으로 거부됩니다.",[92,4805,4807],{"id":4806},"오류-참조-표","오류 참조 표",[2035,4809,4810,4827],{},[2038,4811,4812],{},[2041,4813,4814,4817,4819,4821,4824],{},[2044,4815,4816],{},"HTTP 코드",[2044,4818,3406],{},[2044,4820,2049],{},[2044,4822,4823],{},"재시도 가능?",[2044,4825,4826],{},"조치",[2051,4828,4829,4847,4865,4883,4901,4919,4937,4958,4978,4998],{},[2041,4830,4831,4833,4838,4841,4844],{},[2056,4832,3641],{},[2056,4834,4835],{},[28,4836,4837],{},"invalid_request_error",[2056,4839,4840],{},"잘못된 파라미터",[2056,4842,4843],{},"아니오",[2056,4845,4846],{},"payload 수정",[2041,4848,4849,4852,4857,4860,4862],{},[2056,4850,4851],{},"401",[2056,4853,4854],{},[28,4855,4856],{},"authentication_error",[2056,4858,4859],{},"잘못된 API Key",[2056,4861,4843],{},[2056,4863,4864],{},"Key 확인",[2041,4866,4867,4870,4875,4878,4880],{},[2056,4868,4869],{},"402",[2056,4871,4872],{},[28,4873,4874],{},"insufficient_quota_error",[2056,4876,4877],{},"크레딧 부족",[2056,4879,4843],{},[2056,4881,4882],{},"충전",[2041,4884,4885,4888,4893,4896,4898],{},[2056,4886,4887],{},"404",[2056,4889,4890],{},[28,4891,4892],{},"not_found_error",[2056,4894,4895],{},"작업 또는 모델 없음",[2056,4897,4843],{},[2056,4899,4900],{},"task_id / 모델명 확인",[2041,4902,4903,4906,4911,4914,4916],{},[2056,4904,4905],{},"413",[2056,4907,4908],{},[28,4909,4910],{},"request_too_large_error",[2056,4912,4913],{},"요청이 너무 큼",[2056,4915,4843],{},[2056,4917,4918],{},"파일 크기 줄이기",[2041,4920,4921,4924,4929,4932,4934],{},[2056,4922,4923],{},"422",[2056,4925,4926],{},[28,4927,4928],{},"content_policy_violation",[2056,4930,4931],{},"콘텐츠 필터링됨",[2056,4933,4843],{},[2056,4935,4936],{},"프롬프트 수정",[2041,4938,4939,4942,4947,4950,4955],{},[2056,4940,4941],{},"429",[2056,4943,4944],{},[28,4945,4946],{},"rate_limit_error",[2056,4948,4949],{},"요청이 너무 빈번함",[2056,4951,4952],{},[23,4953,4954],{},"예",[2056,4956,4957],{},"60초 후 재시도",[2041,4959,4960,4963,4968,4971,4975],{},[2056,4961,4962],{},"500",[2056,4964,4965],{},[28,4966,4967],{},"internal_server_error",[2056,4969,4970],{},"서버 문제",[2056,4972,4973],{},[23,4974,4954],{},[2056,4976,4977],{},"몇 초 후 재시도",[2041,4979,4980,4983,4988,4991,4995],{},[2056,4981,4982],{},"502",[2056,4984,4985],{},[28,4986,4987],{},"bad_gateway",[2056,4989,4990],{},"업스트림 오류",[2056,4992,4993],{},[23,4994,4954],{},[2056,4996,4997],{},"5초 후 재시도",[2041,4999,5000,5003,5008,5011,5015],{},[2056,5001,5002],{},"503",[2056,5004,5005],{},[28,5006,5007],{},"service_unavailable_error",[2056,5009,5010],{},"서비스 불가",[2056,5012,5013],{},[23,5014,4954],{},[2056,5016,5017],{},"30초 후 재시도",[92,5019,5021],{"id":5020},"프로덕션-수준-오류-처리","프로덕션 수준 오류 처리",[11,5023,5024],{},"일시적 오류에 대한 재시도 로직으로 API 호출을 감싸세요:",[11,5026,5027],{},[2621,5028,2623],{},[137,5030,5032],{"className":338,"code":5031,"language":340,"meta":142,"style":142},"import random\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"\n    일시적 오류(429, 500, 502, 503)에 대해 자동 재시도하는\n    비디오 생성 요청 제출.\n    \n    썬더링 허드를 피하기 위해 지수 백오프 + 지터 사용:\n    - 시도 1: ~1초 대기\n    - 시도 2: ~2초 대기\n    - 시도 3: ~4초 대기\n    \n    재시도 불가능한 오류(400, 401, 402, 404, 413, 422)는\n    근본적인 문제를 재시도로 해결할 수 없으므로 즉시 실패합니다.\n    \"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30       # 30초 연결 타임아웃\n            )\n\n            # 성공 — task 객체 반환\n            if response.status_code == 200:\n                return response.json()\n\n            # 오류 응답 파싱\n            error = response.json().get(\"error\", {})\n            error_type = error.get(\"type\", \"\")\n            error_msg = error.get(\"message\", \"Unknown error\")\n\n            # 재시도 불가능한 오류 — 즉시 실패\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: {error_msg}\"\n                )\n\n            # 재시도 가능한 오류 — 지수 백오프 + 지터\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt + 1}/{max_retries} \"\n                      f\"after {wait:.1f}s ({error_type}: {error_msg})\")\n                time.sleep(wait)\n                continue\n\n        except requests.exceptions.Timeout:\n            # 서버가 30초 내에 응답하지 않음\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Timeout. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n        except requests.exceptions.ConnectionError as e:\n            # DNS 실패, 연결 거부 등\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Connection error: {e}. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n",[28,5033,5034,5041,5045,5062,5066,5071,5076,5080,5085,5090,5095,5100,5104,5109,5114,5118,5134,5141,5150,5162,5173,5183,5196,5200,5204,5209,5222,5229,5233,5238,5252,5272,5291,5295,5300,5334,5344,5370,5375,5379,5384,5410,5443,5477,5518,5523,5528,5532,5541,5547,5575,5606,5626,5632,5638,5643,5656,5662,5689,5729,5748,5753,5758,5763],{"__ignoreMap":142},[146,5035,5036,5038],{"class":148,"line":149},[146,5037,347],{"class":259},[146,5039,5040],{"class":263}," random\n",[146,5042,5043],{"class":148,"line":167},[146,5044,376],{"emptyLinePlaceholder":58},[146,5046,5047,5049,5052,5055,5057,5060],{"class":148,"line":179},[146,5048,526],{"class":259},[146,5050,5051],{"class":152}," generate_video_with_retry",[146,5053,5054],{"class":263},"(payload, max_retries",[146,5056,267],{"class":259},[146,5058,5059],{"class":156},"3",[146,5061,548],{"class":263},[146,5063,5064],{"class":148,"line":188},[146,5065,553],{"class":160},[146,5067,5068],{"class":148,"line":373},[146,5069,5070],{"class":160},"    일시적 오류(429, 500, 502, 503)에 대해 자동 재시도하는\n",[146,5072,5073],{"class":148,"line":379},[146,5074,5075],{"class":160},"    비디오 생성 요청 제출.\n",[146,5077,5078],{"class":148,"line":385},[146,5079,563],{"class":160},[146,5081,5082],{"class":148,"line":409},[146,5083,5084],{"class":160},"    썬더링 허드를 피하기 위해 지수 백오프 + 지터 사용:\n",[146,5086,5087],{"class":148,"line":420},[146,5088,5089],{"class":160},"    - 시도 1: ~1초 대기\n",[146,5091,5092],{"class":148,"line":431},[146,5093,5094],{"class":160},"    - 시도 2: ~2초 대기\n",[146,5096,5097],{"class":148,"line":455},[146,5098,5099],{"class":160},"    - 시도 3: ~4초 대기\n",[146,5101,5102],{"class":148,"line":466},[146,5103,563],{"class":160},[146,5105,5106],{"class":148,"line":600},[146,5107,5108],{"class":160},"    재시도 불가능한 오류(400, 401, 402, 404, 413, 422)는\n",[146,5110,5111],{"class":148,"line":605},[146,5112,5113],{"class":160},"    근본적인 문제를 재시도로 해결할 수 없으므로 즉시 실패합니다.\n",[146,5115,5116],{"class":148,"line":611},[146,5117,553],{"class":160},[146,5119,5120,5123,5126,5128,5131],{"class":148,"line":617},[146,5121,5122],{"class":259},"    for",[146,5124,5125],{"class":263}," attempt ",[146,5127,1180],{"class":259},[146,5129,5130],{"class":156}," range",[146,5132,5133],{"class":263},"(max_retries):\n",[146,5135,5136,5139],{"class":148,"line":623},[146,5137,5138],{"class":259},"        try",[146,5140,860],{"class":263},[146,5142,5143,5146,5148],{"class":148,"line":628},[146,5144,5145],{"class":263},"            response ",[146,5147,267],{"class":259},[146,5149,1432],{"class":263},[146,5151,5152,5154,5156,5158,5160],{"class":148,"line":639},[146,5153,918],{"class":259},[146,5155,449],{"class":160},[146,5157,679],{"class":156},[146,5159,1444],{"class":160},[146,5161,452],{"class":263},[146,5163,5164,5167,5169,5171],{"class":148,"line":654},[146,5165,5166],{"class":701},"                headers",[146,5168,267],{"class":259},[146,5170,423],{"class":156},[146,5172,452],{"class":263},[146,5174,5175,5178,5180],{"class":148,"line":660},[146,5176,5177],{"class":701},"                json",[146,5179,267],{"class":259},[146,5181,5182],{"class":263},"payload,\n",[146,5184,5185,5188,5190,5193],{"class":148,"line":671},[146,5186,5187],{"class":701},"                timeout",[146,5189,267],{"class":259},[146,5191,5192],{"class":156},"30",[146,5194,5195],{"class":175},"       # 30초 연결 타임아웃\n",[146,5197,5198],{"class":148,"line":698},[146,5199,956],{"class":263},[146,5201,5202],{"class":148,"line":710},[146,5203,376],{"emptyLinePlaceholder":58},[146,5205,5206],{"class":148,"line":716},[146,5207,5208],{"class":175},"            # 성공 — task 객체 반환\n",[146,5210,5211,5214,5216,5218,5220],{"class":148,"line":722},[146,5212,5213],{"class":259},"            if",[146,5215,2511],{"class":263},[146,5217,854],{"class":259},[146,5219,2516],{"class":156},[146,5221,860],{"class":263},[146,5223,5224,5227],{"class":148,"line":728},[146,5225,5226],{"class":259},"                return",[146,5228,736],{"class":263},[146,5230,5231],{"class":148,"line":739},[146,5232,376],{"emptyLinePlaceholder":58},[146,5234,5235],{"class":148,"line":744},[146,5236,5237],{"class":175},"            # 오류 응답 파싱\n",[146,5239,5240,5243,5245,5248,5250],{"class":148,"line":750},[146,5241,5242],{"class":263},"            error ",[146,5244,267],{"class":259},[146,5246,5247],{"class":263}," response.json().get(",[146,5249,897],{"class":160},[146,5251,900],{"class":263},[146,5253,5254,5257,5259,5262,5265,5267,5270],{"class":148,"line":767},[146,5255,5256],{"class":263},"            error_type ",[146,5258,267],{"class":259},[146,5260,5261],{"class":263}," error.get(",[146,5263,5264],{"class":160},"\"type\"",[146,5266,400],{"class":263},[146,5268,5269],{"class":160},"\"\"",[146,5271,406],{"class":263},[146,5273,5274,5277,5279,5281,5284,5286,5289],{"class":148,"line":788},[146,5275,5276],{"class":263},"            error_msg ",[146,5278,267],{"class":259},[146,5280,5261],{"class":263},[146,5282,5283],{"class":160},"\"message\"",[146,5285,400],{"class":263},[146,5287,5288],{"class":160},"\"Unknown error\"",[146,5290,406],{"class":263},[146,5292,5293],{"class":148,"line":834},[146,5294,376],{"emptyLinePlaceholder":58},[146,5296,5297],{"class":148,"line":839},[146,5298,5299],{"class":175},"            # 재시도 불가능한 오류 — 즉시 실패\n",[146,5301,5302,5304,5306,5308,5310,5312,5314,5316,5318,5320,5322,5324,5326,5328,5330,5332],{"class":148,"line":845},[146,5303,5213],{"class":259},[146,5305,2511],{"class":263},[146,5307,1180],{"class":259},[146,5309,104],{"class":263},[146,5311,3641],{"class":156},[146,5313,400],{"class":263},[146,5315,4851],{"class":156},[146,5317,400],{"class":263},[146,5319,4869],{"class":156},[146,5321,400],{"class":263},[146,5323,4887],{"class":156},[146,5325,400],{"class":263},[146,5327,4905],{"class":156},[146,5329,400],{"class":263},[146,5331,4923],{"class":156},[146,5333,548],{"class":263},[146,5335,5336,5339,5342],{"class":148,"line":863},[146,5337,5338],{"class":259},"                raise",[146,5340,5341],{"class":156}," ValueError",[146,5343,912],{"class":263},[146,5345,5346,5349,5352,5354,5357,5359,5361,5363,5366,5368],{"class":148,"line":872},[146,5347,5348],{"class":259},"                    f",[146,5350,5351],{"class":160},"\"API error ",[146,5353,685],{"class":156},[146,5355,5356],{"class":263},"response.status_code",[146,5358,691],{"class":156},[146,5360,437],{"class":160},[146,5362,685],{"class":156},[146,5364,5365],{"class":263},"error_msg",[146,5367,691],{"class":156},[146,5369,950],{"class":160},[146,5371,5372],{"class":148,"line":887},[146,5373,5374],{"class":263},"                )\n",[146,5376,5377],{"class":148,"line":903},[146,5378,376],{"emptyLinePlaceholder":58},[146,5380,5381],{"class":148,"line":915},[146,5382,5383],{"class":175},"            # 재시도 가능한 오류 — 지수 백오프 + 지터\n",[146,5385,5386,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5408],{"class":148,"line":953},[146,5387,5213],{"class":259},[146,5389,2511],{"class":263},[146,5391,1180],{"class":259},[146,5393,104],{"class":263},[146,5395,4941],{"class":156},[146,5397,400],{"class":263},[146,5399,4962],{"class":156},[146,5401,400],{"class":263},[146,5403,4982],{"class":156},[146,5405,400],{"class":263},[146,5407,5002],{"class":156},[146,5409,548],{"class":263},[146,5411,5412,5415,5417,5419,5422,5425,5428,5431,5434,5436,5438,5441],{"class":148,"line":959},[146,5413,5414],{"class":263},"                wait ",[146,5416,267],{"class":259},[146,5418,104],{"class":263},[146,5420,5421],{"class":156},"2",[146,5423,5424],{"class":259}," **",[146,5426,5427],{"class":263}," attempt) ",[146,5429,5430],{"class":259},"+",[146,5432,5433],{"class":263}," random.uniform(",[146,5435,783],{"class":156},[146,5437,400],{"class":263},[146,5439,5440],{"class":156},"1",[146,5442,406],{"class":263},[146,5444,5445,5448,5450,5452,5455,5457,5460,5462,5465,5467,5469,5472,5474],{"class":148,"line":964},[146,5446,5447],{"class":156},"                print",[146,5449,794],{"class":263},[146,5451,440],{"class":259},[146,5453,5454],{"class":160},"\"  Retry ",[146,5456,685],{"class":156},[146,5458,5459],{"class":263},"attempt ",[146,5461,5430],{"class":259},[146,5463,5464],{"class":156}," 1}",[146,5466,1225],{"class":160},[146,5468,685],{"class":156},[146,5470,5471],{"class":263},"max_retries",[146,5473,691],{"class":156},[146,5475,5476],{"class":160}," \"\n",[146,5478,5479,5482,5485,5487,5490,5493,5495,5498,5500,5503,5505,5507,5509,5511,5513,5516],{"class":148,"line":970},[146,5480,5481],{"class":259},"                      f",[146,5483,5484],{"class":160},"\"after ",[146,5486,685],{"class":156},[146,5488,5489],{"class":263},"wait",[146,5491,5492],{"class":259},":.1f",[146,5494,691],{"class":156},[146,5496,5497],{"class":160},"s (",[146,5499,685],{"class":156},[146,5501,5502],{"class":263},"error_type",[146,5504,691],{"class":156},[146,5506,437],{"class":160},[146,5508,685],{"class":156},[146,5510,5365],{"class":263},[146,5512,691],{"class":156},[146,5514,5515],{"class":160},")\"",[146,5517,406],{"class":263},[146,5519,5520],{"class":148,"line":976},[146,5521,5522],{"class":263},"                time.sleep(wait)\n",[146,5524,5525],{"class":148,"line":988},[146,5526,5527],{"class":259},"                continue\n",[146,5529,5530],{"class":148,"line":993},[146,5531,376],{"emptyLinePlaceholder":58},[146,5533,5535,5538],{"class":148,"line":5534},48,[146,5536,5537],{"class":259},"        except",[146,5539,5540],{"class":263}," requests.exceptions.Timeout:\n",[146,5542,5544],{"class":148,"line":5543},49,[146,5545,5546],{"class":175},"            # 서버가 30초 내에 응답하지 않음\n",[146,5548,5550,5553,5555,5557,5559,5561,5563,5565,5567,5569,5571,5573],{"class":148,"line":5549},50,[146,5551,5552],{"class":263},"            wait ",[146,5554,267],{"class":259},[146,5556,104],{"class":263},[146,5558,5421],{"class":156},[146,5560,5424],{"class":259},[146,5562,5427],{"class":263},[146,5564,5430],{"class":259},[146,5566,5433],{"class":263},[146,5568,783],{"class":156},[146,5570,400],{"class":263},[146,5572,5440],{"class":156},[146,5574,406],{"class":263},[146,5576,5578,5581,5583,5585,5588,5590,5592,5594,5596,5598,5600,5602,5604],{"class":148,"line":5577},51,[146,5579,5580],{"class":156},"            print",[146,5582,794],{"class":263},[146,5584,440],{"class":259},[146,5586,5587],{"class":160},"\"  Timeout. Retry ",[146,5589,685],{"class":156},[146,5591,5459],{"class":263},[146,5593,5430],{"class":259},[146,5595,5464],{"class":156},[146,5597,1225],{"class":160},[146,5599,685],{"class":156},[146,5601,5471],{"class":263},[146,5603,691],{"class":156},[146,5605,5476],{"class":160},[146,5607,5609,5612,5614,5616,5618,5620,5622,5624],{"class":148,"line":5608},52,[146,5610,5611],{"class":259},"                  f",[146,5613,5484],{"class":160},[146,5615,685],{"class":156},[146,5617,5489],{"class":263},[146,5619,5492],{"class":259},[146,5621,691],{"class":156},[146,5623,1024],{"class":160},[146,5625,406],{"class":263},[146,5627,5629],{"class":148,"line":5628},53,[146,5630,5631],{"class":263},"            time.sleep(wait)\n",[146,5633,5635],{"class":148,"line":5634},54,[146,5636,5637],{"class":259},"            continue\n",[146,5639,5641],{"class":148,"line":5640},55,[146,5642,376],{"emptyLinePlaceholder":58},[146,5644,5646,5648,5651,5653],{"class":148,"line":5645},56,[146,5647,5537],{"class":259},[146,5649,5650],{"class":263}," requests.exceptions.ConnectionError ",[146,5652,1166],{"class":259},[146,5654,5655],{"class":263}," e:\n",[146,5657,5659],{"class":148,"line":5658},57,[146,5660,5661],{"class":175},"            # DNS 실패, 연결 거부 등\n",[146,5663,5665,5667,5669,5671,5673,5675,5677,5679,5681,5683,5685,5687],{"class":148,"line":5664},58,[146,5666,5552],{"class":263},[146,5668,267],{"class":259},[146,5670,104],{"class":263},[146,5672,5421],{"class":156},[146,5674,5424],{"class":259},[146,5676,5427],{"class":263},[146,5678,5430],{"class":259},[146,5680,5433],{"class":263},[146,5682,783],{"class":156},[146,5684,400],{"class":263},[146,5686,5440],{"class":156},[146,5688,406],{"class":263},[146,5690,5692,5694,5696,5698,5701,5703,5706,5708,5711,5713,5715,5717,5719,5721,5723,5725,5727],{"class":148,"line":5691},59,[146,5693,5580],{"class":156},[146,5695,794],{"class":263},[146,5697,440],{"class":259},[146,5699,5700],{"class":160},"\"  Connection error: ",[146,5702,685],{"class":156},[146,5704,5705],{"class":263},"e",[146,5707,691],{"class":156},[146,5709,5710],{"class":160},". Retry ",[146,5712,685],{"class":156},[146,5714,5459],{"class":263},[146,5716,5430],{"class":259},[146,5718,5464],{"class":156},[146,5720,1225],{"class":160},[146,5722,685],{"class":156},[146,5724,5471],{"class":263},[146,5726,691],{"class":156},[146,5728,5476],{"class":160},[146,5730,5732,5734,5736,5738,5740,5742,5744,5746],{"class":148,"line":5731},60,[146,5733,5611],{"class":259},[146,5735,5484],{"class":160},[146,5737,685],{"class":156},[146,5739,5489],{"class":263},[146,5741,5492],{"class":259},[146,5743,691],{"class":156},[146,5745,1024],{"class":160},[146,5747,406],{"class":263},[146,5749,5751],{"class":148,"line":5750},61,[146,5752,5631],{"class":263},[146,5754,5756],{"class":148,"line":5755},62,[146,5757,5637],{"class":259},[146,5759,5761],{"class":148,"line":5760},63,[146,5762,376],{"emptyLinePlaceholder":58},[146,5764,5766,5768,5770,5772,5774,5777,5779,5781,5783,5786],{"class":148,"line":5765},64,[146,5767,996],{"class":259},[146,5769,909],{"class":156},[146,5771,794],{"class":263},[146,5773,440],{"class":259},[146,5775,5776],{"class":160},"\"Failed after ",[146,5778,685],{"class":156},[146,5780,5471],{"class":263},[146,5782,691],{"class":156},[146,5784,5785],{"class":160}," retries\"",[146,5787,406],{"class":263},[11,5789,5790],{},"이 코드가 처리하는 것:",[97,5792,5793,5799,5805,5811,5817],{},[73,5794,5795,5798],{},[23,5796,5797],{},"속도 제한 (429)"," — 지수 백오프 + 지터로 여러 클라이언트의 동기화된 재시도 방지",[73,5800,5801,5804],{},[23,5802,5803],{},"서버 오류 (500/502/503)"," — 증가하는 지연으로 자동 재시도",[73,5806,5807,5810],{},[23,5808,5809],{},"타임아웃"," — 30초 타임아웃으로 응답 없는 서버에서 멈추는 것 방지",[73,5812,5813,5816],{},[23,5814,5815],{},"연결 끊김"," — DNS 실패, 연결 거부, 네트워크 불안정",[73,5818,5819,5822],{},[23,5820,5821],{},"클라이언트 오류 (400/401/402/404/413/422)"," — 잘못된 입력은 재시도로 해결할 수 없으므로 즉시 실패",[18,5824,5825],{},[11,5826,5827,5829],{},[23,5828,134],{}," 프로덕션 시스템에서는 실패한 요청의 전체 payload와 오류 응답을 로깅하는 것을 권장합니다. 새벽 3시에 문제가 발생했을 때 디버깅이 훨씬 쉬워집니다.",[92,5831,5833],{"id":5832},"api-호출-전-입력-검증","API 호출 전 입력 검증",[11,5835,5836],{},"API를 호출하기 전에 명백한 오류를 로컬에서 잡아 크레딧과 시간을 절약하세요:",[137,5838,5840],{"className":338,"code":5839,"language":340,"meta":142,"style":142},"def validate_payload(payload):\n    \"\"\"\n    API로 보내기 전에 생성 payload를 검증합니다.\n    400 오류를 유발하는 일반적인 실수를 잡습니다.\n    \"\"\"\n    errors = []\n    \n    # 필수 필드\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required and cannot be empty\")\n    \n    # 길이 범위\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    \n    # 품질 값\n    valid_qualities = {\"480p\", \"720p\", \"1080p\"}\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in valid_qualities:\n        errors.append(f\"'quality' must be one of {valid_qualities}, got '{quality}'\")\n    \n    # 화면 비율 값\n    valid_ratios = {\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"21:9\"}\n    ratio = payload.get(\"aspect_ratio\", \"16:9\")\n    if ratio not in valid_ratios:\n        errors.append(f\"'aspect_ratio' must be one of {valid_ratios}, got '{ratio}'\")\n    \n    # 이미지 URL 검증\n    image_urls = payload.get(\"image_urls\", [])\n    if len(image_urls) > 9:\n        errors.append(f\"Maximum 9 images allowed, got {len(image_urls)}\")\n    for i, url in enumerate(image_urls):\n        if not url.startswith((\"http://\", \"https://\")):\n            errors.append(f\"image_urls[{i}] must be an HTTP(S) URL\")\n    \n    if errors:\n        raise ValueError(f\"Payload validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n    \n    return True\n",[28,5841,5842,5852,5856,5861,5866,5870,5880,5884,5889,5904,5914,5940,5949,5953,5958,5976,6001,6020,6024,6029,6051,6069,6085,6115,6119,6124,6160,6178,6192,6221,6225,6230,6245,6262,6283,6298,6318,6340,6344,6351,6406,6410],{"__ignoreMap":142},[146,5843,5844,5846,5849],{"class":148,"line":149},[146,5845,526],{"class":259},[146,5847,5848],{"class":152}," validate_payload",[146,5850,5851],{"class":263},"(payload):\n",[146,5853,5854],{"class":148,"line":167},[146,5855,553],{"class":160},[146,5857,5858],{"class":148,"line":179},[146,5859,5860],{"class":160},"    API로 보내기 전에 생성 payload를 검증합니다.\n",[146,5862,5863],{"class":148,"line":188},[146,5864,5865],{"class":160},"    400 오류를 유발하는 일반적인 실수를 잡습니다.\n",[146,5867,5868],{"class":148,"line":373},[146,5869,553],{"class":160},[146,5871,5872,5875,5877],{"class":148,"line":379},[146,5873,5874],{"class":263},"    errors ",[146,5876,267],{"class":259},[146,5878,5879],{"class":263}," []\n",[146,5881,5882],{"class":148,"line":385},[146,5883,563],{"class":263},[146,5885,5886],{"class":148,"line":409},[146,5887,5888],{"class":175},"    # 필수 필드\n",[146,5890,5891,5893,5896,5899,5902],{"class":148,"line":420},[146,5892,2508],{"class":259},[146,5894,5895],{"class":259}," not",[146,5897,5898],{"class":263}," payload.get(",[146,5900,5901],{"class":160},"\"model\"",[146,5903,548],{"class":263},[146,5905,5906,5909,5912],{"class":148,"line":431},[146,5907,5908],{"class":263},"        errors.append(",[146,5910,5911],{"class":160},"\"'model' is required\"",[146,5913,406],{"class":263},[146,5915,5916,5918,5920,5922,5925,5927,5930,5932,5935,5937],{"class":148,"line":455},[146,5917,2508],{"class":259},[146,5919,5895],{"class":259},[146,5921,5898],{"class":263},[146,5923,5924],{"class":160},"\"prompt\"",[146,5926,1163],{"class":263},[146,5928,5929],{"class":259},"or",[146,5931,5895],{"class":259},[146,5933,5934],{"class":263}," payload[",[146,5936,5924],{"class":160},[146,5938,5939],{"class":263},"].strip():\n",[146,5941,5942,5944,5947],{"class":148,"line":466},[146,5943,5908],{"class":263},[146,5945,5946],{"class":160},"\"'prompt' is required and cannot be empty\"",[146,5948,406],{"class":263},[146,5950,5951],{"class":148,"line":600},[146,5952,563],{"class":263},[146,5954,5955],{"class":148,"line":605},[146,5956,5957],{"class":175},"    # 길이 범위\n",[146,5959,5960,5963,5965,5967,5970,5972,5974],{"class":148,"line":611},[146,5961,5962],{"class":263},"    duration ",[146,5964,267],{"class":259},[146,5966,5898],{"class":263},[146,5968,5969],{"class":160},"\"duration\"",[146,5971,400],{"class":263},[146,5973,1352],{"class":156},[146,5975,406],{"class":263},[146,5977,5978,5980,5983,5985,5988,5991,5993,5996,5999],{"class":148,"line":617},[146,5979,2508],{"class":259},[146,5981,5982],{"class":263}," duration ",[146,5984,648],{"class":259},[146,5986,5987],{"class":156}," 4",[146,5989,5990],{"class":259}," or",[146,5992,5982],{"class":263},[146,5994,5995],{"class":259},">",[146,5997,5998],{"class":156}," 15",[146,6000,860],{"class":263},[146,6002,6003,6005,6007,6010,6012,6014,6016,6018],{"class":148,"line":623},[146,6004,5908],{"class":263},[146,6006,440],{"class":259},[146,6008,6009],{"class":160},"\"'duration' must be 4-15, got ",[146,6011,685],{"class":156},[146,6013,1774],{"class":263},[146,6015,691],{"class":156},[146,6017,449],{"class":160},[146,6019,406],{"class":263},[146,6021,6022],{"class":148,"line":628},[146,6023,563],{"class":263},[146,6025,6026],{"class":148,"line":639},[146,6027,6028],{"class":175},"    # 품질 값\n",[146,6030,6031,6034,6036,6039,6041,6043,6045,6047,6049],{"class":148,"line":654},[146,6032,6033],{"class":263},"    valid_qualities ",[146,6035,267],{"class":259},[146,6037,6038],{"class":263}," {",[146,6040,4017],{"class":160},[146,6042,400],{"class":263},[146,6044,1368],{"class":160},[146,6046,400],{"class":263},[146,6048,3714],{"class":160},[146,6050,469],{"class":263},[146,6052,6053,6056,6058,6060,6063,6065,6067],{"class":148,"line":660},[146,6054,6055],{"class":263},"    quality ",[146,6057,267],{"class":259},[146,6059,5898],{"class":263},[146,6061,6062],{"class":160},"\"quality\"",[146,6064,400],{"class":263},[146,6066,1368],{"class":160},[146,6068,406],{"class":263},[146,6070,6071,6073,6076,6079,6082],{"class":148,"line":671},[146,6072,2508],{"class":259},[146,6074,6075],{"class":263}," quality ",[146,6077,6078],{"class":259},"not",[146,6080,6081],{"class":259}," in",[146,6083,6084],{"class":263}," valid_qualities:\n",[146,6086,6087,6089,6091,6094,6096,6099,6101,6104,6106,6108,6110,6113],{"class":148,"line":698},[146,6088,5908],{"class":263},[146,6090,440],{"class":259},[146,6092,6093],{"class":160},"\"'quality' must be one of ",[146,6095,685],{"class":156},[146,6097,6098],{"class":263},"valid_qualities",[146,6100,691],{"class":156},[146,6102,6103],{"class":160},", got '",[146,6105,685],{"class":156},[146,6107,1782],{"class":263},[146,6109,691],{"class":156},[146,6111,6112],{"class":160},"'\"",[146,6114,406],{"class":263},[146,6116,6117],{"class":148,"line":710},[146,6118,563],{"class":263},[146,6120,6121],{"class":148,"line":716},[146,6122,6123],{"class":175},"    # 화면 비율 값\n",[146,6125,6126,6129,6131,6133,6135,6137,6139,6141,6144,6146,6149,6151,6154,6156,6158],{"class":148,"line":722},[146,6127,6128],{"class":263},"    valid_ratios ",[146,6130,267],{"class":259},[146,6132,6038],{"class":263},[146,6134,1384],{"class":160},[146,6136,400],{"class":263},[146,6138,3726],{"class":160},[146,6140,400],{"class":263},[146,6142,6143],{"class":160},"\"1:1\"",[146,6145,400],{"class":263},[146,6147,6148],{"class":160},"\"4:3\"",[146,6150,400],{"class":263},[146,6152,6153],{"class":160},"\"3:4\"",[146,6155,400],{"class":263},[146,6157,3837],{"class":160},[146,6159,469],{"class":263},[146,6161,6162,6165,6167,6169,6172,6174,6176],{"class":148,"line":728},[146,6163,6164],{"class":263},"    ratio ",[146,6166,267],{"class":259},[146,6168,5898],{"class":263},[146,6170,6171],{"class":160},"\"aspect_ratio\"",[146,6173,400],{"class":263},[146,6175,1384],{"class":160},[146,6177,406],{"class":263},[146,6179,6180,6182,6185,6187,6189],{"class":148,"line":739},[146,6181,2508],{"class":259},[146,6183,6184],{"class":263}," ratio ",[146,6186,6078],{"class":259},[146,6188,6081],{"class":259},[146,6190,6191],{"class":263}," valid_ratios:\n",[146,6193,6194,6196,6198,6201,6203,6206,6208,6210,6212,6215,6217,6219],{"class":148,"line":744},[146,6195,5908],{"class":263},[146,6197,440],{"class":259},[146,6199,6200],{"class":160},"\"'aspect_ratio' must be one of ",[146,6202,685],{"class":156},[146,6204,6205],{"class":263},"valid_ratios",[146,6207,691],{"class":156},[146,6209,6103],{"class":160},[146,6211,685],{"class":156},[146,6213,6214],{"class":263},"ratio",[146,6216,691],{"class":156},[146,6218,6112],{"class":160},[146,6220,406],{"class":263},[146,6222,6223],{"class":148,"line":750},[146,6224,563],{"class":263},[146,6226,6227],{"class":148,"line":767},[146,6228,6229],{"class":175},"    # 이미지 URL 검증\n",[146,6231,6232,6235,6237,6239,6242],{"class":148,"line":788},[146,6233,6234],{"class":263},"    image_urls ",[146,6236,267],{"class":259},[146,6238,5898],{"class":263},[146,6240,6241],{"class":160},"\"image_urls\"",[146,6243,6244],{"class":263},", [])\n",[146,6246,6247,6249,6252,6255,6257,6260],{"class":148,"line":834},[146,6248,2508],{"class":259},[146,6250,6251],{"class":156}," len",[146,6253,6254],{"class":263},"(image_urls) ",[146,6256,5995],{"class":259},[146,6258,6259],{"class":156}," 9",[146,6261,860],{"class":263},[146,6263,6264,6266,6268,6271,6274,6277,6279,6281],{"class":148,"line":839},[146,6265,5908],{"class":263},[146,6267,440],{"class":259},[146,6269,6270],{"class":160},"\"Maximum 9 images allowed, got ",[146,6272,6273],{"class":156},"{len",[146,6275,6276],{"class":263},"(image_urls)",[146,6278,691],{"class":156},[146,6280,449],{"class":160},[146,6282,406],{"class":263},[146,6284,6285,6287,6290,6292,6295],{"class":148,"line":845},[146,6286,5122],{"class":259},[146,6288,6289],{"class":263}," i, url ",[146,6291,1180],{"class":259},[146,6293,6294],{"class":156}," enumerate",[146,6296,6297],{"class":263},"(image_urls):\n",[146,6299,6300,6302,6304,6307,6310,6312,6315],{"class":148,"line":863},[146,6301,848],{"class":259},[146,6303,5895],{"class":259},[146,6305,6306],{"class":263}," url.startswith((",[146,6308,6309],{"class":160},"\"http://\"",[146,6311,400],{"class":263},[146,6313,6314],{"class":160},"\"https://\"",[146,6316,6317],{"class":263},")):\n",[146,6319,6320,6323,6325,6328,6330,6333,6335,6338],{"class":148,"line":872},[146,6321,6322],{"class":263},"            errors.append(",[146,6324,440],{"class":259},[146,6326,6327],{"class":160},"\"image_urls[",[146,6329,685],{"class":156},[146,6331,6332],{"class":263},"i",[146,6334,691],{"class":156},[146,6336,6337],{"class":160},"] must be an HTTP(S) URL\"",[146,6339,406],{"class":263},[146,6341,6342],{"class":148,"line":887},[146,6343,563],{"class":263},[146,6345,6346,6348],{"class":148,"line":903},[146,6347,2508],{"class":259},[146,6349,6350],{"class":263}," errors:\n",[146,6352,6353,6356,6358,6360,6362,6365,6367,6369,6372,6375,6377,6379,6382,6384,6387,6389,6391,6393,6395,6398,6401,6403],{"class":148,"line":915},[146,6354,6355],{"class":259},"        raise",[146,6357,5341],{"class":156},[146,6359,794],{"class":263},[146,6361,440],{"class":259},[146,6363,6364],{"class":160},"\"Payload validation failed:",[146,6366,1670],{"class":156},[146,6368,449],{"class":160},[146,6370,6371],{"class":259}," +",[146,6373,6374],{"class":160}," \"",[146,6376,1670],{"class":156},[146,6378,449],{"class":160},[146,6380,6381],{"class":263},".join(",[146,6383,440],{"class":259},[146,6385,6386],{"class":160},"\"  - ",[146,6388,685],{"class":156},[146,6390,5705],{"class":263},[146,6392,691],{"class":156},[146,6394,449],{"class":160},[146,6396,6397],{"class":259}," for",[146,6399,6400],{"class":263}," e ",[146,6402,1180],{"class":259},[146,6404,6405],{"class":263}," errors))\n",[146,6407,6408],{"class":148,"line":953},[146,6409,563],{"class":263},[146,6411,6412,6414],{"class":148,"line":959},[146,6413,1703],{"class":259},[146,6415,6416],{"class":156}," True\n",[18,6418,6419],{},[11,6420,6421,6423,6424,6427],{},[23,6422,305],{}," 이미지 URL의 특수 문자를 URL 인코딩하는 것을 잊는 경우. 이미지 경로에 공백이나 비ASCII 문자가 포함되어 있다면 ",[28,6425,6426],{},"urllib.parse.quote()","로 인코딩하세요.",[45,6429],{},[48,6431,6433],{"id":6432},"webhook-설정-polling-건너뛰기","Webhook 설정 (Polling 건너뛰기)",[11,6435,6436,6437,6440],{},"Polling은 스크립트와 프로토타이핑에 충분합니다. 프로덕션 시스템에서는 ",[23,6438,6439],{},"webhook","이 더 효율적입니다 — 비디오가 준비되면 API가 결과를 서버로 직접 푸시합니다. 낭비되는 요청 없이, 완료와 알림 사이에 지연도 없습니다.",[92,6442,6444],{"id":6443},"작동-방식","작동 방식",[11,6446,6447,6448,6450],{},"생성 요청에 ",[28,6449,3603],{},"을 추가합니다:",[11,6452,6453],{},[2621,6454,6455],{},"위 첫 번째 예제와 동일한 설정을 사용합니다.",[137,6457,6459],{"className":338,"code":6458,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A spaceship launches from a desert landscape at sunset.\",\n    \"duration\": 8,\n    \"quality\": \"720p\",\n    \"callback_url\": \"https://your-server.com/api/webhook/seedance\"\n}\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\ntask = response.json()\nprint(f\"Task submitted: {task['id']}\")\n# Polling 불필요 — webhook이 결과를 수신합니다\n",[28,6460,6461,6469,6479,6490,6500,6510,6520,6524,6528,6537,6550,6561,6570,6574,6583,6609],{"__ignoreMap":142},[146,6462,6463,6465,6467],{"class":148,"line":149},[146,6464,3665],{"class":263},[146,6466,267],{"class":259},[146,6468,428],{"class":263},[146,6470,6471,6473,6475,6477],{"class":148,"line":167},[146,6472,3674],{"class":160},[146,6474,437],{"class":263},[146,6476,1308],{"class":160},[146,6478,452],{"class":263},[146,6480,6481,6483,6485,6488],{"class":148,"line":179},[146,6482,3685],{"class":160},[146,6484,437],{"class":263},[146,6486,6487],{"class":160},"\"A spaceship launches from a desert landscape at sunset.\"",[146,6489,452],{"class":263},[146,6491,6492,6494,6496,6498],{"class":148,"line":188},[146,6493,3697],{"class":160},[146,6495,437],{"class":263},[146,6497,3702],{"class":156},[146,6499,452],{"class":263},[146,6501,6502,6504,6506,6508],{"class":148,"line":373},[146,6503,3709],{"class":160},[146,6505,437],{"class":263},[146,6507,1368],{"class":160},[146,6509,452],{"class":263},[146,6511,6512,6515,6517],{"class":148,"line":379},[146,6513,6514],{"class":160},"    \"callback_url\"",[146,6516,437],{"class":263},[146,6518,6519],{"class":160},"\"https://your-server.com/api/webhook/seedance\"\n",[146,6521,6522],{"class":148,"line":385},[146,6523,469],{"class":263},[146,6525,6526],{"class":148,"line":409},[146,6527,376],{"emptyLinePlaceholder":58},[146,6529,6530,6533,6535],{"class":148,"line":420},[146,6531,6532],{"class":263},"response ",[146,6534,267],{"class":259},[146,6536,1432],{"class":263},[146,6538,6539,6542,6544,6546,6548],{"class":148,"line":431},[146,6540,6541],{"class":259},"    f",[146,6543,449],{"class":160},[146,6545,679],{"class":156},[146,6547,1444],{"class":160},[146,6549,452],{"class":263},[146,6551,6552,6555,6557,6559],{"class":148,"line":455},[146,6553,6554],{"class":701},"    headers",[146,6556,267],{"class":259},[146,6558,423],{"class":156},[146,6560,452],{"class":263},[146,6562,6563,6566,6568],{"class":148,"line":466},[146,6564,6565],{"class":701},"    json",[146,6567,267],{"class":259},[146,6569,2790],{"class":263},[146,6571,6572],{"class":148,"line":600},[146,6573,406],{"class":263},[146,6575,6576,6579,6581],{"class":148,"line":605},[146,6577,6578],{"class":263},"task ",[146,6580,267],{"class":259},[146,6582,736],{"class":263},[146,6584,6585,6588,6590,6592,6595,6597,6599,6601,6603,6605,6607],{"class":148,"line":611},[146,6586,6587],{"class":156},"print",[146,6589,794],{"class":263},[146,6591,440],{"class":259},[146,6593,6594],{"class":160},"\"Task submitted: ",[146,6596,685],{"class":156},[146,6598,1529],{"class":263},[146,6600,1532],{"class":160},[146,6602,1535],{"class":263},[146,6604,691],{"class":156},[146,6606,449],{"class":160},[146,6608,406],{"class":263},[146,6610,6611],{"class":148,"line":617},[146,6612,6613],{"class":175},"# Polling 불필요 — webhook이 결과를 수신합니다\n",[11,6615,6616,6617,6619],{},"비디오가 준비되면 API가 ",[28,6618,3603],{},"로 완료된 task 객체를 담은 POST 요청을 보냅니다 — polling으로 받는 것과 완전히 동일한 내용입니다.",[92,6621,6623],{"id":6622},"webhook-요구사항","Webhook 요구사항",[2035,6625,6626,6636],{},[2038,6627,6628],{},[2041,6629,6630,6633],{},[2044,6631,6632],{},"요구사항",[2044,6634,6635],{},"상세",[2051,6637,6638,6646,6654,6662,6670,6678],{},[2041,6639,6640,6643],{},[2056,6641,6642],{},"프로토콜",[2056,6644,6645],{},"HTTPS만 지원 (HTTP 불가) — 보안 요구사항",[2041,6647,6648,6651],{},[2056,6649,6650],{},"응답",[2056,6652,6653],{},"10초 내에 2xx 반환",[2041,6655,6656,6659],{},[2056,6657,6658],{},"재시도",[2056,6660,6661],{},"실패 시 3회 재시도 (1초, 2초, 4초 간격)",[2041,6663,6664,6667],{},[2056,6665,6666],{},"URL 길이",[2056,6668,6669],{},"≤ 2048자",[2041,6671,6672,6675],{},[2056,6673,6674],{},"네트워크",[2056,6676,6677],{},"내부/사설 IP 불가 (localhost, 10.x.x.x, 192.168.x.x)",[2041,6679,6680,6683],{},[2056,6681,6682],{},"본문",[2056,6684,6685],{},"전체 task 객체를 담은 JSON POST",[92,6687,6689],{"id":6688},"프로덕션-flask-webhook-수신기","프로덕션 Flask Webhook 수신기",[11,6691,6692],{},"적절한 검증, 오류 처리, 비동기 비디오 다운로드를 갖춘 완전한 webhook 서버:",[137,6694,6696],{"className":338,"code":6695,"language":340,"meta":142,"style":142},"# webhook_server.py\n\"\"\"\nSeedance webhook 수신기 — 비디오 생성 완료 콜백을 처리합니다.\n실행: pip install flask requests\n      python webhook_server.py\n\"\"\"\nfrom flask import Flask, request, jsonify\nimport json\nimport os\nimport threading\nimport requests as req  # flask.request와의 충돌을 피하기 위해 이름 변경\n\napp = Flask(__name__)\n\n# 완료된 비디오를 저장할 디렉토리\nOUTPUT_DIR = os.getenv(\"VIDEO_OUTPUT_DIR\", \"./videos\")\nos.makedirs(OUTPUT_DIR, exist_ok=True)\n\n\ndef download_video_async(video_url, task_id):\n    \"\"\"백그라운드 스레드에서 비디오를 다운로드하여 webhook 응답을 차단하지 않습니다.\"\"\"\n    try:\n        filename = os.path.join(OUTPUT_DIR, f\"{task_id}.mp4\")\n        print(f\"  Downloading {task_id} to {filename}...\")\n        resp = req.get(video_url, stream=True, timeout=120)\n        resp.raise_for_status()\n        with open(filename, \"wb\") as f:\n            for chunk in resp.iter_content(chunk_size=8192):\n                f.write(chunk)\n        size_mb = os.path.getsize(filename) / (1024 * 1024)\n        print(f\"  Saved: {filename} ({size_mb:.1f} MB)\")\n    except Exception as e:\n        print(f\"  Download failed for {task_id}: {e}\")\n\n\n@app.route(\"/api/webhook/seedance\", methods=[\"POST\"])\ndef handle_webhook():\n    \"\"\"\n    Seedance 비디오 생성 완료 webhook을 처리합니다.\n    \n    비디오 생성이 완료(성공 또는 실패)되면\n    API가 전체 task 객체를 담은 POST를 보냅니다.\n    \"\"\"\n    # 수신된 task 객체 파싱\n    task = request.json\n    if not task:\n        return jsonify({\"error\": \"Empty body\"}), 400\n    \n    task_id = task.get(\"id\", \"unknown\")\n    status = task.get(\"status\", \"unknown\")\n    model = task.get(\"model\", \"unknown\")\n\n    print(f\"\\n{'='*50}\")\n    print(f\"Webhook received: task={task_id}\")\n    print(f\"  Status: {status}\")\n    print(f\"  Model: {model}\")\n\n    if status == \"completed\":\n        # results에서 비디오 URL 추출\n        results = task.get(\"results\", [])\n        if results:\n            video_url = results[0]\n            print(f\"  Video URL: {video_url}\")\n            \n            # 백그라운드 스레드에서 다운로드하여 빠르게 응답\n            thread = threading.Thread(\n                target=download_video_async,\n                args=(video_url, task_id)\n            )\n            thread.start()\n        else:\n            print(f\"  WARNING: Completed but no results array!\")\n\n    elif status == \"failed\":\n        error_info = task.get(\"error\", {})\n        print(f\"  FAILED: {json.dumps(error_info, indent=2)}\")\n        # TODO: 오류 추적 시스템에 기록 (Sentry 등)\n        # TODO: 선택적으로 수정된 파라미터로 재생성 시도\n\n    else:\n        print(f\"  Unexpected status: {status}\")\n        print(f\"  Full payload: {json.dumps(task, indent=2)}\")\n\n    # 항상 빠르게 200 반환 — API는 10초 내 응답을 기대합니다\n    return jsonify({\"received\": True, \"task_id\": task_id}), 200\n\n\n@app.route(\"/health\", methods=[\"GET\"])\ndef health_check():\n    \"\"\"로드 밸런서용 헬스 체크 엔드포인트.\"\"\"\n    return jsonify({\"status\": \"ok\"}), 200\n\n\nif __name__ == \"__main__\":\n    print(f\"Starting webhook server...\")\n    print(f\"Videos will be saved to: {os.path.abspath(OUTPUT_DIR)}\")\n    print(f\"Webhook URL: http://localhost:5000/api/webhook/seedance\")\n    app.run(host=\"0.0.0.0\", port=5000, debug=True)\n",[28,6697,6698,6703,6708,6713,6718,6723,6727,6740,6746,6752,6759,6774,6778,6793,6797,6802,6821,6839,6843,6847,6857,6862,6869,6898,6928,6955,6960,6977,6996,7001,7025,7058,7071,7100,7104,7108,7133,7142,7146,7151,7155,7160,7165,7169,7174,7183,7192,7213,7217,7235,7252,7269,7273,7299,7320,7341,7362,7366,7378,7383,7396,7403,7417,7438,7443,7449,7460,7471,7482,7487,7493,7501,7515,7520,7534,7548,7580,7592,7602,7607,7614,7636,7667,7672,7678,7703,7708,7713,7736,7746,7752,7770,7775,7780,7793,7807,7834,7848],{"__ignoreMap":142},[146,6699,6700],{"class":148,"line":149},[146,6701,6702],{"class":175},"# webhook_server.py\n",[146,6704,6705],{"class":148,"line":167},[146,6706,6707],{"class":160},"\"\"\"\n",[146,6709,6710],{"class":148,"line":179},[146,6711,6712],{"class":160},"Seedance webhook 수신기 — 비디오 생성 완료 콜백을 처리합니다.\n",[146,6714,6715],{"class":148,"line":188},[146,6716,6717],{"class":160},"실행: pip install flask requests\n",[146,6719,6720],{"class":148,"line":373},[146,6721,6722],{"class":160},"      python webhook_server.py\n",[146,6724,6725],{"class":148,"line":379},[146,6726,6707],{"class":160},[146,6728,6729,6732,6735,6737],{"class":148,"line":385},[146,6730,6731],{"class":259},"from",[146,6733,6734],{"class":263}," flask ",[146,6736,347],{"class":259},[146,6738,6739],{"class":263}," Flask, request, jsonify\n",[146,6741,6742,6744],{"class":148,"line":409},[146,6743,347],{"class":259},[146,6745,370],{"class":263},[146,6747,6748,6750],{"class":148,"line":420},[146,6749,347],{"class":259},[146,6751,363],{"class":263},[146,6753,6754,6756],{"class":148,"line":431},[146,6755,347],{"class":259},[146,6757,6758],{"class":263}," threading\n",[146,6760,6761,6763,6766,6768,6771],{"class":148,"line":455},[146,6762,347],{"class":259},[146,6764,6765],{"class":263}," requests ",[146,6767,1166],{"class":259},[146,6769,6770],{"class":263}," req  ",[146,6772,6773],{"class":175},"# flask.request와의 충돌을 피하기 위해 이름 변경\n",[146,6775,6776],{"class":148,"line":466},[146,6777,376],{"emptyLinePlaceholder":58},[146,6779,6780,6783,6785,6788,6791],{"class":148,"line":600},[146,6781,6782],{"class":263},"app ",[146,6784,267],{"class":259},[146,6786,6787],{"class":263}," Flask(",[146,6789,6790],{"class":156},"__name__",[146,6792,406],{"class":263},[146,6794,6795],{"class":148,"line":605},[146,6796,376],{"emptyLinePlaceholder":58},[146,6798,6799],{"class":148,"line":611},[146,6800,6801],{"class":175},"# 완료된 비디오를 저장할 디렉토리\n",[146,6803,6804,6807,6809,6811,6814,6816,6819],{"class":148,"line":617},[146,6805,6806],{"class":156},"OUTPUT_DIR",[146,6808,391],{"class":259},[146,6810,394],{"class":263},[146,6812,6813],{"class":160},"\"VIDEO_OUTPUT_DIR\"",[146,6815,400],{"class":263},[146,6817,6818],{"class":160},"\"./videos\"",[146,6820,406],{"class":263},[146,6822,6823,6826,6828,6830,6833,6835,6837],{"class":148,"line":623},[146,6824,6825],{"class":263},"os.makedirs(",[146,6827,6806],{"class":156},[146,6829,400],{"class":263},[146,6831,6832],{"class":701},"exist_ok",[146,6834,267],{"class":259},[146,6836,1139],{"class":156},[146,6838,406],{"class":263},[146,6840,6841],{"class":148,"line":628},[146,6842,376],{"emptyLinePlaceholder":58},[146,6844,6845],{"class":148,"line":639},[146,6846,376],{"emptyLinePlaceholder":58},[146,6848,6849,6851,6854],{"class":148,"line":654},[146,6850,526],{"class":259},[146,6852,6853],{"class":152}," download_video_async",[146,6855,6856],{"class":263},"(video_url, task_id):\n",[146,6858,6859],{"class":148,"line":660},[146,6860,6861],{"class":160},"    \"\"\"백그라운드 스레드에서 비디오를 다운로드하여 webhook 응답을 차단하지 않습니다.\"\"\"\n",[146,6863,6864,6867],{"class":148,"line":671},[146,6865,6866],{"class":259},"    try",[146,6868,860],{"class":263},[146,6870,6871,6874,6876,6879,6881,6883,6885,6887,6889,6891,6893,6896],{"class":148,"line":698},[146,6872,6873],{"class":263},"        filename ",[146,6875,267],{"class":259},[146,6877,6878],{"class":263}," os.path.join(",[146,6880,6806],{"class":156},[146,6882,400],{"class":263},[146,6884,440],{"class":259},[146,6886,449],{"class":160},[146,6888,685],{"class":156},[146,6890,688],{"class":263},[146,6892,691],{"class":156},[146,6894,6895],{"class":160},".mp4\"",[146,6897,406],{"class":263},[146,6899,6900,6902,6904,6906,6909,6911,6913,6915,6918,6920,6922,6924,6926],{"class":148,"line":710},[146,6901,791],{"class":156},[146,6903,794],{"class":263},[146,6905,440],{"class":259},[146,6907,6908],{"class":160},"\"  Downloading ",[146,6910,685],{"class":156},[146,6912,688],{"class":263},[146,6914,691],{"class":156},[146,6916,6917],{"class":160}," to ",[146,6919,685],{"class":156},[146,6921,1114],{"class":263},[146,6923,691],{"class":156},[146,6925,1119],{"class":160},[146,6927,406],{"class":263},[146,6929,6930,6933,6935,6938,6940,6942,6944,6946,6948,6950,6953],{"class":148,"line":716},[146,6931,6932],{"class":263},"        resp ",[146,6934,267],{"class":259},[146,6936,6937],{"class":263}," req.get(video_url, ",[146,6939,1134],{"class":701},[146,6941,267],{"class":259},[146,6943,1139],{"class":156},[146,6945,400],{"class":263},[146,6947,1019],{"class":701},[146,6949,267],{"class":259},[146,6951,6952],{"class":156},"120",[146,6954,406],{"class":263},[146,6956,6957],{"class":148,"line":722},[146,6958,6959],{"class":263},"        resp.raise_for_status()\n",[146,6961,6962,6965,6967,6969,6971,6973,6975],{"class":148,"line":728},[146,6963,6964],{"class":259},"        with",[146,6966,1154],{"class":156},[146,6968,1157],{"class":263},[146,6970,1160],{"class":160},[146,6972,1163],{"class":263},[146,6974,1166],{"class":259},[146,6976,1169],{"class":263},[146,6978,6979,6982,6984,6986,6988,6990,6992,6994],{"class":148,"line":739},[146,6980,6981],{"class":259},"            for",[146,6983,1177],{"class":263},[146,6985,1180],{"class":259},[146,6987,1183],{"class":263},[146,6989,1186],{"class":701},[146,6991,267],{"class":259},[146,6993,1191],{"class":156},[146,6995,548],{"class":263},[146,6997,6998],{"class":148,"line":744},[146,6999,7000],{"class":263},"                f.write(chunk)\n",[146,7002,7003,7006,7008,7011,7013,7015,7018,7021,7023],{"class":148,"line":750},[146,7004,7005],{"class":263},"        size_mb ",[146,7007,267],{"class":259},[146,7009,7010],{"class":263}," os.path.getsize(filename) ",[146,7012,1225],{"class":259},[146,7014,104],{"class":263},[146,7016,7017],{"class":156},"1024",[146,7019,7020],{"class":259}," *",[146,7022,1228],{"class":156},[146,7024,406],{"class":263},[146,7026,7027,7029,7031,7033,7036,7038,7040,7042,7044,7046,7049,7051,7053,7056],{"class":148,"line":767},[146,7028,791],{"class":156},[146,7030,794],{"class":263},[146,7032,440],{"class":259},[146,7034,7035],{"class":160},"\"  Saved: ",[146,7037,685],{"class":156},[146,7039,1114],{"class":263},[146,7041,691],{"class":156},[146,7043,104],{"class":160},[146,7045,685],{"class":156},[146,7047,7048],{"class":263},"size_mb",[146,7050,5492],{"class":259},[146,7052,691],{"class":156},[146,7054,7055],{"class":160}," MB)\"",[146,7057,406],{"class":263},[146,7059,7060,7063,7066,7069],{"class":148,"line":788},[146,7061,7062],{"class":259},"    except",[146,7064,7065],{"class":156}," Exception",[146,7067,7068],{"class":259}," as",[146,7070,5655],{"class":263},[146,7072,7073,7075,7077,7079,7082,7084,7086,7088,7090,7092,7094,7096,7098],{"class":148,"line":834},[146,7074,791],{"class":156},[146,7076,794],{"class":263},[146,7078,440],{"class":259},[146,7080,7081],{"class":160},"\"  Download failed for ",[146,7083,685],{"class":156},[146,7085,688],{"class":263},[146,7087,691],{"class":156},[146,7089,437],{"class":160},[146,7091,685],{"class":156},[146,7093,5705],{"class":263},[146,7095,691],{"class":156},[146,7097,449],{"class":160},[146,7099,406],{"class":263},[146,7101,7102],{"class":148,"line":839},[146,7103,376],{"emptyLinePlaceholder":58},[146,7105,7106],{"class":148,"line":845},[146,7107,376],{"emptyLinePlaceholder":58},[146,7109,7110,7113,7115,7118,7120,7123,7125,7128,7131],{"class":148,"line":863},[146,7111,7112],{"class":152},"@app.route",[146,7114,794],{"class":263},[146,7116,7117],{"class":160},"\"/api/webhook/seedance\"",[146,7119,400],{"class":263},[146,7121,7122],{"class":701},"methods",[146,7124,267],{"class":259},[146,7126,7127],{"class":263},"[",[146,7129,7130],{"class":160},"\"POST\"",[146,7132,1629],{"class":263},[146,7134,7135,7137,7140],{"class":148,"line":872},[146,7136,526],{"class":259},[146,7138,7139],{"class":152}," handle_webhook",[146,7141,1289],{"class":263},[146,7143,7144],{"class":148,"line":887},[146,7145,553],{"class":160},[146,7147,7148],{"class":148,"line":903},[146,7149,7150],{"class":160},"    Seedance 비디오 생성 완료 webhook을 처리합니다.\n",[146,7152,7153],{"class":148,"line":915},[146,7154,563],{"class":160},[146,7156,7157],{"class":148,"line":953},[146,7158,7159],{"class":160},"    비디오 생성이 완료(성공 또는 실패)되면\n",[146,7161,7162],{"class":148,"line":959},[146,7163,7164],{"class":160},"    API가 전체 task 객체를 담은 POST를 보냅니다.\n",[146,7166,7167],{"class":148,"line":964},[146,7168,553],{"class":160},[146,7170,7171],{"class":148,"line":970},[146,7172,7173],{"class":175},"    # 수신된 task 객체 파싱\n",[146,7175,7176,7178,7180],{"class":148,"line":976},[146,7177,1496],{"class":263},[146,7179,267],{"class":259},[146,7181,7182],{"class":263}," request.json\n",[146,7184,7185,7187,7189],{"class":148,"line":988},[146,7186,2508],{"class":259},[146,7188,5895],{"class":259},[146,7190,7191],{"class":263}," task:\n",[146,7193,7194,7197,7200,7202,7204,7207,7210],{"class":148,"line":993},[146,7195,7196],{"class":259},"        return",[146,7198,7199],{"class":263}," jsonify({",[146,7201,897],{"class":160},[146,7203,437],{"class":263},[146,7205,7206],{"class":160},"\"Empty body\"",[146,7208,7209],{"class":263},"}), ",[146,7211,7212],{"class":156},"400\n",[146,7214,7215],{"class":148,"line":5534},[146,7216,563],{"class":263},[146,7218,7219,7222,7224,7226,7228,7230,7233],{"class":148,"line":5543},[146,7220,7221],{"class":263},"    task_id ",[146,7223,267],{"class":259},[146,7225,775],{"class":263},[146,7227,1626],{"class":160},[146,7229,400],{"class":263},[146,7231,7232],{"class":160},"\"unknown\"",[146,7234,406],{"class":263},[146,7236,7237,7240,7242,7244,7246,7248,7250],{"class":148,"line":5549},[146,7238,7239],{"class":263},"    status ",[146,7241,267],{"class":259},[146,7243,775],{"class":263},[146,7245,761],{"class":160},[146,7247,400],{"class":263},[146,7249,7232],{"class":160},[146,7251,406],{"class":263},[146,7253,7254,7257,7259,7261,7263,7265,7267],{"class":148,"line":5577},[146,7255,7256],{"class":263},"    model ",[146,7258,267],{"class":259},[146,7260,775],{"class":263},[146,7262,5901],{"class":160},[146,7264,400],{"class":263},[146,7266,7232],{"class":160},[146,7268,406],{"class":263},[146,7270,7271],{"class":148,"line":5608},[146,7272,376],{"emptyLinePlaceholder":58},[146,7274,7275,7277,7279,7281,7283,7286,7289,7292,7295,7297],{"class":148,"line":5628},[146,7276,1102],{"class":156},[146,7278,794],{"class":263},[146,7280,440],{"class":259},[146,7282,449],{"class":160},[146,7284,7285],{"class":156},"\\n{",[146,7287,7288],{"class":160},"'='",[146,7290,7291],{"class":259},"*",[146,7293,7294],{"class":156},"50}",[146,7296,449],{"class":160},[146,7298,406],{"class":263},[146,7300,7301,7303,7305,7307,7310,7312,7314,7316,7318],{"class":148,"line":5634},[146,7302,1102],{"class":156},[146,7304,794],{"class":263},[146,7306,440],{"class":259},[146,7308,7309],{"class":160},"\"Webhook received: task=",[146,7311,685],{"class":156},[146,7313,688],{"class":263},[146,7315,691],{"class":156},[146,7317,449],{"class":160},[146,7319,406],{"class":263},[146,7321,7322,7324,7326,7328,7331,7333,7335,7337,7339],{"class":148,"line":5640},[146,7323,1102],{"class":156},[146,7325,794],{"class":263},[146,7327,440],{"class":259},[146,7329,7330],{"class":160},"\"  Status: ",[146,7332,685],{"class":156},[146,7334,814],{"class":263},[146,7336,691],{"class":156},[146,7338,449],{"class":160},[146,7340,406],{"class":263},[146,7342,7343,7345,7347,7349,7352,7354,7356,7358,7360],{"class":148,"line":5645},[146,7344,1102],{"class":156},[146,7346,794],{"class":263},[146,7348,440],{"class":259},[146,7350,7351],{"class":160},"\"  Model: ",[146,7353,685],{"class":156},[146,7355,1747],{"class":263},[146,7357,691],{"class":156},[146,7359,449],{"class":160},[146,7361,406],{"class":263},[146,7363,7364],{"class":148,"line":5658},[146,7365,376],{"emptyLinePlaceholder":58},[146,7367,7368,7370,7372,7374,7376],{"class":148,"line":5664},[146,7369,2508],{"class":259},[146,7371,851],{"class":263},[146,7373,854],{"class":259},[146,7375,857],{"class":160},[146,7377,860],{"class":263},[146,7379,7380],{"class":148,"line":5691},[146,7381,7382],{"class":175},"        # results에서 비디오 URL 추출\n",[146,7384,7385,7388,7390,7392,7394],{"class":148,"line":5731},[146,7386,7387],{"class":263},"        results ",[146,7389,267],{"class":259},[146,7391,775],{"class":263},[146,7393,1651],{"class":160},[146,7395,6244],{"class":263},[146,7397,7398,7400],{"class":148,"line":5750},[146,7399,848],{"class":259},[146,7401,7402],{"class":263}," results:\n",[146,7404,7405,7408,7410,7413,7415],{"class":148,"line":5755},[146,7406,7407],{"class":263},"            video_url ",[146,7409,267],{"class":259},[146,7411,7412],{"class":263}," results[",[146,7414,783],{"class":156},[146,7416,764],{"class":263},[146,7418,7419,7421,7423,7425,7428,7430,7432,7434,7436],{"class":148,"line":5760},[146,7420,5580],{"class":156},[146,7422,794],{"class":263},[146,7424,440],{"class":259},[146,7426,7427],{"class":160},"\"  Video URL: ",[146,7429,685],{"class":156},[146,7431,1678],{"class":263},[146,7433,691],{"class":156},[146,7435,449],{"class":160},[146,7437,406],{"class":263},[146,7439,7440],{"class":148,"line":5765},[146,7441,7442],{"class":263},"            \n",[146,7444,7446],{"class":148,"line":7445},65,[146,7447,7448],{"class":175},"            # 백그라운드 스레드에서 다운로드하여 빠르게 응답\n",[146,7450,7452,7455,7457],{"class":148,"line":7451},66,[146,7453,7454],{"class":263},"            thread ",[146,7456,267],{"class":259},[146,7458,7459],{"class":263}," threading.Thread(\n",[146,7461,7463,7466,7468],{"class":148,"line":7462},67,[146,7464,7465],{"class":701},"                target",[146,7467,267],{"class":259},[146,7469,7470],{"class":263},"download_video_async,\n",[146,7472,7474,7477,7479],{"class":148,"line":7473},68,[146,7475,7476],{"class":701},"                args",[146,7478,267],{"class":259},[146,7480,7481],{"class":263},"(video_url, task_id)\n",[146,7483,7485],{"class":148,"line":7484},69,[146,7486,956],{"class":263},[146,7488,7490],{"class":148,"line":7489},70,[146,7491,7492],{"class":263},"            thread.start()\n",[146,7494,7496,7499],{"class":148,"line":7495},71,[146,7497,7498],{"class":259},"        else",[146,7500,860],{"class":263},[146,7502,7504,7506,7508,7510,7513],{"class":148,"line":7503},72,[146,7505,5580],{"class":156},[146,7507,794],{"class":263},[146,7509,440],{"class":259},[146,7511,7512],{"class":160},"\"  WARNING: Completed but no results array!\"",[146,7514,406],{"class":263},[146,7516,7518],{"class":148,"line":7517},73,[146,7519,376],{"emptyLinePlaceholder":58},[146,7521,7523,7526,7528,7530,7532],{"class":148,"line":7522},74,[146,7524,7525],{"class":259},"    elif",[146,7527,851],{"class":263},[146,7529,854],{"class":259},[146,7531,882],{"class":160},[146,7533,860],{"class":263},[146,7535,7537,7540,7542,7544,7546],{"class":148,"line":7536},75,[146,7538,7539],{"class":263},"        error_info ",[146,7541,267],{"class":259},[146,7543,775],{"class":263},[146,7545,897],{"class":160},[146,7547,900],{"class":263},[146,7549,7551,7553,7555,7557,7560,7562,7565,7568,7570,7572,7574,7576,7578],{"class":148,"line":7550},76,[146,7552,791],{"class":156},[146,7554,794],{"class":263},[146,7556,440],{"class":259},[146,7558,7559],{"class":160},"\"  FAILED: ",[146,7561,685],{"class":156},[146,7563,7564],{"class":263},"json.dumps(error_info, ",[146,7566,7567],{"class":701},"indent",[146,7569,267],{"class":259},[146,7571,5421],{"class":156},[146,7573,118],{"class":263},[146,7575,691],{"class":156},[146,7577,449],{"class":160},[146,7579,406],{"class":263},[146,7581,7583,7586,7589],{"class":148,"line":7582},77,[146,7584,7585],{"class":175},"        # ",[146,7587,7588],{"class":259},"TODO",[146,7590,7591],{"class":175},": 오류 추적 시스템에 기록 (Sentry 등)\n",[146,7593,7595,7597,7599],{"class":148,"line":7594},78,[146,7596,7585],{"class":175},[146,7598,7588],{"class":259},[146,7600,7601],{"class":175},": 선택적으로 수정된 파라미터로 재생성 시도\n",[146,7603,7605],{"class":148,"line":7604},79,[146,7606,376],{"emptyLinePlaceholder":58},[146,7608,7610,7612],{"class":148,"line":7609},80,[146,7611,2544],{"class":259},[146,7613,860],{"class":263},[146,7615,7617,7619,7621,7623,7626,7628,7630,7632,7634],{"class":148,"line":7616},81,[146,7618,791],{"class":156},[146,7620,794],{"class":263},[146,7622,440],{"class":259},[146,7624,7625],{"class":160},"\"  Unexpected status: ",[146,7627,685],{"class":156},[146,7629,814],{"class":263},[146,7631,691],{"class":156},[146,7633,449],{"class":160},[146,7635,406],{"class":263},[146,7637,7639,7641,7643,7645,7648,7650,7653,7655,7657,7659,7661,7663,7665],{"class":148,"line":7638},82,[146,7640,791],{"class":156},[146,7642,794],{"class":263},[146,7644,440],{"class":259},[146,7646,7647],{"class":160},"\"  Full payload: ",[146,7649,685],{"class":156},[146,7651,7652],{"class":263},"json.dumps(task, ",[146,7654,7567],{"class":701},[146,7656,267],{"class":259},[146,7658,5421],{"class":156},[146,7660,118],{"class":263},[146,7662,691],{"class":156},[146,7664,449],{"class":160},[146,7666,406],{"class":263},[146,7668,7670],{"class":148,"line":7669},83,[146,7671,376],{"emptyLinePlaceholder":58},[146,7673,7675],{"class":148,"line":7674},84,[146,7676,7677],{"class":175},"    # 항상 빠르게 200 반환 — API는 10초 내 응답을 기대합니다\n",[146,7679,7681,7683,7685,7688,7690,7692,7694,7697,7700],{"class":148,"line":7680},85,[146,7682,1703],{"class":259},[146,7684,7199],{"class":263},[146,7686,7687],{"class":160},"\"received\"",[146,7689,437],{"class":263},[146,7691,1139],{"class":156},[146,7693,400],{"class":263},[146,7695,7696],{"class":160},"\"task_id\"",[146,7698,7699],{"class":263},": task_id}), ",[146,7701,7702],{"class":156},"200\n",[146,7704,7706],{"class":148,"line":7705},86,[146,7707,376],{"emptyLinePlaceholder":58},[146,7709,7711],{"class":148,"line":7710},87,[146,7712,376],{"emptyLinePlaceholder":58},[146,7714,7716,7718,7720,7723,7725,7727,7729,7731,7734],{"class":148,"line":7715},88,[146,7717,7112],{"class":152},[146,7719,794],{"class":263},[146,7721,7722],{"class":160},"\"/health\"",[146,7724,400],{"class":263},[146,7726,7122],{"class":701},[146,7728,267],{"class":259},[146,7730,7127],{"class":263},[146,7732,7733],{"class":160},"\"GET\"",[146,7735,1629],{"class":263},[146,7737,7739,7741,7744],{"class":148,"line":7738},89,[146,7740,526],{"class":259},[146,7742,7743],{"class":152}," health_check",[146,7745,1289],{"class":263},[146,7747,7749],{"class":148,"line":7748},90,[146,7750,7751],{"class":160},"    \"\"\"로드 밸런서용 헬스 체크 엔드포인트.\"\"\"\n",[146,7753,7755,7757,7759,7761,7763,7766,7768],{"class":148,"line":7754},91,[146,7756,1703],{"class":259},[146,7758,7199],{"class":263},[146,7760,761],{"class":160},[146,7762,437],{"class":263},[146,7764,7765],{"class":160},"\"ok\"",[146,7767,7209],{"class":263},[146,7769,7702],{"class":156},[146,7771,7773],{"class":148,"line":7772},92,[146,7774,376],{"emptyLinePlaceholder":58},[146,7776,7778],{"class":148,"line":7777},93,[146,7779,376],{"emptyLinePlaceholder":58},[146,7781,7783,7785,7787,7789,7791],{"class":148,"line":7782},94,[146,7784,1719],{"class":259},[146,7786,1722],{"class":156},[146,7788,1725],{"class":259},[146,7790,1728],{"class":160},[146,7792,860],{"class":263},[146,7794,7796,7798,7800,7802,7805],{"class":148,"line":7795},95,[146,7797,1102],{"class":156},[146,7799,794],{"class":263},[146,7801,440],{"class":259},[146,7803,7804],{"class":160},"\"Starting webhook server...\"",[146,7806,406],{"class":263},[146,7808,7810,7812,7814,7816,7819,7821,7824,7826,7828,7830,7832],{"class":148,"line":7809},96,[146,7811,1102],{"class":156},[146,7813,794],{"class":263},[146,7815,440],{"class":259},[146,7817,7818],{"class":160},"\"Videos will be saved to: ",[146,7820,685],{"class":156},[146,7822,7823],{"class":263},"os.path.abspath(",[146,7825,6806],{"class":156},[146,7827,118],{"class":263},[146,7829,691],{"class":156},[146,7831,449],{"class":160},[146,7833,406],{"class":263},[146,7835,7837,7839,7841,7843,7846],{"class":148,"line":7836},97,[146,7838,1102],{"class":156},[146,7840,794],{"class":263},[146,7842,440],{"class":259},[146,7844,7845],{"class":160},"\"Webhook URL: http://localhost:5000/api/webhook/seedance\"",[146,7847,406],{"class":263},[146,7849,7851,7854,7857,7859,7862,7864,7867,7869,7872,7874,7877,7879,7881],{"class":148,"line":7850},98,[146,7852,7853],{"class":263},"    app.run(",[146,7855,7856],{"class":701},"host",[146,7858,267],{"class":259},[146,7860,7861],{"class":160},"\"0.0.0.0\"",[146,7863,400],{"class":263},[146,7865,7866],{"class":701},"port",[146,7868,267],{"class":259},[146,7870,7871],{"class":156},"5000",[146,7873,400],{"class":263},[146,7875,7876],{"class":701},"debug",[146,7878,267],{"class":259},[146,7880,1139],{"class":156},[146,7882,406],{"class":263},[11,7884,7885],{},"의존성 설치 및 실행:",[137,7887,7889],{"className":139,"code":7888,"language":141,"meta":142,"style":142},"pip install flask requests\npython webhook_server.py\n",[28,7890,7891,7902],{"__ignoreMap":142},[146,7892,7893,7895,7897,7900],{"class":148,"line":149},[146,7894,191],{"class":152},[146,7896,194],{"class":160},[146,7898,7899],{"class":160}," flask",[146,7901,329],{"class":160},[146,7903,7904,7906],{"class":148,"line":167},[146,7905,340],{"class":152},[146,7907,7908],{"class":160}," webhook_server.py\n",[11,7910,7911],{},"이 서버의 주요 설계 결정:",[97,7913,7914,7924,7933],{},[73,7915,7916,7919,7920,7923],{},[23,7917,7918],{},"백그라운드 다운로드"," — 스레드를 생성하여 비디오를 다운로드하므로 webhook 핸들러가 즉시 ",[28,7921,7922],{},"200","을 반환합니다. API는 10초 내 응답을 기대하지만, 비디오 다운로드는 더 오래 걸릴 수 있습니다.",[73,7925,7926,1061,7929,7932],{},[23,7927,7928],{},"헬스 체크 엔드포인트",[28,7930,7931],{},"/health","는 로드 밸런서(ALB, nginx 등) 뒤에 배포할 때 유용합니다.",[73,7934,7935,7938],{},[23,7936,7937],{},"오류 로깅"," — 실패한 작업은 전체 오류 payload와 함께 출력됩니다. 프로덕션에서는 Sentry, Datadog 또는 로깅 스택으로 연결하세요.",[92,7940,7942],{"id":7941},"ngrok으로-로컬호스트-노출","ngrok으로 로컬호스트 노출",[11,7944,7945,7946,7951],{},"로컬 개발 시 ",[37,7947,7950],{"href":7948,"rel":7949},"https://ngrok.com",[41],"ngrok","을 사용하여 로컬 서버로 터널링하는 공개 HTTPS URL을 생성합니다:",[137,7953,7955],{"className":139,"code":7954,"language":141,"meta":142,"style":142},"# ngrok 설치 (macOS)\nbrew install ngrok\n\n# 또는 https://ngrok.com/download 에서 다운로드\n\n# 터널 시작\nngrok http 5000\n",[28,7956,7957,7962,7972,7976,7981,7985,7990],{"__ignoreMap":142},[146,7958,7959],{"class":148,"line":149},[146,7960,7961],{"class":175},"# ngrok 설치 (macOS)\n",[146,7963,7964,7967,7969],{"class":148,"line":167},[146,7965,7966],{"class":152},"brew",[146,7968,194],{"class":160},[146,7970,7971],{"class":160}," ngrok\n",[146,7973,7974],{"class":148,"line":179},[146,7975,376],{"emptyLinePlaceholder":58},[146,7977,7978],{"class":148,"line":188},[146,7979,7980],{"class":175},"# 또는 https://ngrok.com/download 에서 다운로드\n",[146,7982,7983],{"class":148,"line":373},[146,7984,376],{"emptyLinePlaceholder":58},[146,7986,7987],{"class":148,"line":379},[146,7988,7989],{"class":175},"# 터널 시작\n",[146,7991,7992,7994,7997],{"class":148,"line":385},[146,7993,7950],{"class":152},[146,7995,7996],{"class":160}," http",[146,7998,7999],{"class":156}," 5000\n",[11,8001,8002],{},"ngrok 출력 예시:",[137,8004,8007],{"className":8005,"code":8006,"language":2183},[2181],"Forwarding  https://a1b2c3d4.ngrok-free.app → http://localhost:5000\n",[28,8008,8006],{"__ignoreMap":142},[11,8010,8011,8012,8014],{},"이 HTTPS URL을 ",[28,8013,3603],{},"로 사용하세요:",[137,8016,8018],{"className":338,"code":8017,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Your prompt here\",\n    \"callback_url\": \"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n}\n",[28,8019,8020,8028,8038,8049,8058],{"__ignoreMap":142},[146,8021,8022,8024,8026],{"class":148,"line":149},[146,8023,3665],{"class":263},[146,8025,267],{"class":259},[146,8027,428],{"class":263},[146,8029,8030,8032,8034,8036],{"class":148,"line":167},[146,8031,3674],{"class":160},[146,8033,437],{"class":263},[146,8035,1308],{"class":160},[146,8037,452],{"class":263},[146,8039,8040,8042,8044,8047],{"class":148,"line":179},[146,8041,3685],{"class":160},[146,8043,437],{"class":263},[146,8045,8046],{"class":160},"\"Your prompt here\"",[146,8048,452],{"class":263},[146,8050,8051,8053,8055],{"class":148,"line":188},[146,8052,6514],{"class":160},[146,8054,437],{"class":263},[146,8056,8057],{"class":160},"\"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n",[146,8059,8060],{"class":148,"line":373},[146,8061,469],{"class":263},[18,8063,8064],{},[11,8065,8066,8068,8069,8072,8073,8076],{},[23,8067,305],{}," ngrok의 ",[28,8070,8071],{},"https://"," URL 대신 ",[28,8074,8075],{},"http://"," URL을 사용하는 것. Seedance API는 webhook에 HTTPS를 요구합니다 — 일반 HTTP 콜백 URL은 400 오류를 반환합니다.",[92,8078,8080],{"id":8079},"webhook-보안","Webhook 보안",[11,8082,8083],{},"프로덕션에서는 webhook 요청이 실제로 EvoLink API에서 온 것인지 검증하세요:",[137,8085,8087],{"className":338,"code":8086,"language":340,"meta":142,"style":142},"import hmac\nimport hashlib\n\ndef verify_webhook(request):\n    \"\"\"작업 ID 패턴으로 webhook 진위를 검증합니다.\"\"\"\n    task = request.json\n    task_id = task.get(\"id\", \"\")\n    \n    # EvoLink 작업 ID는 특정 형식을 따릅니다\n    if not task_id.startswith(\"task-unified-\"):\n        return False\n    \n    # 추가 검증: 필수 필드 존재 확인\n    required_fields = [\"id\", \"status\", \"model\", \"created\"]\n    if not all(field in task for field in required_fields):\n        return False\n    \n    return True\n",[28,8088,8089,8096,8103,8107,8117,8122,8130,8146,8150,8155,8169,8176,8180,8185,8212,8240,8246,8250],{"__ignoreMap":142},[146,8090,8091,8093],{"class":148,"line":149},[146,8092,347],{"class":259},[146,8094,8095],{"class":263}," hmac\n",[146,8097,8098,8100],{"class":148,"line":167},[146,8099,347],{"class":259},[146,8101,8102],{"class":263}," hashlib\n",[146,8104,8105],{"class":148,"line":179},[146,8106,376],{"emptyLinePlaceholder":58},[146,8108,8109,8111,8114],{"class":148,"line":188},[146,8110,526],{"class":259},[146,8112,8113],{"class":152}," verify_webhook",[146,8115,8116],{"class":263},"(request):\n",[146,8118,8119],{"class":148,"line":373},[146,8120,8121],{"class":160},"    \"\"\"작업 ID 패턴으로 webhook 진위를 검증합니다.\"\"\"\n",[146,8123,8124,8126,8128],{"class":148,"line":379},[146,8125,1496],{"class":263},[146,8127,267],{"class":259},[146,8129,7182],{"class":263},[146,8131,8132,8134,8136,8138,8140,8142,8144],{"class":148,"line":385},[146,8133,7221],{"class":263},[146,8135,267],{"class":259},[146,8137,775],{"class":263},[146,8139,1626],{"class":160},[146,8141,400],{"class":263},[146,8143,5269],{"class":160},[146,8145,406],{"class":263},[146,8147,8148],{"class":148,"line":409},[146,8149,563],{"class":263},[146,8151,8152],{"class":148,"line":420},[146,8153,8154],{"class":175},"    # EvoLink 작업 ID는 특정 형식을 따릅니다\n",[146,8156,8157,8159,8161,8164,8167],{"class":148,"line":431},[146,8158,2508],{"class":259},[146,8160,5895],{"class":259},[146,8162,8163],{"class":263}," task_id.startswith(",[146,8165,8166],{"class":160},"\"task-unified-\"",[146,8168,548],{"class":263},[146,8170,8171,8173],{"class":148,"line":455},[146,8172,7196],{"class":259},[146,8174,8175],{"class":156}," False\n",[146,8177,8178],{"class":148,"line":466},[146,8179,563],{"class":263},[146,8181,8182],{"class":148,"line":600},[146,8183,8184],{"class":175},"    # 추가 검증: 필수 필드 존재 확인\n",[146,8186,8187,8190,8192,8195,8197,8199,8201,8203,8205,8207,8210],{"class":148,"line":605},[146,8188,8189],{"class":263},"    required_fields ",[146,8191,267],{"class":259},[146,8193,8194],{"class":263}," [",[146,8196,1626],{"class":160},[146,8198,400],{"class":263},[146,8200,761],{"class":160},[146,8202,400],{"class":263},[146,8204,5901],{"class":160},[146,8206,400],{"class":263},[146,8208,8209],{"class":160},"\"created\"",[146,8211,764],{"class":263},[146,8213,8214,8216,8218,8221,8224,8226,8229,8232,8235,8237],{"class":148,"line":611},[146,8215,2508],{"class":259},[146,8217,5895],{"class":259},[146,8219,8220],{"class":156}," all",[146,8222,8223],{"class":263},"(field ",[146,8225,1180],{"class":259},[146,8227,8228],{"class":263}," task ",[146,8230,8231],{"class":259},"for",[146,8233,8234],{"class":263}," field ",[146,8236,1180],{"class":259},[146,8238,8239],{"class":263}," required_fields):\n",[146,8241,8242,8244],{"class":148,"line":617},[146,8243,7196],{"class":259},[146,8245,8175],{"class":156},[146,8247,8248],{"class":148,"line":623},[146,8249,563],{"class":263},[146,8251,8252,8254],{"class":148,"line":628},[146,8253,1703],{"class":259},[146,8255,6416],{"class":156},[92,8257,8259],{"id":8258},"webhook-vs-polling-언제-무엇을-선택할까","Webhook vs Polling: 언제 무엇을 선택할까?",[2035,8261,8262,8275],{},[2038,8263,8264],{},[2041,8265,8266,8269,8272],{},[2044,8267,8268],{},"시나리오",[2044,8270,8271],{},"권장 방식",[2044,8273,8274],{},"이유",[2051,8276,8277,8287,8298,8309,8319,8329],{},[2041,8278,8279,8282,8284],{},[2056,8280,8281],{},"빠른 프로토타이핑 / 스크립트",[2056,8283,2240],{},[2056,8285,8286],{},"더 간단, 서버 불필요",[2041,8288,8289,8292,8295],{},[2056,8290,8291],{},"프로덕션 웹 앱",[2056,8293,8294],{},"Webhook",[2056,8296,8297],{},"확장 가능, 요청 낭비 없음",[2041,8299,8300,8303,8306],{},[2056,8301,8302],{},"배치 처리 (100+ 비디오)",[2056,8304,8305],{},"Webhook + 메시지 큐",[2056,8307,8308],{},"모두 제출, 완료 순서대로 처리",[2041,8310,8311,8314,8316],{},[2056,8312,8313],{},"CLI 도구",[2056,8315,2240],{},[2056,8317,8318],{},"서버 인프라 불필요",[2041,8320,8321,8324,8326],{},[2056,8322,8323],{},"모바일 앱 백엔드",[2056,8325,8294],{},[2056,8327,8328],{},"완료 시 사용자에게 푸시 알림",[2041,8330,8331,8334,8336],{},[2056,8332,8333],{},"Serverless (Lambda/Cloud Functions)",[2056,8335,8294],{},[2056,8337,8338],{},"완벽한 매칭 — 완료마다 함수 트리거",[18,8340,8341],{},[11,8342,8343,8345],{},[23,8344,134],{}," 배치 처리에는 webhook과 메시지 큐(Redis, RabbitMQ, SQS)를 결합하세요. 모든 생성 요청을 제출한 후 큐에 도착하는 순서대로 처리합니다. 이 방식은 제출과 처리를 분리하고 재시도를 깔끔하게 처리합니다.",[45,8347],{},[48,8349,8351],{"id":8350},"배치-처리-여러-비디오-생성","배치 처리: 여러 비디오 생성",[11,8353,8354],{},"실제 사용 사례에서는 많은 비디오를 생성해야 하는 경우가 많습니다. 속도 제한을 고려한 배치 처리 패턴:",[11,8356,8357],{},[2621,8358,8359],{},"위 첫 번째 예제와 동일한 설정 및 헬퍼 함수를 사용합니다.",[137,8361,8363],{"className":338,"code":8362,"language":340,"meta":142,"style":142},"import concurrent.futures\n\ndef batch_generate(prompts, max_concurrent=3):\n    \"\"\"\n    제어된 동시성으로 여러 비디오를 생성합니다.\n    \n    Args:\n        prompts: 프롬프트 문자열 리스트.\n        max_concurrent: 최대 동시 생성 수.\n    \n    Returns:\n        (prompt, result_or_error) 튜플 리스트.\n    \"\"\"\n    results = []\n    \n    def generate_one(prompt, index):\n        \"\"\"단일 비디오를 생성하고 결과를 반환합니다.\"\"\"\n        payload = {\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": 5,\n            \"quality\": \"720p\"\n        }\n        try:\n            task = generate_video_with_retry(payload)\n            print(f\"[{index}] Submitted: {task['id']}\")\n            result = wait_for_video(task[\"id\"])\n            video_url = result[\"results\"][0]\n            download_video(video_url, f\"batch_{index}.mp4\")\n            return (prompt, result)\n        except Exception as e:\n            print(f\"[{index}] Failed: {e}\")\n            return (prompt, str(e))\n    \n    # 속도 제한을 준수하며 배치 처리\n    with concurrent.futures.ThreadPoolExecutor(max_workers=max_concurrent) as executor:\n        futures = {\n            executor.submit(generate_one, prompt, i): i\n            for i, prompt in enumerate(prompts)\n        }\n        for future in concurrent.futures.as_completed(futures):\n            results.append(future.result())\n    \n    # 요약\n    succeeded = sum(1 for _, r in results if isinstance(r, dict))\n    print(f\"\\nBatch complete: {succeeded}/{len(prompts)} succeeded\")\n    return results\n\n\n# 사용 예시\nprompts = [\n    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\",\n    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\",\n    \"A street musician playing violin in the rain. Cinematic lighting.\",\n]\nbatch_generate(prompts, max_concurrent=2)\n",[28,8364,8365,8372,8376,8392,8396,8401,8405,8409,8414,8419,8423,8427,8432,8436,8445,8449,8460,8465,8474,8485,8493,8504,8514,8519,8525,8535,8570,8583,8599,8619,8626,8636,8665,8678,8682,8687,8707,8716,8721,8735,8739,8751,8756,8760,8765,8803,8839,8846,8850,8854,8859,8869,8876,8883,8890,8894],{"__ignoreMap":142},[146,8366,8367,8369],{"class":148,"line":149},[146,8368,347],{"class":259},[146,8370,8371],{"class":263}," concurrent.futures\n",[146,8373,8374],{"class":148,"line":167},[146,8375,376],{"emptyLinePlaceholder":58},[146,8377,8378,8380,8383,8386,8388,8390],{"class":148,"line":179},[146,8379,526],{"class":259},[146,8381,8382],{"class":152}," batch_generate",[146,8384,8385],{"class":263},"(prompts, max_concurrent",[146,8387,267],{"class":259},[146,8389,5059],{"class":156},[146,8391,548],{"class":263},[146,8393,8394],{"class":148,"line":188},[146,8395,553],{"class":160},[146,8397,8398],{"class":148,"line":373},[146,8399,8400],{"class":160},"    제어된 동시성으로 여러 비디오를 생성합니다.\n",[146,8402,8403],{"class":148,"line":379},[146,8404,563],{"class":160},[146,8406,8407],{"class":148,"line":385},[146,8408,568],{"class":160},[146,8410,8411],{"class":148,"line":409},[146,8412,8413],{"class":160},"        prompts: 프롬프트 문자열 리스트.\n",[146,8415,8416],{"class":148,"line":420},[146,8417,8418],{"class":160},"        max_concurrent: 최대 동시 생성 수.\n",[146,8420,8421],{"class":148,"line":431},[146,8422,563],{"class":160},[146,8424,8425],{"class":148,"line":455},[146,8426,592],{"class":160},[146,8428,8429],{"class":148,"line":466},[146,8430,8431],{"class":160},"        (prompt, result_or_error) 튜플 리스트.\n",[146,8433,8434],{"class":148,"line":600},[146,8435,553],{"class":160},[146,8437,8438,8441,8443],{"class":148,"line":605},[146,8439,8440],{"class":263},"    results ",[146,8442,267],{"class":259},[146,8444,5879],{"class":263},[146,8446,8447],{"class":148,"line":611},[146,8448,563],{"class":263},[146,8450,8451,8454,8457],{"class":148,"line":617},[146,8452,8453],{"class":259},"    def",[146,8455,8456],{"class":152}," generate_one",[146,8458,8459],{"class":263},"(prompt, index):\n",[146,8461,8462],{"class":148,"line":623},[146,8463,8464],{"class":160},"        \"\"\"단일 비디오를 생성하고 결과를 반환합니다.\"\"\"\n",[146,8466,8467,8470,8472],{"class":148,"line":628},[146,8468,8469],{"class":263},"        payload ",[146,8471,267],{"class":259},[146,8473,428],{"class":263},[146,8475,8476,8479,8481,8483],{"class":148,"line":639},[146,8477,8478],{"class":160},"            \"model\"",[146,8480,437],{"class":263},[146,8482,1308],{"class":160},[146,8484,452],{"class":263},[146,8486,8487,8490],{"class":148,"line":654},[146,8488,8489],{"class":160},"            \"prompt\"",[146,8491,8492],{"class":263},": prompt,\n",[146,8494,8495,8498,8500,8502],{"class":148,"line":660},[146,8496,8497],{"class":160},"            \"duration\"",[146,8499,437],{"class":263},[146,8501,1352],{"class":156},[146,8503,452],{"class":263},[146,8505,8506,8509,8511],{"class":148,"line":671},[146,8507,8508],{"class":160},"            \"quality\"",[146,8510,437],{"class":263},[146,8512,8513],{"class":160},"\"720p\"\n",[146,8515,8516],{"class":148,"line":698},[146,8517,8518],{"class":263},"        }\n",[146,8520,8521,8523],{"class":148,"line":710},[146,8522,5138],{"class":259},[146,8524,860],{"class":263},[146,8526,8527,8530,8532],{"class":148,"line":716},[146,8528,8529],{"class":263},"            task ",[146,8531,267],{"class":259},[146,8533,8534],{"class":263}," generate_video_with_retry(payload)\n",[146,8536,8537,8539,8541,8543,8546,8548,8551,8553,8556,8558,8560,8562,8564,8566,8568],{"class":148,"line":722},[146,8538,5580],{"class":156},[146,8540,794],{"class":263},[146,8542,440],{"class":259},[146,8544,8545],{"class":160},"\"[",[146,8547,685],{"class":156},[146,8549,8550],{"class":263},"index",[146,8552,691],{"class":156},[146,8554,8555],{"class":160},"] Submitted: ",[146,8557,685],{"class":156},[146,8559,1529],{"class":263},[146,8561,1532],{"class":160},[146,8563,1535],{"class":263},[146,8565,691],{"class":156},[146,8567,449],{"class":160},[146,8569,406],{"class":263},[146,8571,8572,8575,8577,8579,8581],{"class":148,"line":728},[146,8573,8574],{"class":263},"            result ",[146,8576,267],{"class":259},[146,8578,1623],{"class":263},[146,8580,1626],{"class":160},[146,8582,1629],{"class":263},[146,8584,8585,8587,8589,8591,8593,8595,8597],{"class":148,"line":739},[146,8586,7407],{"class":263},[146,8588,267],{"class":259},[146,8590,1648],{"class":263},[146,8592,1651],{"class":160},[146,8594,1562],{"class":263},[146,8596,783],{"class":156},[146,8598,764],{"class":263},[146,8600,8601,8604,8606,8609,8611,8613,8615,8617],{"class":148,"line":744},[146,8602,8603],{"class":263},"            download_video(video_url, ",[146,8605,440],{"class":259},[146,8607,8608],{"class":160},"\"batch_",[146,8610,685],{"class":156},[146,8612,8550],{"class":263},[146,8614,691],{"class":156},[146,8616,6895],{"class":160},[146,8618,406],{"class":263},[146,8620,8621,8623],{"class":148,"line":750},[146,8622,866],{"class":259},[146,8624,8625],{"class":263}," (prompt, result)\n",[146,8627,8628,8630,8632,8634],{"class":148,"line":767},[146,8629,5537],{"class":259},[146,8631,7065],{"class":156},[146,8633,7068],{"class":259},[146,8635,5655],{"class":263},[146,8637,8638,8640,8642,8644,8646,8648,8650,8652,8655,8657,8659,8661,8663],{"class":148,"line":788},[146,8639,5580],{"class":156},[146,8641,794],{"class":263},[146,8643,440],{"class":259},[146,8645,8545],{"class":160},[146,8647,685],{"class":156},[146,8649,8550],{"class":263},[146,8651,691],{"class":156},[146,8653,8654],{"class":160},"] Failed: ",[146,8656,685],{"class":156},[146,8658,5705],{"class":263},[146,8660,691],{"class":156},[146,8662,449],{"class":160},[146,8664,406],{"class":263},[146,8666,8667,8669,8672,8675],{"class":148,"line":834},[146,8668,866],{"class":259},[146,8670,8671],{"class":263}," (prompt, ",[146,8673,8674],{"class":156},"str",[146,8676,8677],{"class":263},"(e))\n",[146,8679,8680],{"class":148,"line":839},[146,8681,563],{"class":263},[146,8683,8684],{"class":148,"line":845},[146,8685,8686],{"class":175},"    # 속도 제한을 준수하며 배치 처리\n",[146,8688,8689,8691,8694,8697,8699,8702,8704],{"class":148,"line":863},[146,8690,1151],{"class":259},[146,8692,8693],{"class":263}," concurrent.futures.ThreadPoolExecutor(",[146,8695,8696],{"class":701},"max_workers",[146,8698,267],{"class":259},[146,8700,8701],{"class":263},"max_concurrent) ",[146,8703,1166],{"class":259},[146,8705,8706],{"class":263}," executor:\n",[146,8708,8709,8712,8714],{"class":148,"line":872},[146,8710,8711],{"class":263},"        futures ",[146,8713,267],{"class":259},[146,8715,428],{"class":263},[146,8717,8718],{"class":148,"line":887},[146,8719,8720],{"class":263},"            executor.submit(generate_one, prompt, i): i\n",[146,8722,8723,8725,8728,8730,8732],{"class":148,"line":903},[146,8724,6981],{"class":259},[146,8726,8727],{"class":263}," i, prompt ",[146,8729,1180],{"class":259},[146,8731,6294],{"class":156},[146,8733,8734],{"class":263},"(prompts)\n",[146,8736,8737],{"class":148,"line":915},[146,8738,8518],{"class":263},[146,8740,8741,8743,8746,8748],{"class":148,"line":953},[146,8742,1174],{"class":259},[146,8744,8745],{"class":263}," future ",[146,8747,1180],{"class":259},[146,8749,8750],{"class":263}," concurrent.futures.as_completed(futures):\n",[146,8752,8753],{"class":148,"line":959},[146,8754,8755],{"class":263},"            results.append(future.result())\n",[146,8757,8758],{"class":148,"line":964},[146,8759,563],{"class":263},[146,8761,8762],{"class":148,"line":970},[146,8763,8764],{"class":175},"    # 요약\n",[146,8766,8767,8770,8772,8775,8777,8779,8781,8784,8786,8789,8791,8794,8797,8800],{"class":148,"line":976},[146,8768,8769],{"class":263},"    succeeded ",[146,8771,267],{"class":259},[146,8773,8774],{"class":156}," sum",[146,8776,794],{"class":263},[146,8778,5440],{"class":156},[146,8780,6397],{"class":259},[146,8782,8783],{"class":263}," _, r ",[146,8785,1180],{"class":259},[146,8787,8788],{"class":263}," results ",[146,8790,1719],{"class":259},[146,8792,8793],{"class":156}," isinstance",[146,8795,8796],{"class":263},"(r, ",[146,8798,8799],{"class":156},"dict",[146,8801,8802],{"class":263},"))\n",[146,8804,8805,8807,8809,8811,8813,8815,8818,8820,8823,8825,8827,8829,8832,8834,8837],{"class":148,"line":988},[146,8806,1102],{"class":156},[146,8808,794],{"class":263},[146,8810,440],{"class":259},[146,8812,449],{"class":160},[146,8814,1670],{"class":156},[146,8816,8817],{"class":160},"Batch complete: ",[146,8819,685],{"class":156},[146,8821,8822],{"class":263},"succeeded",[146,8824,691],{"class":156},[146,8826,1225],{"class":160},[146,8828,6273],{"class":156},[146,8830,8831],{"class":263},"(prompts)",[146,8833,691],{"class":156},[146,8835,8836],{"class":160}," succeeded\"",[146,8838,406],{"class":263},[146,8840,8841,8843],{"class":148,"line":993},[146,8842,1703],{"class":259},[146,8844,8845],{"class":263}," results\n",[146,8847,8848],{"class":148,"line":5534},[146,8849,376],{"emptyLinePlaceholder":58},[146,8851,8852],{"class":148,"line":5543},[146,8853,376],{"emptyLinePlaceholder":58},[146,8855,8856],{"class":148,"line":5549},[146,8857,8858],{"class":175},"# 사용 예시\n",[146,8860,8861,8864,8866],{"class":148,"line":5577},[146,8862,8863],{"class":263},"prompts ",[146,8865,267],{"class":259},[146,8867,8868],{"class":263}," [\n",[146,8870,8871,8874],{"class":148,"line":5608},[146,8872,8873],{"class":160},"    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\"",[146,8875,452],{"class":263},[146,8877,8878,8881],{"class":148,"line":5628},[146,8879,8880],{"class":160},"    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\"",[146,8882,452],{"class":263},[146,8884,8885,8888],{"class":148,"line":5634},[146,8886,8887],{"class":160},"    \"A street musician playing violin in the rain. Cinematic lighting.\"",[146,8889,452],{"class":263},[146,8891,8892],{"class":148,"line":5640},[146,8893,764],{"class":263},[146,8895,8896,8899,8902,8904,8906],{"class":148,"line":5645},[146,8897,8898],{"class":263},"batch_generate(prompts, ",[146,8900,8901],{"class":701},"max_concurrent",[146,8903,267],{"class":259},[146,8905,5421],{"class":156},[146,8907,406],{"class":263},[11,8909,8910],{},"배치 처리의 주요 고려사항:",[97,8912,8913,8921,8927],{},[73,8914,8915,8920],{},[23,8916,8917],{},[28,8918,8919],{},"max_concurrent=3"," — 너무 많은 요청을 동시에 제출하지 마세요. 2~3으로 시작하고 속도 제한에 따라 늘리세요.",[73,8922,8923,8926],{},[23,8924,8925],{},"ThreadPoolExecutor"," — I/O 바운드(API 응답 대기)이므로 프로세스가 아닌 스레드를 사용합니다.",[73,8928,8929,8932],{},[23,8930,8931],{},"오류 격리"," — 각 비디오 생성은 독립적입니다. 하나의 실패가 배치 전체를 중단시키지 않습니다.",[45,8934],{},[48,8936,8938],{"id":8937},"다음-단계","다음 단계",[11,8940,8941],{},"기본기를 모두 다뤘습니다 — 텍스트-투-비디오, 이미지-투-비디오, 비동기 polling, webhook, 오류 처리, 배치 처리. 더 깊이 들어갈 방향을 안내합니다:",[92,8943,8945],{"id":8944},"고급-기능-탐색","고급 기능 탐색",[97,8947,8948,8956,8963,8970,8978],{},[73,8949,8950,8955],{},[23,8951,8952],{},[37,8953,8954],{"href":2969},"@Tags 멀티모달 참조 가이드"," — @Image, @Video, @Audio 참조 시스템을 마스터하여 멀티모달 생성",[73,8957,8958,8962],{},[23,8959,8960],{},[37,8961,3861],{"href":3860}," — 히치콕 줌, 원테이크 트래킹 샷, 오비탈 카메라를 프로그래밍 방식으로 구현",[73,8964,8965,8969],{},[23,8966,8967],{},[37,8968,3385],{"href":3384}," — 첫/마지막 프레임 제어, 다중 이미지 합성, 이커머스 제품 비디오",[73,8971,8972,8977],{},[23,8973,8974],{},[37,8975,8976],{"href":2615},"이커머스 제품 비디오 가이드"," — 제품 사진을 대규모로 마케팅 비디오로 변환",[73,8979,8980,8984],{},[23,8981,8982],{},[37,8983,1767],{"href":1766}," — 샷 스크립트 형식, 타이밍 구문, 데모 비디오의 프롬프트",[92,8986,8988],{"id":8987},"참조-문서","참조 문서",[97,8990,8991,8997,9004],{},[73,8992,8993],{},[37,8994,8996],{"href":1257,"rel":8995},[41],"비디오 생성 API 레퍼런스",[73,8998,8999],{},[37,9000,9003],{"href":9001,"rel":9002},"https://seedance2api.app/docs/multimodal-reference",[41],"멀티모달 참조 스펙",[73,9005,9006],{},[37,9007,9010],{"href":9008,"rel":9009},"https://seedance2api.app/docs/sdks",[41],"Python & Node.js SDK",[92,9012,9014],{"id":9013},"직접-만들어-보세요","직접 만들어 보세요",[11,9016,9017],{},"배운 것을 조합해 보세요. 프로젝트 아이디어:",[97,9019,9020,9030,9036,9046],{},[73,9021,9022,9025,9026,9029],{},[23,9023,9024],{},"자동화된 제품 비디오 파이프라인"," — 제품 사진을 업로드하고 마케팅 비디오를 대량 생성 (",[37,9027,9028],{"href":2615},"이커머스 비디오 가이드"," 참조)",[73,9031,9032,9035],{},[23,9033,9034],{},"소셜 미디어 콘텐츠 엔진"," — 텍스트 브리프에서 세로형 숏폼 비디오를 생성하여 TikTok/Reels에 직접 게시",[73,9037,9038,9041,9042,9045],{},[23,9039,9040],{},"스토리보드-투-비디오 도구"," — 연속 이미지를 ",[37,9043,9044],{"href":3860},"카메라 움직임 제어","가 적용된 애니메이션 장면으로 변환",[73,9047,9048,9051],{},[23,9049,9050],{},"AI 비디오 편집 파이프라인"," — Seedance 2.0의 비디오 확장 기능을 활용하여 짧은 클립에서 더 긴 내러티브 생성",[11,9053,9054],{},[23,9055,9056,9057,9061],{},"시작할 준비가 되셨나요? ",[37,9058,9060],{"href":39,"rel":9059},[41],"무료 EvoLink API Key 발급받기"," — 오늘부터 비디오를 생성하세요.",[45,9063],{},[48,9065,9067],{"id":9066},"자주-묻는-질문","자주 묻는 질문",[92,9069,9071],{"id":9070},"seedance-20-비디오-생성은-얼마나-걸리나요","Seedance 2.0 비디오 생성은 얼마나 걸리나요?",[11,9073,9074,9075,9078,9079,9081],{},"일반적으로 길이와 품질 설정에 따라 30",[2429,9076,9077],{},"120초입니다. 5초 720p 비디오는 약 50초에 완료됩니다. 15초 1080p 비디오는 2","3분이 걸릴 수 있습니다. API는 각 작업에 ",[28,9080,2105],{}," 필드를 반환하므로 적절한 타임아웃을 설정할 수 있습니다. 피크 시간대에는 큐 대기 시간이 10~30초 추가될 수 있습니다.",[92,9083,9085],{"id":9084},"seedance-20-api는-어떤-이미지-형식을-지원하나요","Seedance 2.0 API는 어떤 이미지 형식을 지원하나요?",[11,9087,9088,9089,9091],{},"JPEG, PNG, WebP, BMP, TIFF, GIF. 각 이미지는 30 MB 이하여야 합니다. ",[28,9090,2898],{}," 파라미터로 요청당 최대 9장의 이미지를 전달할 수 있습니다. 이미지는 공개적으로 접근 가능한 URL이어야 합니다 — API가 직접 가져옵니다. 최상의 결과를 위해 짧은 변이 최소 720px인 이미지를 사용하세요. 매우 낮은 해상도의 이미지(256px 미만)는 흐릿한 애니메이션을 생성할 수 있습니다.",[92,9093,9095],{"id":9094},"_15초보다-긴-비디오를-생성할-수-있나요","15초보다 긴 비디오를 생성할 수 있나요?",[11,9097,9098,9099,9101],{},"단일 생성의 최대 길이는 15초입니다. 더 긴 콘텐츠를 만들려면 여러 클립을 생성한 후 FFmpeg이나 비디오 편집기로 연결하세요. Seedance 2.0은 비디오 확장을 지원합니다 — 생성된 비디오의 마지막 프레임을 다음 생성의 첫 프레임으로 사용하여 매끄러운 연속성을 만들 수 있습니다. 기본 접근법: 클립 1을 생성하고, 마지막 프레임을 추출하여 클립 2에 ",[28,9100,2997],{},"으로 전달합니다.",[92,9103,9105],{"id":9104},"evolink를-통한-seedance-20-api-비용은-얼마인가요","EvoLink를 통한 Seedance 2.0 API 비용은 얼마인가요?",[11,9107,9108,9109,9113,9114,9116],{},"가격은 비디오 길이와 품질 등급에 따라 결정됩니다. 5초 720p 비디오는 약 18 크레딧입니다. EvoLink는 직접 API 접근 대비 비용을 절감할 수 있는 ",[37,9110,9112],{"href":212,"rel":9111},[41],"스마트 라우팅","을 제공합니다. 현재 초당 요금은 대시보드에서 확인하세요. API 응답의 ",[28,9115,2115],{}," 필드가 생성 전 정확한 비용을 보여줍니다 — 이 금액 이상 청구되지 않습니다.",[92,9118,9120],{"id":9119},"seedance-15-pro와-seedance-20의-차이점은-무엇인가요","seedance-1.5-pro와 seedance-2.0의 차이점은 무엇인가요?",[11,9122,9123,9124,9126,9127,9129,9130,1260],{},"Seedance 2.0은 멀티모달 참조(이미지, 비디오, 오디오 혼합 입력), 네이티브 오디오 생성, 향상된 물리 일관성, 비디오 편집 기능을 추가합니다. API 인터페이스는 동일합니다 — 같은 엔드포인트, 같은 파라미터, 같은 응답 형식. 지금 ",[28,9125,30],{},"로 테스트하고 모델 이름만 변경하여 ",[28,9128,1751],{},"으로 전환할 수 있습니다. 1.5의 주요 제한: 단일 이미지 입력만 지원(@Image2~9 불가), 비디오/오디오 참조 불가, 네이티브 오디오 생성 불가. 자세한 비교는 ",[37,9131,9133],{"href":9132},"/blog/seedance-2-vs-sora-2-api-comparison","Seedance 2.0 vs Sora 2 비교",[92,9135,9137],{"id":9136},"content-rejected-by-safety-filter-오류는-어떻게-처리하나요","\"content rejected by safety filter\" 오류는 어떻게 처리하나요?",[11,9139,9140,9141,9143,9144,9147],{},"콘텐츠 안전 필터는 사실적인 폭력, 노골적인 콘텐츠, 실제 공인을 포함하는 프롬프트를 거부합니다. ",[28,9142,2898],{},"를 통해 업로드된 사실적인 인물 얼굴 이미지도 거부됩니다. 얼굴 제한을 우회하려면 일러스트, 스타일화된 또는 애니메이션 스타일의 캐릭터 이미지를 사용하세요. 프롬프트 거부의 경우 제한된 주제를 피하도록 문구를 수정하세요. 오류 응답에 ",[28,9145,9146],{},"type: \"content_policy_violation\"","이 포함됩니다 — 오류 처리 코드에서 이를 확인하여 사용자에게 명확한 메시지를 제공하세요.",[92,9149,9151],{"id":9150},"nodejs-javascript-프로젝트에서-seedance-api를-사용할-수-있나요","Node.js / JavaScript 프로젝트에서 Seedance API를 사용할 수 있나요?",[11,9153,9154,9155,9158,9159,9162,9163,9167],{},"네. REST API는 언어에 구애받지 않습니다 — 어떤 HTTP 클라이언트든 사용할 수 있습니다. 이 튜토리얼의 개념(비동기 polling, webhook, 오류 처리)은 Node.js의 ",[28,9156,9157],{},"fetch","나 ",[28,9160,9161],{},"axios","로 직접 적용할 수 있습니다. EvoLink는 polling과 재시도를 자동으로 처리하는 공식 ",[37,9164,9166],{"href":9008,"rel":9165},[41],"Node.js 및 Python SDK","도 제공합니다.",[92,9169,9171],{"id":9170},"비디오-완료-시-webhook-서버가-다운되어-있으면-어떻게-되나요","비디오 완료 시 webhook 서버가 다운되어 있으면 어떻게 되나요?",[11,9173,9174,9175,9178],{},"API는 증가하는 간격(1초, 2초, 4초)으로 webhook 전달을 3회 재시도합니다. 3회 모두 실패하면 webhook은 포기됩니다 — 하지만 비디오는 여전히 사용 가능합니다. ",[28,9176,9177],{},"GET /v1/tasks/{task_id}","로 polling하여 결과를 조회할 수 있습니다. 따라서 제출 시 작업 ID를 저장하고, 완료되었지만 webhook으로 수신되지 않은 작업을 주기적으로 확인하는 백그라운드 작업을 설정하는 것이 좋습니다.",[92,9180,9182],{"id":9181},"api-요청에-속도-제한이-있나요","API 요청에 속도 제한이 있나요?",[11,9184,9185,9186,9188,9189,9193,9194,9198],{},"네. 기본 속도 제한은 개발과 중간 규모 프로덕션 사용에 충분히 여유롭습니다. ",[28,9187,4941],{}," 오류가 발생하면 ",[37,9190,9192],{"href":9191},"#%EC%98%A4%EB%A5%98-%EC%B2%98%EB%A6%AC-%EC%A0%84%EB%9E%B5","오류 처리 섹션","에서 보여준 대로 지수 백오프를 구현하세요. 대규모 사용(하루 수천 건의 비디오 생성)의 경우 ",[37,9195,9197],{"href":212,"rel":9196},[41],"EvoLink 지원팀","에 연락하여 맞춤 속도 제한과 전용 용량을 논의하세요.",[92,9200,9202],{"id":9201},"seedance-20을-상업-프로젝트에-사용할-수-있나요","Seedance 2.0을 상업 프로젝트에 사용할 수 있나요?",[11,9204,9205,9206,1260],{},"네. EvoLink API를 통해 생성된 비디오는 상업적 사용이 허가됩니다. 출력물의 소유권은 사용자에게 있으며, 제품, 마케팅 자료, 클라이언트 납품물, 게시 콘텐츠에 사용할 수 있습니다. 자세한 라이선스 조건과 상업적 사용 모범 사례는 ",[37,9207,9209],{"href":9208},"/blog/seedance-2-copyright-api-guide","Seedance 2.0 저작권 가이드",[45,9211],{},[48,9213,9215],{"id":9214},"전체-스크립트","전체 스크립트",[11,9217,9218],{},"이 튜토리얼의 전체 코드를 하나의 파일로 정리했습니다 — 복사, 붙여넣기, API Key 입력 후 바로 실행하세요:",[137,9220,9222],{"className":338,"code":9221,"language":340,"meta":142,"style":142},"\"\"\"\nSeedance 2.0 API 튜토리얼 — 전체 스크립트\n문서: https://seedance2api.app/docs/video-generation\nAPI Key: https://evolink.ai/early-access\n\"\"\"\nimport requests\nimport time\nimport os\nimport json\nimport random\n\n# ── 설정 ─────────────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\n# ── 재사용 가능한 헬퍼 ────────────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"비디오 생성 작업을 완료까지 polling합니다.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        response.raise_for_status()\n        task = response.json()\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task}\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"URL에서 비디오 파일을 다운로드합니다.\"\"\"\n    print(f\"Downloading to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"일시적 오류에 대해 자동 재시도하는 생성 요청 제출.\"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30\n            )\n            if response.status_code == 200:\n                return response.json()\n            error = response.json().get(\"error\", {})\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: \"\n                    f\"{error.get('message', 'Unknown')}\"\n                )\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n                time.sleep(wait)\n                continue\n        except requests.exceptions.RequestException:\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n\n\ndef validate_payload(payload):\n    \"\"\"API 호출 전 생성 payload를 검증합니다.\"\"\"\n    errors = []\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required\")\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in {\"480p\", \"720p\", \"1080p\"}:\n        errors.append(f\"Invalid quality: {quality}\")\n    if errors:\n        raise ValueError(\"Validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n\n\ndef cancel_task(task_id):\n    \"\"\"pending 또는 processing 상태의 작업을 취소합니다.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n\n\n# ── 예제 1: 텍스트-투-비디오 ──────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']} (ETA: {task['task_info']['estimated_time']}s)\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"text_to_video.mp4\")\n\n\n# ── 예제 2: 이미지-투-비디오 ──────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame.\"\n        ),\n        \"image_urls\": [\"https://example.com/your-image.jpg\"],\n        \"duration\": 5,\n        \"quality\": \"720p\"\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"image_to_video.mp4\")\n\n\n# ── 예제 3: 세로형 소셜 미디어 비디오 ─────────────────────────\ndef social_media_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A barista pours latte art in slow motion. \"\n            \"Close-up overhead shot, warm cafe lighting.\"\n        ),\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"9:16\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"social_video.mp4\")\n\n\nif __name__ == \"__main__\":\n    print(\"=== 텍스트-투-비디오 ===\")\n    text_to_video()\n    # print(\"\\n=== 이미지-투-비디오 ===\")\n    # image_to_video()  # 주석 해제 후 이미지 URL 설정\n    # print(\"\\n=== 소셜 미디어 비디오 ===\")\n    # social_media_video()\n",[28,9223,9224,9228,9233,9238,9243,9247,9253,9259,9265,9271,9277,9281,9285,9301,9309,9317,9333,9341,9345,9349,9353,9358,9378,9383,9391,9401,9409,9429,9437,9441,9445,9453,9465,9481,9517,9529,9535,9547,9578,9582,9590,9620,9624,9628,9642,9646,9667,9683,9687,9703,9721,9725,9759,9763,9767,9781,9786,9798,9804,9812,9824,9834,9842,9851,9855,9867,9873,9885,9919,9927,9942,9966,9970,9996,10022,10065,10069,10073,10080,10106,10146,10150,10154,10176,10180,10184,10192,10197,10205,10217,10225,10247,10256,10272,10292,10310,10326,10351,10370,10377,10423,10428,10433,10442,10448,10457,10478,10487,10492,10505,10527,10534,10555,10560,10565,10571,10580,10589,10600,10607,10612,10617,10622,10627,10638,10649,10660,10669,10674,10680,10689,10733,10746,10766,10771,10776,10782,10791,10800,10811,10818,10823,10828,10834,10839,10853,10864,10873,10878,10883,10892,10917,10930,10948,10953,10958,10964,10974,10983,10994,11001,11007,11013,11018,11029,11040,11051,11060,11065,11070,11079,11104,11117,11135,11140,11145,11158,11170,11175,11181,11187,11193],{"__ignoreMap":142},[146,9225,9226],{"class":148,"line":149},[146,9227,6707],{"class":160},[146,9229,9230],{"class":148,"line":167},[146,9231,9232],{"class":160},"Seedance 2.0 API 튜토리얼 — 전체 스크립트\n",[146,9234,9235],{"class":148,"line":179},[146,9236,9237],{"class":160},"문서: https://seedance2api.app/docs/video-generation\n",[146,9239,9240],{"class":148,"line":188},[146,9241,9242],{"class":160},"API Key: https://evolink.ai/early-access\n",[146,9244,9245],{"class":148,"line":373},[146,9246,6707],{"class":160},[146,9248,9249,9251],{"class":148,"line":379},[146,9250,347],{"class":259},[146,9252,329],{"class":263},[146,9254,9255,9257],{"class":148,"line":385},[146,9256,347],{"class":259},[146,9258,356],{"class":263},[146,9260,9261,9263],{"class":148,"line":409},[146,9262,347],{"class":259},[146,9264,363],{"class":263},[146,9266,9267,9269],{"class":148,"line":420},[146,9268,347],{"class":259},[146,9270,370],{"class":263},[146,9272,9273,9275],{"class":148,"line":431},[146,9274,347],{"class":259},[146,9276,5040],{"class":263},[146,9278,9279],{"class":148,"line":455},[146,9280,376],{"emptyLinePlaceholder":58},[146,9282,9283],{"class":148,"line":466},[146,9284,382],{"class":175},[146,9286,9287,9289,9291,9293,9295,9297,9299],{"class":148,"line":600},[146,9288,388],{"class":156},[146,9290,391],{"class":259},[146,9292,394],{"class":263},[146,9294,397],{"class":160},[146,9296,400],{"class":263},[146,9298,403],{"class":160},[146,9300,406],{"class":263},[146,9302,9303,9305,9307],{"class":148,"line":605},[146,9304,412],{"class":156},[146,9306,391],{"class":259},[146,9308,417],{"class":160},[146,9310,9311,9313,9315],{"class":148,"line":611},[146,9312,423],{"class":156},[146,9314,391],{"class":259},[146,9316,428],{"class":263},[146,9318,9319,9321,9323,9325,9327,9329,9331],{"class":148,"line":617},[146,9320,434],{"class":160},[146,9322,437],{"class":263},[146,9324,440],{"class":259},[146,9326,443],{"class":160},[146,9328,446],{"class":156},[146,9330,449],{"class":160},[146,9332,452],{"class":263},[146,9334,9335,9337,9339],{"class":148,"line":623},[146,9336,458],{"class":160},[146,9338,437],{"class":263},[146,9340,463],{"class":160},[146,9342,9343],{"class":148,"line":628},[146,9344,469],{"class":263},[146,9346,9347],{"class":148,"line":639},[146,9348,376],{"emptyLinePlaceholder":58},[146,9350,9351],{"class":148,"line":654},[146,9352,376],{"emptyLinePlaceholder":58},[146,9354,9355],{"class":148,"line":660},[146,9356,9357],{"class":175},"# ── 재사용 가능한 헬퍼 ────────────────────────────────────────\n",[146,9359,9360,9362,9364,9366,9368,9370,9372,9374,9376],{"class":148,"line":671},[146,9361,526],{"class":259},[146,9363,529],{"class":152},[146,9365,532],{"class":263},[146,9367,267],{"class":259},[146,9369,537],{"class":156},[146,9371,540],{"class":263},[146,9373,267],{"class":259},[146,9375,545],{"class":156},[146,9377,548],{"class":263},[146,9379,9380],{"class":148,"line":698},[146,9381,9382],{"class":160},"    \"\"\"비디오 생성 작업을 완료까지 polling합니다.\"\"\"\n",[146,9384,9385,9387,9389],{"class":148,"line":710},[146,9386,631],{"class":263},[146,9388,267],{"class":259},[146,9390,636],{"class":156},[146,9392,9393,9395,9397,9399],{"class":148,"line":716},[146,9394,642],{"class":259},[146,9396,645],{"class":263},[146,9398,648],{"class":259},[146,9400,651],{"class":263},[146,9402,9403,9405,9407],{"class":148,"line":722},[146,9404,663],{"class":263},[146,9406,267],{"class":259},[146,9408,668],{"class":263},[146,9410,9411,9413,9415,9417,9419,9421,9423,9425,9427],{"class":148,"line":728},[146,9412,674],{"class":259},[146,9414,449],{"class":160},[146,9416,679],{"class":156},[146,9418,682],{"class":160},[146,9420,685],{"class":156},[146,9422,688],{"class":263},[146,9424,691],{"class":156},[146,9426,449],{"class":160},[146,9428,452],{"class":263},[146,9430,9431,9433,9435],{"class":148,"line":739},[146,9432,702],{"class":701},[146,9434,267],{"class":259},[146,9436,707],{"class":156},[146,9438,9439],{"class":148,"line":744},[146,9440,713],{"class":263},[146,9442,9443],{"class":148,"line":750},[146,9444,725],{"class":263},[146,9446,9447,9449,9451],{"class":148,"line":767},[146,9448,731],{"class":263},[146,9450,267],{"class":259},[146,9452,736],{"class":263},[146,9454,9455,9457,9459,9461,9463],{"class":148,"line":788},[146,9456,753],{"class":263},[146,9458,267],{"class":259},[146,9460,758],{"class":263},[146,9462,761],{"class":160},[146,9464,764],{"class":263},[146,9466,9467,9469,9471,9473,9475,9477,9479],{"class":148,"line":834},[146,9468,770],{"class":263},[146,9470,267],{"class":259},[146,9472,775],{"class":263},[146,9474,778],{"class":160},[146,9476,400],{"class":263},[146,9478,783],{"class":156},[146,9480,406],{"class":263},[146,9482,9483,9485,9487,9489,9491,9493,9495,9497,9499,9501,9503,9505,9507,9509,9511,9513,9515],{"class":148,"line":839},[146,9484,791],{"class":156},[146,9486,794],{"class":263},[146,9488,440],{"class":259},[146,9490,799],{"class":160},[146,9492,685],{"class":156},[146,9494,804],{"class":263},[146,9496,691],{"class":156},[146,9498,809],{"class":160},[146,9500,685],{"class":156},[146,9502,814],{"class":263},[146,9504,691],{"class":156},[146,9506,819],{"class":160},[146,9508,685],{"class":156},[146,9510,824],{"class":263},[146,9512,691],{"class":156},[146,9514,829],{"class":160},[146,9516,406],{"class":263},[146,9518,9519,9521,9523,9525,9527],{"class":148,"line":845},[146,9520,848],{"class":259},[146,9522,851],{"class":263},[146,9524,854],{"class":259},[146,9526,857],{"class":160},[146,9528,860],{"class":263},[146,9530,9531,9533],{"class":148,"line":863},[146,9532,866],{"class":259},[146,9534,869],{"class":263},[146,9536,9537,9539,9541,9543,9545],{"class":148,"line":872},[146,9538,875],{"class":259},[146,9540,851],{"class":263},[146,9542,854],{"class":259},[146,9544,882],{"class":160},[146,9546,860],{"class":263},[146,9548,9549,9551,9553,9555,9557,9559,9561,9563,9565,9567,9569,9572,9574,9576],{"class":148,"line":887},[146,9550,906],{"class":259},[146,9552,909],{"class":156},[146,9554,794],{"class":263},[146,9556,440],{"class":259},[146,9558,921],{"class":160},[146,9560,685],{"class":156},[146,9562,688],{"class":263},[146,9564,691],{"class":156},[146,9566,930],{"class":160},[146,9568,685],{"class":156},[146,9570,9571],{"class":263},"task",[146,9573,691],{"class":156},[146,9575,449],{"class":160},[146,9577,406],{"class":263},[146,9579,9580],{"class":148,"line":903},[146,9581,973],{"class":263},[146,9583,9584,9586,9588],{"class":148,"line":915},[146,9585,979],{"class":263},[146,9587,982],{"class":259},[146,9589,985],{"class":263},[146,9591,9592,9594,9596,9598,9600,9602,9604,9606,9608,9610,9612,9614,9616,9618],{"class":148,"line":953},[146,9593,996],{"class":259},[146,9595,999],{"class":156},[146,9597,794],{"class":263},[146,9599,440],{"class":259},[146,9601,921],{"class":160},[146,9603,685],{"class":156},[146,9605,688],{"class":263},[146,9607,691],{"class":156},[146,9609,1014],{"class":160},[146,9611,685],{"class":156},[146,9613,1019],{"class":263},[146,9615,691],{"class":156},[146,9617,1024],{"class":160},[146,9619,406],{"class":263},[146,9621,9622],{"class":148,"line":959},[146,9623,376],{"emptyLinePlaceholder":58},[146,9625,9626],{"class":148,"line":964},[146,9627,376],{"emptyLinePlaceholder":58},[146,9629,9630,9632,9634,9636,9638,9640],{"class":148,"line":970},[146,9631,526],{"class":259},[146,9633,1082],{"class":152},[146,9635,1085],{"class":263},[146,9637,267],{"class":259},[146,9639,1090],{"class":160},[146,9641,548],{"class":263},[146,9643,9644],{"class":148,"line":976},[146,9645,1097],{"class":160},[146,9647,9648,9650,9652,9654,9657,9659,9661,9663,9665],{"class":148,"line":988},[146,9649,1102],{"class":156},[146,9651,794],{"class":263},[146,9653,440],{"class":259},[146,9655,9656],{"class":160},"\"Downloading to ",[146,9658,685],{"class":156},[146,9660,1114],{"class":263},[146,9662,691],{"class":156},[146,9664,1119],{"class":160},[146,9666,406],{"class":263},[146,9668,9669,9671,9673,9675,9677,9679,9681],{"class":148,"line":993},[146,9670,1126],{"class":263},[146,9672,267],{"class":259},[146,9674,1131],{"class":263},[146,9676,1134],{"class":701},[146,9678,267],{"class":259},[146,9680,1139],{"class":156},[146,9682,406],{"class":263},[146,9684,9685],{"class":148,"line":5534},[146,9686,1146],{"class":263},[146,9688,9689,9691,9693,9695,9697,9699,9701],{"class":148,"line":5543},[146,9690,1151],{"class":259},[146,9692,1154],{"class":156},[146,9694,1157],{"class":263},[146,9696,1160],{"class":160},[146,9698,1163],{"class":263},[146,9700,1166],{"class":259},[146,9702,1169],{"class":263},[146,9704,9705,9707,9709,9711,9713,9715,9717,9719],{"class":148,"line":5549},[146,9706,1174],{"class":259},[146,9708,1177],{"class":263},[146,9710,1180],{"class":259},[146,9712,1183],{"class":263},[146,9714,1186],{"class":701},[146,9716,267],{"class":259},[146,9718,1191],{"class":156},[146,9720,548],{"class":263},[146,9722,9723],{"class":148,"line":5577},[146,9724,1198],{"class":263},[146,9726,9727,9729,9731,9733,9735,9737,9739,9741,9743,9745,9747,9749,9751,9753,9755,9757],{"class":148,"line":5608},[146,9728,1102],{"class":156},[146,9730,794],{"class":263},[146,9732,440],{"class":259},[146,9734,1209],{"class":160},[146,9736,685],{"class":156},[146,9738,1114],{"class":263},[146,9740,691],{"class":156},[146,9742,104],{"class":160},[146,9744,685],{"class":156},[146,9746,1222],{"class":263},[146,9748,1225],{"class":259},[146,9750,1228],{"class":156},[146,9752,1231],{"class":259},[146,9754,691],{"class":156},[146,9756,1236],{"class":160},[146,9758,406],{"class":263},[146,9760,9761],{"class":148,"line":5628},[146,9762,376],{"emptyLinePlaceholder":58},[146,9764,9765],{"class":148,"line":5634},[146,9766,376],{"emptyLinePlaceholder":58},[146,9768,9769,9771,9773,9775,9777,9779],{"class":148,"line":5640},[146,9770,526],{"class":259},[146,9772,5051],{"class":152},[146,9774,5054],{"class":263},[146,9776,267],{"class":259},[146,9778,5059],{"class":156},[146,9780,548],{"class":263},[146,9782,9783],{"class":148,"line":5645},[146,9784,9785],{"class":160},"    \"\"\"일시적 오류에 대해 자동 재시도하는 생성 요청 제출.\"\"\"\n",[146,9787,9788,9790,9792,9794,9796],{"class":148,"line":5658},[146,9789,5122],{"class":259},[146,9791,5125],{"class":263},[146,9793,1180],{"class":259},[146,9795,5130],{"class":156},[146,9797,5133],{"class":263},[146,9799,9800,9802],{"class":148,"line":5664},[146,9801,5138],{"class":259},[146,9803,860],{"class":263},[146,9805,9806,9808,9810],{"class":148,"line":5691},[146,9807,5145],{"class":263},[146,9809,267],{"class":259},[146,9811,1432],{"class":263},[146,9813,9814,9816,9818,9820,9822],{"class":148,"line":5731},[146,9815,918],{"class":259},[146,9817,449],{"class":160},[146,9819,679],{"class":156},[146,9821,1444],{"class":160},[146,9823,452],{"class":263},[146,9825,9826,9828,9830,9832],{"class":148,"line":5750},[146,9827,5166],{"class":701},[146,9829,267],{"class":259},[146,9831,423],{"class":156},[146,9833,452],{"class":263},[146,9835,9836,9838,9840],{"class":148,"line":5755},[146,9837,5177],{"class":701},[146,9839,267],{"class":259},[146,9841,5182],{"class":263},[146,9843,9844,9846,9848],{"class":148,"line":5760},[146,9845,5187],{"class":701},[146,9847,267],{"class":259},[146,9849,9850],{"class":156},"30\n",[146,9852,9853],{"class":148,"line":5765},[146,9854,956],{"class":263},[146,9856,9857,9859,9861,9863,9865],{"class":148,"line":7445},[146,9858,5213],{"class":259},[146,9860,2511],{"class":263},[146,9862,854],{"class":259},[146,9864,2516],{"class":156},[146,9866,860],{"class":263},[146,9868,9869,9871],{"class":148,"line":7451},[146,9870,5226],{"class":259},[146,9872,736],{"class":263},[146,9874,9875,9877,9879,9881,9883],{"class":148,"line":7462},[146,9876,5242],{"class":263},[146,9878,267],{"class":259},[146,9880,5247],{"class":263},[146,9882,897],{"class":160},[146,9884,900],{"class":263},[146,9886,9887,9889,9891,9893,9895,9897,9899,9901,9903,9905,9907,9909,9911,9913,9915,9917],{"class":148,"line":7473},[146,9888,5213],{"class":259},[146,9890,2511],{"class":263},[146,9892,1180],{"class":259},[146,9894,104],{"class":263},[146,9896,3641],{"class":156},[146,9898,400],{"class":263},[146,9900,4851],{"class":156},[146,9902,400],{"class":263},[146,9904,4869],{"class":156},[146,9906,400],{"class":263},[146,9908,4887],{"class":156},[146,9910,400],{"class":263},[146,9912,4905],{"class":156},[146,9914,400],{"class":263},[146,9916,4923],{"class":156},[146,9918,548],{"class":263},[146,9920,9921,9923,9925],{"class":148,"line":7484},[146,9922,5338],{"class":259},[146,9924,5341],{"class":156},[146,9926,912],{"class":263},[146,9928,9929,9931,9933,9935,9937,9939],{"class":148,"line":7489},[146,9930,5348],{"class":259},[146,9932,5351],{"class":160},[146,9934,685],{"class":156},[146,9936,5356],{"class":263},[146,9938,691],{"class":156},[146,9940,9941],{"class":160},": \"\n",[146,9943,9944,9946,9948,9950,9953,9955,9957,9960,9962,9964],{"class":148,"line":7495},[146,9945,5348],{"class":259},[146,9947,449],{"class":160},[146,9949,685],{"class":156},[146,9951,9952],{"class":263},"error.get(",[146,9954,938],{"class":160},[146,9956,400],{"class":263},[146,9958,9959],{"class":160},"'Unknown'",[146,9961,118],{"class":263},[146,9963,691],{"class":156},[146,9965,950],{"class":160},[146,9967,9968],{"class":148,"line":7503},[146,9969,5374],{"class":263},[146,9971,9972,9974,9976,9978,9980,9982,9984,9986,9988,9990,9992,9994],{"class":148,"line":7517},[146,9973,5213],{"class":259},[146,9975,2511],{"class":263},[146,9977,1180],{"class":259},[146,9979,104],{"class":263},[146,9981,4941],{"class":156},[146,9983,400],{"class":263},[146,9985,4962],{"class":156},[146,9987,400],{"class":263},[146,9989,4982],{"class":156},[146,9991,400],{"class":263},[146,9993,5002],{"class":156},[146,9995,548],{"class":263},[146,9997,9998,10000,10002,10004,10006,10008,10010,10012,10014,10016,10018,10020],{"class":148,"line":7522},[146,9999,5414],{"class":263},[146,10001,267],{"class":259},[146,10003,104],{"class":263},[146,10005,5421],{"class":156},[146,10007,5424],{"class":259},[146,10009,5427],{"class":263},[146,10011,5430],{"class":259},[146,10013,5433],{"class":263},[146,10015,783],{"class":156},[146,10017,400],{"class":263},[146,10019,5440],{"class":156},[146,10021,406],{"class":263},[146,10023,10024,10026,10028,10030,10032,10034,10037,10039,10042,10044,10046,10048,10050,10053,10055,10057,10059,10061,10063],{"class":148,"line":7536},[146,10025,5447],{"class":156},[146,10027,794],{"class":263},[146,10029,440],{"class":259},[146,10031,5454],{"class":160},[146,10033,685],{"class":156},[146,10035,10036],{"class":263},"attempt",[146,10038,5430],{"class":259},[146,10040,10041],{"class":156},"1}",[146,10043,1225],{"class":160},[146,10045,685],{"class":156},[146,10047,5471],{"class":263},[146,10049,691],{"class":156},[146,10051,10052],{"class":160}," after ",[146,10054,685],{"class":156},[146,10056,5489],{"class":263},[146,10058,5492],{"class":259},[146,10060,691],{"class":156},[146,10062,1024],{"class":160},[146,10064,406],{"class":263},[146,10066,10067],{"class":148,"line":7550},[146,10068,5522],{"class":263},[146,10070,10071],{"class":148,"line":7582},[146,10072,5527],{"class":259},[146,10074,10075,10077],{"class":148,"line":7594},[146,10076,5537],{"class":259},[146,10078,10079],{"class":263}," requests.exceptions.RequestException:\n",[146,10081,10082,10084,10086,10088,10090,10092,10094,10096,10098,10100,10102,10104],{"class":148,"line":7604},[146,10083,5552],{"class":263},[146,10085,267],{"class":259},[146,10087,104],{"class":263},[146,10089,5421],{"class":156},[146,10091,5424],{"class":259},[146,10093,5427],{"class":263},[146,10095,5430],{"class":259},[146,10097,5433],{"class":263},[146,10099,783],{"class":156},[146,10101,400],{"class":263},[146,10103,5440],{"class":156},[146,10105,406],{"class":263},[146,10107,10108,10110,10112,10114,10116,10118,10120,10122,10124,10126,10128,10130,10132,10134,10136,10138,10140,10142,10144],{"class":148,"line":7609},[146,10109,5580],{"class":156},[146,10111,794],{"class":263},[146,10113,440],{"class":259},[146,10115,5454],{"class":160},[146,10117,685],{"class":156},[146,10119,10036],{"class":263},[146,10121,5430],{"class":259},[146,10123,10041],{"class":156},[146,10125,1225],{"class":160},[146,10127,685],{"class":156},[146,10129,5471],{"class":263},[146,10131,691],{"class":156},[146,10133,10052],{"class":160},[146,10135,685],{"class":156},[146,10137,5489],{"class":263},[146,10139,5492],{"class":259},[146,10141,691],{"class":156},[146,10143,1024],{"class":160},[146,10145,406],{"class":263},[146,10147,10148],{"class":148,"line":7616},[146,10149,5631],{"class":263},[146,10151,10152],{"class":148,"line":7638},[146,10153,5637],{"class":259},[146,10155,10156,10158,10160,10162,10164,10166,10168,10170,10172,10174],{"class":148,"line":7669},[146,10157,996],{"class":259},[146,10159,909],{"class":156},[146,10161,794],{"class":263},[146,10163,440],{"class":259},[146,10165,5776],{"class":160},[146,10167,685],{"class":156},[146,10169,5471],{"class":263},[146,10171,691],{"class":156},[146,10173,5785],{"class":160},[146,10175,406],{"class":263},[146,10177,10178],{"class":148,"line":7674},[146,10179,376],{"emptyLinePlaceholder":58},[146,10181,10182],{"class":148,"line":7680},[146,10183,376],{"emptyLinePlaceholder":58},[146,10185,10186,10188,10190],{"class":148,"line":7705},[146,10187,526],{"class":259},[146,10189,5848],{"class":152},[146,10191,5851],{"class":263},[146,10193,10194],{"class":148,"line":7710},[146,10195,10196],{"class":160},"    \"\"\"API 호출 전 생성 payload를 검증합니다.\"\"\"\n",[146,10198,10199,10201,10203],{"class":148,"line":7715},[146,10200,5874],{"class":263},[146,10202,267],{"class":259},[146,10204,5879],{"class":263},[146,10206,10207,10209,10211,10213,10215],{"class":148,"line":7738},[146,10208,2508],{"class":259},[146,10210,5895],{"class":259},[146,10212,5898],{"class":263},[146,10214,5901],{"class":160},[146,10216,548],{"class":263},[146,10218,10219,10221,10223],{"class":148,"line":7748},[146,10220,5908],{"class":263},[146,10222,5911],{"class":160},[146,10224,406],{"class":263},[146,10226,10227,10229,10231,10233,10235,10237,10239,10241,10243,10245],{"class":148,"line":7754},[146,10228,2508],{"class":259},[146,10230,5895],{"class":259},[146,10232,5898],{"class":263},[146,10234,5924],{"class":160},[146,10236,1163],{"class":263},[146,10238,5929],{"class":259},[146,10240,5895],{"class":259},[146,10242,5934],{"class":263},[146,10244,5924],{"class":160},[146,10246,5939],{"class":263},[146,10248,10249,10251,10254],{"class":148,"line":7772},[146,10250,5908],{"class":263},[146,10252,10253],{"class":160},"\"'prompt' is required\"",[146,10255,406],{"class":263},[146,10257,10258,10260,10262,10264,10266,10268,10270],{"class":148,"line":7777},[146,10259,5962],{"class":263},[146,10261,267],{"class":259},[146,10263,5898],{"class":263},[146,10265,5969],{"class":160},[146,10267,400],{"class":263},[146,10269,1352],{"class":156},[146,10271,406],{"class":263},[146,10273,10274,10276,10278,10280,10282,10284,10286,10288,10290],{"class":148,"line":7782},[146,10275,2508],{"class":259},[146,10277,5982],{"class":263},[146,10279,648],{"class":259},[146,10281,5987],{"class":156},[146,10283,5990],{"class":259},[146,10285,5982],{"class":263},[146,10287,5995],{"class":259},[146,10289,5998],{"class":156},[146,10291,860],{"class":263},[146,10293,10294,10296,10298,10300,10302,10304,10306,10308],{"class":148,"line":7795},[146,10295,5908],{"class":263},[146,10297,440],{"class":259},[146,10299,6009],{"class":160},[146,10301,685],{"class":156},[146,10303,1774],{"class":263},[146,10305,691],{"class":156},[146,10307,449],{"class":160},[146,10309,406],{"class":263},[146,10311,10312,10314,10316,10318,10320,10322,10324],{"class":148,"line":7809},[146,10313,6055],{"class":263},[146,10315,267],{"class":259},[146,10317,5898],{"class":263},[146,10319,6062],{"class":160},[146,10321,400],{"class":263},[146,10323,1368],{"class":160},[146,10325,406],{"class":263},[146,10327,10328,10330,10332,10334,10336,10338,10340,10342,10344,10346,10348],{"class":148,"line":7836},[146,10329,2508],{"class":259},[146,10331,6075],{"class":263},[146,10333,6078],{"class":259},[146,10335,6081],{"class":259},[146,10337,6038],{"class":263},[146,10339,4017],{"class":160},[146,10341,400],{"class":263},[146,10343,1368],{"class":160},[146,10345,400],{"class":263},[146,10347,3714],{"class":160},[146,10349,10350],{"class":263},"}:\n",[146,10352,10353,10355,10357,10360,10362,10364,10366,10368],{"class":148,"line":7850},[146,10354,5908],{"class":263},[146,10356,440],{"class":259},[146,10358,10359],{"class":160},"\"Invalid quality: ",[146,10361,685],{"class":156},[146,10363,1782],{"class":263},[146,10365,691],{"class":156},[146,10367,449],{"class":160},[146,10369,406],{"class":263},[146,10371,10373,10375],{"class":148,"line":10372},99,[146,10374,2508],{"class":259},[146,10376,6350],{"class":263},[146,10378,10380,10382,10384,10386,10389,10391,10393,10395,10397,10399,10401,10403,10405,10407,10409,10411,10413,10415,10417,10419,10421],{"class":148,"line":10379},100,[146,10381,6355],{"class":259},[146,10383,5341],{"class":156},[146,10385,794],{"class":263},[146,10387,10388],{"class":160},"\"Validation failed:",[146,10390,1670],{"class":156},[146,10392,449],{"class":160},[146,10394,6371],{"class":259},[146,10396,6374],{"class":160},[146,10398,1670],{"class":156},[146,10400,449],{"class":160},[146,10402,6381],{"class":263},[146,10404,440],{"class":259},[146,10406,6386],{"class":160},[146,10408,685],{"class":156},[146,10410,5705],{"class":263},[146,10412,691],{"class":156},[146,10414,449],{"class":160},[146,10416,6397],{"class":259},[146,10418,6400],{"class":263},[146,10420,1180],{"class":259},[146,10422,6405],{"class":263},[146,10424,10426],{"class":148,"line":10425},101,[146,10427,376],{"emptyLinePlaceholder":58},[146,10429,10431],{"class":148,"line":10430},102,[146,10432,376],{"emptyLinePlaceholder":58},[146,10434,10436,10438,10440],{"class":148,"line":10435},103,[146,10437,526],{"class":259},[146,10439,2454],{"class":152},[146,10441,2457],{"class":263},[146,10443,10445],{"class":148,"line":10444},104,[146,10446,10447],{"class":160},"    \"\"\"pending 또는 processing 상태의 작업을 취소합니다.\"\"\"\n",[146,10449,10451,10453,10455],{"class":148,"line":10450},105,[146,10452,1427],{"class":263},[146,10454,267],{"class":259},[146,10456,1432],{"class":263},[146,10458,10460,10462,10464,10466,10468,10470,10472,10474,10476],{"class":148,"line":10459},106,[146,10461,1437],{"class":259},[146,10463,449],{"class":160},[146,10465,679],{"class":156},[146,10467,682],{"class":160},[146,10469,685],{"class":156},[146,10471,688],{"class":263},[146,10473,691],{"class":156},[146,10475,2489],{"class":160},[146,10477,452],{"class":263},[146,10479,10481,10483,10485],{"class":148,"line":10480},107,[146,10482,1455],{"class":701},[146,10484,267],{"class":259},[146,10486,707],{"class":156},[146,10488,10490],{"class":148,"line":10489},108,[146,10491,1483],{"class":263},[146,10493,10495,10497,10499,10501,10503],{"class":148,"line":10494},109,[146,10496,2508],{"class":259},[146,10498,2511],{"class":263},[146,10500,854],{"class":259},[146,10502,2516],{"class":156},[146,10504,860],{"class":263},[146,10506,10508,10510,10512,10514,10516,10518,10520,10522,10525],{"class":148,"line":10507},110,[146,10509,791],{"class":156},[146,10511,794],{"class":263},[146,10513,440],{"class":259},[146,10515,921],{"class":160},[146,10517,685],{"class":156},[146,10519,688],{"class":263},[146,10521,691],{"class":156},[146,10523,10524],{"class":160}," cancelled.\"",[146,10526,406],{"class":263},[146,10528,10530,10532],{"class":148,"line":10529},111,[146,10531,2544],{"class":259},[146,10533,860],{"class":263},[146,10535,10537,10539,10541,10543,10545,10547,10549,10551,10553],{"class":148,"line":10536},112,[146,10538,791],{"class":156},[146,10540,794],{"class":263},[146,10542,440],{"class":259},[146,10544,2557],{"class":160},[146,10546,685],{"class":156},[146,10548,2562],{"class":263},[146,10550,691],{"class":156},[146,10552,449],{"class":160},[146,10554,406],{"class":263},[146,10556,10558],{"class":148,"line":10557},113,[146,10559,376],{"emptyLinePlaceholder":58},[146,10561,10563],{"class":148,"line":10562},114,[146,10564,376],{"emptyLinePlaceholder":58},[146,10566,10568],{"class":148,"line":10567},115,[146,10569,10570],{"class":175},"# ── 예제 1: 텍스트-투-비디오 ──────────────────────────────────\n",[146,10572,10574,10576,10578],{"class":148,"line":10573},116,[146,10575,526],{"class":259},[146,10577,1286],{"class":152},[146,10579,1289],{"class":263},[146,10581,10583,10585,10587],{"class":148,"line":10582},117,[146,10584,1294],{"class":263},[146,10586,267],{"class":259},[146,10588,428],{"class":263},[146,10590,10592,10594,10596,10598],{"class":148,"line":10591},118,[146,10593,1303],{"class":160},[146,10595,437],{"class":263},[146,10597,1308],{"class":160},[146,10599,452],{"class":263},[146,10601,10603,10605],{"class":148,"line":10602},119,[146,10604,1319],{"class":160},[146,10606,1322],{"class":263},[146,10608,10610],{"class":148,"line":10609},120,[146,10611,1327],{"class":160},[146,10613,10615],{"class":148,"line":10614},121,[146,10616,1332],{"class":160},[146,10618,10620],{"class":148,"line":10619},122,[146,10621,1337],{"class":160},[146,10623,10625],{"class":148,"line":10624},123,[146,10626,1342],{"class":263},[146,10628,10630,10632,10634,10636],{"class":148,"line":10629},124,[146,10631,1347],{"class":160},[146,10633,437],{"class":263},[146,10635,1352],{"class":156},[146,10637,452],{"class":263},[146,10639,10641,10643,10645,10647],{"class":148,"line":10640},125,[146,10642,1363],{"class":160},[146,10644,437],{"class":263},[146,10646,1368],{"class":160},[146,10648,452],{"class":263},[146,10650,10652,10654,10656,10658],{"class":148,"line":10651},126,[146,10653,1379],{"class":160},[146,10655,437],{"class":263},[146,10657,1384],{"class":160},[146,10659,452],{"class":263},[146,10661,10663,10665,10667],{"class":148,"line":10662},127,[146,10664,1395],{"class":160},[146,10666,437],{"class":263},[146,10668,3742],{"class":156},[146,10670,10672],{"class":148,"line":10671},128,[146,10673,1407],{"class":263},[146,10675,10677],{"class":148,"line":10676},129,[146,10678,10679],{"class":263},"    validate_payload(payload)\n",[146,10681,10683,10685,10687],{"class":148,"line":10682},130,[146,10684,1496],{"class":263},[146,10686,267],{"class":259},[146,10688,8534],{"class":263},[146,10690,10692,10694,10696,10698,10701,10703,10705,10707,10709,10711,10714,10716,10718,10720,10722,10724,10726,10728,10731],{"class":148,"line":10691},131,[146,10693,1102],{"class":156},[146,10695,794],{"class":263},[146,10697,440],{"class":259},[146,10699,10700],{"class":160},"\"Task: ",[146,10702,685],{"class":156},[146,10704,1529],{"class":263},[146,10706,1532],{"class":160},[146,10708,1535],{"class":263},[146,10710,691],{"class":156},[146,10712,10713],{"class":160}," (ETA: ",[146,10715,685],{"class":156},[146,10717,1529],{"class":263},[146,10719,1559],{"class":160},[146,10721,1562],{"class":263},[146,10723,1565],{"class":160},[146,10725,1535],{"class":263},[146,10727,691],{"class":156},[146,10729,10730],{"class":160},"s)\"",[146,10732,406],{"class":263},[146,10734,10736,10738,10740,10742,10744],{"class":148,"line":10735},132,[146,10737,1618],{"class":263},[146,10739,267],{"class":259},[146,10741,1623],{"class":263},[146,10743,1626],{"class":160},[146,10745,1629],{"class":263},[146,10747,10749,10752,10754,10756,10758,10761,10764],{"class":148,"line":10748},133,[146,10750,10751],{"class":263},"    download_video(result[",[146,10753,1651],{"class":160},[146,10755,1562],{"class":263},[146,10757,783],{"class":156},[146,10759,10760],{"class":263},"], ",[146,10762,10763],{"class":160},"\"text_to_video.mp4\"",[146,10765,406],{"class":263},[146,10767,10769],{"class":148,"line":10768},134,[146,10770,376],{"emptyLinePlaceholder":58},[146,10772,10774],{"class":148,"line":10773},135,[146,10775,376],{"emptyLinePlaceholder":58},[146,10777,10779],{"class":148,"line":10778},136,[146,10780,10781],{"class":175},"# ── 예제 2: 이미지-투-비디오 ──────────────────────────────────\n",[146,10783,10785,10787,10789],{"class":148,"line":10784},137,[146,10786,526],{"class":259},[146,10788,2640],{"class":152},[146,10790,1289],{"class":263},[146,10792,10794,10796,10798],{"class":148,"line":10793},138,[146,10795,1294],{"class":263},[146,10797,267],{"class":259},[146,10799,428],{"class":263},[146,10801,10803,10805,10807,10809],{"class":148,"line":10802},139,[146,10804,1303],{"class":160},[146,10806,437],{"class":263},[146,10808,1308],{"class":160},[146,10810,452],{"class":263},[146,10812,10814,10816],{"class":148,"line":10813},140,[146,10815,1319],{"class":160},[146,10817,1322],{"class":263},[146,10819,10821],{"class":148,"line":10820},141,[146,10822,2671],{"class":160},[146,10824,10826],{"class":148,"line":10825},142,[146,10827,2676],{"class":160},[146,10829,10831],{"class":148,"line":10830},143,[146,10832,10833],{"class":160},"            \"across the frame.\"\n",[146,10835,10837],{"class":148,"line":10836},144,[146,10838,1342],{"class":263},[146,10840,10842,10844,10847,10850],{"class":148,"line":10841},145,[146,10843,2690],{"class":160},[146,10845,10846],{"class":263},": [",[146,10848,10849],{"class":160},"\"https://example.com/your-image.jpg\"",[146,10851,10852],{"class":263},"],\n",[146,10854,10856,10858,10860,10862],{"class":148,"line":10855},146,[146,10857,1347],{"class":160},[146,10859,437],{"class":263},[146,10861,1352],{"class":156},[146,10863,452],{"class":263},[146,10865,10867,10869,10871],{"class":148,"line":10866},147,[146,10868,1363],{"class":160},[146,10870,437],{"class":263},[146,10872,8513],{"class":160},[146,10874,10876],{"class":148,"line":10875},148,[146,10877,1407],{"class":263},[146,10879,10881],{"class":148,"line":10880},149,[146,10882,10679],{"class":263},[146,10884,10886,10888,10890],{"class":148,"line":10885},150,[146,10887,1496],{"class":263},[146,10889,267],{"class":259},[146,10891,8534],{"class":263},[146,10893,10895,10897,10899,10901,10903,10905,10907,10909,10911,10913,10915],{"class":148,"line":10894},151,[146,10896,1102],{"class":156},[146,10898,794],{"class":263},[146,10900,440],{"class":259},[146,10902,10700],{"class":160},[146,10904,685],{"class":156},[146,10906,1529],{"class":263},[146,10908,1532],{"class":160},[146,10910,1535],{"class":263},[146,10912,691],{"class":156},[146,10914,449],{"class":160},[146,10916,406],{"class":263},[146,10918,10920,10922,10924,10926,10928],{"class":148,"line":10919},152,[146,10921,1618],{"class":263},[146,10923,267],{"class":259},[146,10925,1623],{"class":263},[146,10927,1626],{"class":160},[146,10929,1629],{"class":263},[146,10931,10933,10935,10937,10939,10941,10943,10946],{"class":148,"line":10932},153,[146,10934,10751],{"class":263},[146,10936,1651],{"class":160},[146,10938,1562],{"class":263},[146,10940,783],{"class":156},[146,10942,10760],{"class":263},[146,10944,10945],{"class":160},"\"image_to_video.mp4\"",[146,10947,406],{"class":263},[146,10949,10951],{"class":148,"line":10950},154,[146,10952,376],{"emptyLinePlaceholder":58},[146,10954,10956],{"class":148,"line":10955},155,[146,10957,376],{"emptyLinePlaceholder":58},[146,10959,10961],{"class":148,"line":10960},156,[146,10962,10963],{"class":175},"# ── 예제 3: 세로형 소셜 미디어 비디오 ─────────────────────────\n",[146,10965,10967,10969,10972],{"class":148,"line":10966},157,[146,10968,526],{"class":259},[146,10970,10971],{"class":152}," social_media_video",[146,10973,1289],{"class":263},[146,10975,10977,10979,10981],{"class":148,"line":10976},158,[146,10978,1294],{"class":263},[146,10980,267],{"class":259},[146,10982,428],{"class":263},[146,10984,10986,10988,10990,10992],{"class":148,"line":10985},159,[146,10987,1303],{"class":160},[146,10989,437],{"class":263},[146,10991,1308],{"class":160},[146,10993,452],{"class":263},[146,10995,10997,10999],{"class":148,"line":10996},160,[146,10998,1319],{"class":160},[146,11000,1322],{"class":263},[146,11002,11004],{"class":148,"line":11003},161,[146,11005,11006],{"class":160},"            \"A barista pours latte art in slow motion. \"\n",[146,11008,11010],{"class":148,"line":11009},162,[146,11011,11012],{"class":160},"            \"Close-up overhead shot, warm cafe lighting.\"\n",[146,11014,11016],{"class":148,"line":11015},163,[146,11017,1342],{"class":263},[146,11019,11021,11023,11025,11027],{"class":148,"line":11020},164,[146,11022,1347],{"class":160},[146,11024,437],{"class":263},[146,11026,3702],{"class":156},[146,11028,452],{"class":263},[146,11030,11032,11034,11036,11038],{"class":148,"line":11031},165,[146,11033,1363],{"class":160},[146,11035,437],{"class":263},[146,11037,3714],{"class":160},[146,11039,452],{"class":263},[146,11041,11043,11045,11047,11049],{"class":148,"line":11042},166,[146,11044,1379],{"class":160},[146,11046,437],{"class":263},[146,11048,3726],{"class":160},[146,11050,452],{"class":263},[146,11052,11054,11056,11058],{"class":148,"line":11053},167,[146,11055,1395],{"class":160},[146,11057,437],{"class":263},[146,11059,3742],{"class":156},[146,11061,11063],{"class":148,"line":11062},168,[146,11064,1407],{"class":263},[146,11066,11068],{"class":148,"line":11067},169,[146,11069,10679],{"class":263},[146,11071,11073,11075,11077],{"class":148,"line":11072},170,[146,11074,1496],{"class":263},[146,11076,267],{"class":259},[146,11078,8534],{"class":263},[146,11080,11082,11084,11086,11088,11090,11092,11094,11096,11098,11100,11102],{"class":148,"line":11081},171,[146,11083,1102],{"class":156},[146,11085,794],{"class":263},[146,11087,440],{"class":259},[146,11089,10700],{"class":160},[146,11091,685],{"class":156},[146,11093,1529],{"class":263},[146,11095,1532],{"class":160},[146,11097,1535],{"class":263},[146,11099,691],{"class":156},[146,11101,449],{"class":160},[146,11103,406],{"class":263},[146,11105,11107,11109,11111,11113,11115],{"class":148,"line":11106},172,[146,11108,1618],{"class":263},[146,11110,267],{"class":259},[146,11112,1623],{"class":263},[146,11114,1626],{"class":160},[146,11116,1629],{"class":263},[146,11118,11120,11122,11124,11126,11128,11130,11133],{"class":148,"line":11119},173,[146,11121,10751],{"class":263},[146,11123,1651],{"class":160},[146,11125,1562],{"class":263},[146,11127,783],{"class":156},[146,11129,10760],{"class":263},[146,11131,11132],{"class":160},"\"social_video.mp4\"",[146,11134,406],{"class":263},[146,11136,11138],{"class":148,"line":11137},174,[146,11139,376],{"emptyLinePlaceholder":58},[146,11141,11143],{"class":148,"line":11142},175,[146,11144,376],{"emptyLinePlaceholder":58},[146,11146,11148,11150,11152,11154,11156],{"class":148,"line":11147},176,[146,11149,1719],{"class":259},[146,11151,1722],{"class":156},[146,11153,1725],{"class":259},[146,11155,1728],{"class":160},[146,11157,860],{"class":263},[146,11159,11161,11163,11165,11168],{"class":148,"line":11160},177,[146,11162,1102],{"class":156},[146,11164,794],{"class":263},[146,11166,11167],{"class":160},"\"=== 텍스트-투-비디오 ===\"",[146,11169,406],{"class":263},[146,11171,11173],{"class":148,"line":11172},178,[146,11174,1735],{"class":263},[146,11176,11178],{"class":148,"line":11177},179,[146,11179,11180],{"class":175},"    # print(\"\\n=== 이미지-투-비디오 ===\")\n",[146,11182,11184],{"class":148,"line":11183},180,[146,11185,11186],{"class":175},"    # image_to_video()  # 주석 해제 후 이미지 URL 설정\n",[146,11188,11190],{"class":148,"line":11189},181,[146,11191,11192],{"class":175},"    # print(\"\\n=== 소셜 미디어 비디오 ===\")\n",[146,11194,11196],{"class":148,"line":11195},182,[146,11197,11198],{"class":175},"    # social_media_video()\n",[18,11200,11201],{},[11,11202,11203,11205,11206,11208,11209,11212],{},[23,11204,134],{}," 현재 사용 가능한 모델로 테스트하려면 ",[28,11207,1308],{},"을 ",[28,11210,11211],{},"\"seedance-1.5-pro\"","로 변경하세요. API 인터페이스는 동일합니다 — 같은 엔드포인트, 같은 파라미터, 같은 응답 형식. Seedance 2.0이 완전히 출시되면 모델 이름만 다시 변경하면 됩니다.",[11,11214,11215],{},[23,11216,11217],{},[37,11218,11220],{"href":39,"rel":11219},[41],"시작하기 → EvoLink에서 무료 API Key 발급받기",[11222,11223,11224],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":142,"searchDepth":167,"depth":167,"links":11226},[11227,11230,11231,11232,11236,11241,11246,11250,11256,11264,11265,11270,11282],{"id":50,"depth":167,"text":51,"children":11228},[11229],{"id":94,"depth":179,"text":95},{"id":205,"depth":167,"text":206},{"id":311,"depth":167,"text":312},{"id":1265,"depth":167,"text":1266,"children":11233},[11234,11235],{"id":1844,"depth":179,"text":1845},{"id":2171,"depth":179,"text":2172},{"id":2215,"depth":167,"text":2216,"children":11237},[11238,11239,11240],{"id":2265,"depth":179,"text":2266},{"id":2344,"depth":179,"text":2345},{"id":2438,"depth":179,"text":2439},{"id":2604,"depth":167,"text":2605,"children":11242},[11243,11244,11245],{"id":2942,"depth":179,"text":2943},{"id":3219,"depth":179,"text":3220},{"id":3295,"depth":179,"text":3296},{"id":3390,"depth":167,"text":3391,"children":11247},[11248,11249],{"id":3645,"depth":179,"text":3646},{"id":4054,"depth":179,"text":4055},{"id":4165,"depth":167,"text":4166,"children":11251},[11252,11253,11254,11255],{"id":4172,"depth":179,"text":4173},{"id":4806,"depth":179,"text":4807},{"id":5020,"depth":179,"text":5021},{"id":5832,"depth":179,"text":5833},{"id":6432,"depth":167,"text":6433,"children":11257},[11258,11259,11260,11261,11262,11263],{"id":6443,"depth":179,"text":6444},{"id":6622,"depth":179,"text":6623},{"id":6688,"depth":179,"text":6689},{"id":7941,"depth":179,"text":7942},{"id":8079,"depth":179,"text":8080},{"id":8258,"depth":179,"text":8259},{"id":8350,"depth":167,"text":8351},{"id":8937,"depth":167,"text":8938,"children":11266},[11267,11268,11269],{"id":8944,"depth":179,"text":8945},{"id":8987,"depth":179,"text":8988},{"id":9013,"depth":179,"text":9014},{"id":9066,"depth":167,"text":9067,"children":11271},[11272,11273,11274,11275,11276,11277,11278,11279,11280,11281],{"id":9070,"depth":179,"text":9071},{"id":9084,"depth":179,"text":9085},{"id":9094,"depth":179,"text":9095},{"id":9104,"depth":179,"text":9105},{"id":9119,"depth":179,"text":9120},{"id":9136,"depth":179,"text":9137},{"id":9150,"depth":179,"text":9151},{"id":9170,"depth":179,"text":9171},{"id":9181,"depth":179,"text":9182},{"id":9201,"depth":179,"text":9202},{"id":9214,"depth":167,"text":9215},"Python으로 Seedance 2.0 API를 호출하여 AI 비디오를 생성하는 단계별 튜토리얼. 텍스트-투-비디오, 이미지-투-비디오, 비동기 polling, webhook, 오류 처리를 다룹니다.","md",{"date":11286,"image":11287,"seoTitle":11288,"author":11289},"2026-02-27","/s2-hero-api-tutorial.webp","Seedance 2.0 API 튜토리얼: Python으로 첫 AI 비디오 만들기 (2026)","J @ EvoLink","/ko/blog/seedance-2-api-tutorial-python",{"title":6,"description":11283},"ko/blog/seedance-2-api-tutorial-python","0zGZh5NrKkbDv9l6tHExd08fXtLCCWFQZRe2bhQPSRQ",{"id":11295,"title":11296,"body":11297,"description":13494,"extension":11284,"meta":13495,"navigation":58,"path":13498,"seo":13499,"stem":13500,"__hash__":13501},"content/ko/blog/seedance-2-camera-movement-api.md","Seedance 2.0 API로 카메라 무브먼트를 복제하는 방법",{"type":8,"value":11298,"toc":13445},[11299,11302,11308,11315,11322,11342,11345,11356,11358,11362,11365,11372,11398,11401,11404,11406,11410,11419,11423,11429,11432,11437,11443,11448,11454,11461,11465,11537,11546,11555,11557,11561,11565,11588,11592,11604,11608,11959,11962,11972,11974,11978,11981,11984,11987,11993,12003,12006,12012,12015,12037,12041,12244,12248,12255,12260,12265,12271,12273,12277,12280,12283,12286,12291,12296,12299,12305,12308,12510,12514,12521,12526,12528,12532,12535,12538,12543,12548,12551,12557,12560,12757,12761,12764,12810,12813,12815,12819,12822,12826,12829,12846,13087,13091,13094,13173,13179,13184,13186,13190,13194,13199,13205,13211,13216,13222,13226,13229,13235,13239,13250,13256,13260,13263,13276,13280,13283,13297,13299,13303,13307,13320,13324,13331,13335,13341,13345,13348,13352,13361,13363,13367,13373,13376,13396,13399,13406,13408,13413,13435,13437,13442],[11,11300,11301],{},"카메라 무브먼트는 평면적이고 정적인 영상과 시네마틱하게 느껴지는 영상을 가르는 핵심 요소입니다. 돌리 줌은 긴장감을 만들어 냅니다. 오비탈 샷은 웅장함을 더합니다. 원테이크 트래킹 샷은 몰입감을 극대화합니다. 전통적으로 이러한 기법을 구현하려면 짐벌, 크레인, 드론, 스테디캠 같은 고가의 장비와 숙련된 오퍼레이터가 필요했습니다.",[11,11303,11304,11305,11307],{},"Seedance 2.0은 하드웨어 의존성을 없앱니다. 원하는 카메라 무브먼트가 담긴 레퍼런스 비디오를 업로드하고, ",[28,11306,2961],{}," 태그를 통해 모델에게 무엇을 추출할지 지시하면 — API가 정확한 카메라 언어를 복제하는 새로운 콘텐츠를 생성합니다. 속도, 궤적, 리듬, 가속 곡선까지 모두 재현합니다.",[11,11309,11310],{},[11311,11312],"img",{"alt":11313,"src":11314},"Seedance 2.0 API를 활용한 시네마틱 카메라 무브먼트 복제 — 돌리 트랙 시각화","/s4-hero-camera-movement.webp",[11,11316,11317,11318,11321],{},"이 튜토리얼에서는 ",[37,11319,214],{"href":212,"rel":11320},[41],"를 통한 Seedance 2.0 API를 사용하여 세 가지 완전한 카메라 복제 사례를 안내합니다:",[70,11323,11324,11330,11336],{},[73,11325,11326,11329],{},[23,11327,11328],{},"원테이크 트래킹 샷"," — 여러 환경을 관통하는 연속 카메라 팔로우",[73,11331,11332,11335],{},[23,11333,11334],{},"히치콕 줌 (돌리 줌)"," — 클래식한 버티고 효과",[73,11337,11338,11341],{},[23,11339,11340],{},"오비탈 카메라"," — 피사체 주위의 360도 회전 촬영",[11,11343,11344],{},"각 사례에는 복사, 붙여넣기, 실행이 가능한 완전한 Python 스크립트가 포함되어 있습니다.",[11,11346,11347,11350,11351,11355],{},[23,11348,11349],{},"사전 준비 사항:"," Python 3.8+, ",[37,11352,11354],{"href":212,"rel":11353},[41],"EvoLink API 키"," (무료 플랜 이용 가능), 각 카메라 무브먼트 유형에 맞는 레퍼런스 비디오.",[45,11357],{},[48,11359,11361],{"id":11360},"카메라-무브먼트-복제가-ai-비디오를-바꾸는-이유","카메라 무브먼트 복제가 AI 비디오를 바꾸는 이유",[11,11363,11364],{},"대부분의 AI 비디오 생성기는 텍스트 기반의 기본적인 카메라 제어를 제공합니다. \"dolly in\"이나 \"pan left\"를 입력하고 모델이 제대로 알아듣길 바라는 수밖에 없습니다. 결과는 불안정합니다 — 부드러운 푸시인을 얻을 때도 있고, 불안정한 팬을 얻을 때도 있으며, 아무 변화도 없을 때도 있습니다.",[11,11366,11367,11368,11371],{},"Seedance 2.0은 근본적으로 다른 접근 방식을 취합니다: ",[23,11369,11370],{},"말로 설명하지 말고 보여주세요",". 카메라 무브먼트를 텍스트로 묘사하는 대신, 원하는 정확한 움직임을 보여주는 비디오를 업로드합니다. 모델이 레퍼런스를 분석하고 다음을 재현합니다:",[97,11373,11374,11380,11386,11392],{},[73,11375,11376,11379],{},[23,11377,11378],{},"카메라 궤적"," — 트래킹 경로, 오비탈 아크, 크레인 무브먼트",[73,11381,11382,11385],{},[23,11383,11384],{},"속도 및 가속"," — 이즈인, 이즈아웃, 급정지, 부드러운 글라이드",[73,11387,11388,11391],{},[23,11389,11390],{},"포컬 동작"," — 랙 포커스 타이밍, 피사계 심도 변화",[73,11393,11394,11397],{},[23,11395,11396],{},"구도 리듬"," — 각 프레이밍이 카메라가 움직이기 전까지 유지되는 시간",[11,11399,11400],{},"이는 할리우드 영화의 카메라 무브먼트, YouTube의 드론 샷, 또는 직접 촬영한 짐벌 클립을 가져와 — 완전히 새로운 콘텐츠에 그 정확한 움직임을 적용할 수 있다는 의미입니다.",[11,11402,11403],{},"이 수준의 카메라 제어를 제공하는 AI 비디오 API는 다른 곳에 없습니다. Sora 2와 Kling 3.0은 카메라 방향 지정에 텍스트 프롬프트를 사용합니다. Veo 3.1은 기본적인 카메라 키워드를 지원합니다. 오직 Seedance 2.0만이 카메라 언어 추출을 위한 레퍼런스 비디오 입력을 지원합니다.",[45,11405],{},[48,11407,11409],{"id":11408},"seedance-20이-카메라-언어를-읽는-방법","Seedance 2.0이 카메라 언어를 읽는 방법",[11,11411,11412,11414,11415,11418],{},[28,11413,2961],{}," 태그가 핵심 메커니즘입니다. 레퍼런스 비디오를 업로드하고 프롬프트에서 태그를 지정하면, 모델이 ",[2621,11416,11417],{},"무엇을"," 추출해야 하는지를 명시합니다. 이것이 중요합니다 — 하나의 레퍼런스 비디오에는 카메라 무브먼트, 피사체 움직임, 시각 효과, 조명, 페이싱이 모두 포함되어 있기 때문입니다. 모델에게 어떤 요소를 사용할지 지시해야 합니다.",[92,11420,11422],{"id":11421},"video-태그-문법","@Video 태그 문법",[11,11424,11425,11428],{},[28,11426,11427],{},"@Video1"," — 카메라 무브먼트와 트래킹 궤적을 레퍼런스합니다",[11,11430,11431],{},"프롬프트에서 무엇을 레퍼런스할지 명시적으로 기술합니다. 두 가지 접근 방식을 비교해 보세요:",[11,11433,11434],{},[23,11435,11436],{},"모호한 지시 (신뢰할 수 없음):",[137,11438,11441],{"className":11439,"code":11440,"language":2183},[2181],"Use @Video1 as reference. Generate a city scene.\n",[28,11442,11440],{"__ignoreMap":142},[11,11444,11445],{},[23,11446,11447],{},"구체적인 지시 (신뢰할 수 있음):",[137,11449,11452],{"className":11450,"code":11451,"language":2183},[2181],"Replicate @Video1's camera movement exactly — the tracking speed,\ntrajectory, and push-in timing. Apply this camera work to a new scene:\na samurai walking through a bamboo forest at dawn.\n",[28,11453,11451],{"__ignoreMap":142},[11,11455,11456,11457,11460],{},"두 번째 방식은 모델에게 레퍼런스에서 ",[2621,11458,11459],{},"오직"," 카메라 언어만 추출하라고 지시합니다. 새로운 콘텐츠(사무라이, 대나무 숲)를 생성하되, 레퍼런스 비디오의 카메라가 움직이는 것과 정확히 같은 방식으로 가상 카메라를 움직이라는 것입니다.",[92,11462,11464],{"id":11463},"추출할-수-있는-요소","추출할 수 있는 요소",[2035,11466,11467,11480],{},[2038,11468,11469],{},[2041,11470,11471,11474,11477],{},[2044,11472,11473],{},"레퍼런스 요소",[2044,11475,11476],{},"프롬프트 표현",[2044,11478,11479],{},"예시",[2051,11481,11482,11493,11504,11515,11526],{},[2041,11483,11484,11487,11490],{},[2056,11485,11486],{},"카메라 경로/궤적",[2056,11488,11489],{},"\"replicate camera movement\"",[2056,11491,11492],{},"트래킹, 돌리, 오비트, 크레인",[2041,11494,11495,11498,11501],{},[2056,11496,11497],{},"카메라 속도",[2056,11499,11500],{},"\"match camera pacing\"",[2056,11502,11503],{},"느린 크리프, 빠른 휩 팬",[2041,11505,11506,11509,11512],{},[2056,11507,11508],{},"카메라 + 피사체 동작",[2056,11510,11511],{},"\"replicate camera and choreography\"",[2056,11513,11514],{},"댄스 + 카메라 조합",[2041,11516,11517,11520,11523],{},[2056,11518,11519],{},"피사체 동작만",[2056,11521,11522],{},"\"replicate movement/action from @Video1\"",[2056,11524,11525],{},"캐릭터 걷기 패턴",[2041,11527,11528,11531,11534],{},[2056,11529,11530],{},"시각 효과",[2056,11532,11533],{},"\"replicate transition effects\"",[2056,11535,11536],{},"휩 팬 전환, 모프",[11,11538,11539,11542,11543,11545],{},[23,11540,11541],{},"핵심 규칙:"," 무엇을 레퍼런스하는지 명확하게 지정하세요. ",[2621,11544,11459],{}," 카메라 무브먼트만 원한다면 \"camera movement\"라고 말하세요. 액션 안무도 함께 원한다면 둘 다 명시하세요. 모호함은 혼합된 결과를 초래합니다.",[11,11547,11548,11551,11552,1260],{},[28,11549,11550],{},"@"," 태그 레퍼런스 시스템의 완전한 가이드는 ",[37,11553,11554],{"href":2969},"멀티모달 레퍼런스: @Tags 완벽 가이드",[45,11556],{},[48,11558,11560],{"id":11559},"환경-설정","환경 설정",[92,11562,11564],{"id":11563},"요구-사항","요구 사항",[97,11566,11567,11569,11574,11581],{},[73,11568,103],{},[73,11570,11571,11573],{},[28,11572,113],{}," 라이브러리",[73,11575,11576,11577,118],{},"EvoLink API 키 (",[37,11578,11580],{"href":212,"rel":11579},[41],"무료 가입",[73,11582,11583,11584,11587],{},"레퍼런스 비디오 파일 (MP4, 2",[2429,11585,11586],{},"15초, 50MB 이하, 480p","720p)",[92,11589,11591],{"id":11590},"의존성-설치","의존성 설치",[137,11593,11594],{"className":139,"code":318,"language":141,"meta":142,"style":142},[28,11595,11596],{"__ignoreMap":142},[146,11597,11598,11600,11602],{"class":148,"line":149},[146,11599,191],{"class":152},[146,11601,194],{"class":160},[146,11603,329],{"class":160},[92,11605,11607],{"id":11606},"기본-api-설정","기본 API 설정",[137,11609,11611],{"className":338,"code":11610,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nEVOLINK_API_KEY = \"your-evolink-api-key\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {EVOLINK_API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef poll_task(task_id, interval=5, timeout=300):\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        result = resp.json()\n        status = result.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"Video ready: {result['results'][0]}\")\n            return result\n        elif status == \"failed\":\n            print(f\"Generation failed: {result.get('error')}\")\n            return result\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timeout reached\")\n    return None\n",[28,11612,11613,11619,11625,11629,11638,11646,11654,11671,11679,11683,11687,11710,11718,11728,11736,11756,11764,11768,11778,11791,11795,11807,11838,11844,11856,11883,11889,11893,11923,11928,11937,11941,11952],{"__ignoreMap":142},[146,11614,11615,11617],{"class":148,"line":149},[146,11616,347],{"class":259},[146,11618,329],{"class":263},[146,11620,11621,11623],{"class":148,"line":167},[146,11622,347],{"class":259},[146,11624,356],{"class":263},[146,11626,11627],{"class":148,"line":179},[146,11628,376],{"emptyLinePlaceholder":58},[146,11630,11631,11633,11635],{"class":148,"line":188},[146,11632,276],{"class":156},[146,11634,391],{"class":259},[146,11636,11637],{"class":160}," \"your-evolink-api-key\"\n",[146,11639,11640,11642,11644],{"class":148,"line":373},[146,11641,412],{"class":156},[146,11643,391],{"class":259},[146,11645,417],{"class":160},[146,11647,11648,11650,11652],{"class":148,"line":379},[146,11649,423],{"class":156},[146,11651,391],{"class":259},[146,11653,428],{"class":263},[146,11655,11656,11658,11660,11662,11664,11667,11669],{"class":148,"line":385},[146,11657,434],{"class":160},[146,11659,437],{"class":263},[146,11661,440],{"class":259},[146,11663,443],{"class":160},[146,11665,11666],{"class":156},"{EVOLINK_API_KEY}",[146,11668,449],{"class":160},[146,11670,452],{"class":263},[146,11672,11673,11675,11677],{"class":148,"line":409},[146,11674,458],{"class":160},[146,11676,437],{"class":263},[146,11678,463],{"class":160},[146,11680,11681],{"class":148,"line":420},[146,11682,469],{"class":263},[146,11684,11685],{"class":148,"line":431},[146,11686,376],{"emptyLinePlaceholder":58},[146,11688,11689,11691,11694,11697,11699,11701,11703,11705,11708],{"class":148,"line":455},[146,11690,526],{"class":259},[146,11692,11693],{"class":152}," poll_task",[146,11695,11696],{"class":263},"(task_id, interval",[146,11698,267],{"class":259},[146,11700,1352],{"class":156},[146,11702,540],{"class":263},[146,11704,267],{"class":259},[146,11706,11707],{"class":156},"300",[146,11709,548],{"class":263},[146,11711,11712,11714,11716],{"class":148,"line":466},[146,11713,631],{"class":263},[146,11715,267],{"class":259},[146,11717,636],{"class":156},[146,11719,11720,11722,11724,11726],{"class":148,"line":600},[146,11721,642],{"class":259},[146,11723,645],{"class":263},[146,11725,648],{"class":259},[146,11727,651],{"class":263},[146,11729,11730,11732,11734],{"class":148,"line":605},[146,11731,6932],{"class":263},[146,11733,267],{"class":259},[146,11735,668],{"class":263},[146,11737,11738,11740,11742,11744,11746,11748,11750,11752,11754],{"class":148,"line":611},[146,11739,674],{"class":259},[146,11741,449],{"class":160},[146,11743,679],{"class":156},[146,11745,682],{"class":160},[146,11747,685],{"class":156},[146,11749,688],{"class":263},[146,11751,691],{"class":156},[146,11753,449],{"class":160},[146,11755,452],{"class":263},[146,11757,11758,11760,11762],{"class":148,"line":617},[146,11759,702],{"class":701},[146,11761,267],{"class":259},[146,11763,707],{"class":156},[146,11765,11766],{"class":148,"line":623},[146,11767,713],{"class":263},[146,11769,11770,11773,11775],{"class":148,"line":628},[146,11771,11772],{"class":263},"        result ",[146,11774,267],{"class":259},[146,11776,11777],{"class":263}," resp.json()\n",[146,11779,11780,11782,11784,11787,11789],{"class":148,"line":639},[146,11781,753],{"class":263},[146,11783,267],{"class":259},[146,11785,11786],{"class":263}," result.get(",[146,11788,761],{"class":160},[146,11790,406],{"class":263},[146,11792,11793],{"class":148,"line":654},[146,11794,376],{"emptyLinePlaceholder":58},[146,11796,11797,11799,11801,11803,11805],{"class":148,"line":660},[146,11798,848],{"class":259},[146,11800,851],{"class":263},[146,11802,854],{"class":259},[146,11804,857],{"class":160},[146,11806,860],{"class":263},[146,11808,11809,11811,11813,11815,11818,11820,11823,11826,11828,11830,11832,11834,11836],{"class":148,"line":671},[146,11810,5580],{"class":156},[146,11812,794],{"class":263},[146,11814,440],{"class":259},[146,11816,11817],{"class":160},"\"Video ready: ",[146,11819,685],{"class":156},[146,11821,11822],{"class":263},"result[",[146,11824,11825],{"class":160},"'results'",[146,11827,1562],{"class":263},[146,11829,783],{"class":156},[146,11831,1535],{"class":263},[146,11833,691],{"class":156},[146,11835,449],{"class":160},[146,11837,406],{"class":263},[146,11839,11840,11842],{"class":148,"line":698},[146,11841,866],{"class":259},[146,11843,1706],{"class":263},[146,11845,11846,11848,11850,11852,11854],{"class":148,"line":710},[146,11847,875],{"class":259},[146,11849,851],{"class":263},[146,11851,854],{"class":259},[146,11853,882],{"class":160},[146,11855,860],{"class":263},[146,11857,11858,11860,11862,11864,11867,11869,11872,11875,11877,11879,11881],{"class":148,"line":716},[146,11859,5580],{"class":156},[146,11861,794],{"class":263},[146,11863,440],{"class":259},[146,11865,11866],{"class":160},"\"Generation failed: ",[146,11868,685],{"class":156},[146,11870,11871],{"class":263},"result.get(",[146,11873,11874],{"class":160},"'error'",[146,11876,118],{"class":263},[146,11878,691],{"class":156},[146,11880,449],{"class":160},[146,11882,406],{"class":263},[146,11884,11885,11887],{"class":148,"line":722},[146,11886,866],{"class":259},[146,11888,1706],{"class":263},[146,11890,11891],{"class":148,"line":728},[146,11892,376],{"emptyLinePlaceholder":58},[146,11894,11895,11897,11899,11901,11904,11906,11908,11910,11912,11914,11916,11918,11921],{"class":148,"line":739},[146,11896,791],{"class":156},[146,11898,794],{"class":263},[146,11900,440],{"class":259},[146,11902,11903],{"class":160},"\"Status: ",[146,11905,685],{"class":156},[146,11907,814],{"class":263},[146,11909,691],{"class":156},[146,11911,104],{"class":160},[146,11913,685],{"class":156},[146,11915,804],{"class":263},[146,11917,691],{"class":156},[146,11919,11920],{"class":160},"s elapsed)\"",[146,11922,406],{"class":263},[146,11924,11925],{"class":148,"line":744},[146,11926,11927],{"class":263},"        time.sleep(interval)\n",[146,11929,11930,11932,11934],{"class":148,"line":750},[146,11931,979],{"class":263},[146,11933,982],{"class":259},[146,11935,11936],{"class":263}," interval\n",[146,11938,11939],{"class":148,"line":767},[146,11940,376],{"emptyLinePlaceholder":58},[146,11942,11943,11945,11947,11950],{"class":148,"line":788},[146,11944,1102],{"class":156},[146,11946,794],{"class":263},[146,11948,11949],{"class":160},"\"Timeout reached\"",[146,11951,406],{"class":263},[146,11953,11954,11956],{"class":148,"line":834},[146,11955,1703],{"class":259},[146,11957,11958],{"class":156}," None\n",[11,11960,11961],{},"이 기본 코드는 인증과 작업 폴링을 처리합니다. 아래의 모든 사례가 이 코드를 기반으로 합니다.",[11,11963,11964,1061,11967,11971],{},[23,11965,11966],{},"무료 EvoLink API 키를 발급받으세요",[37,11968,11970],{"href":212,"rel":11969},[41],"evolink.ai","에서 아래 예제를 직접 따라해 볼 수 있습니다.",[45,11973],{},[48,11975,11977],{"id":11976},"사례-1-원테이크-트래킹-샷","사례 1: 원테이크 트래킹 샷",[11,11979,11980],{},"원테이크 트래킹 샷은 영화 제작에서 가장 압도적인 카메라 기법 중 하나입니다. 카메라가 단일 연속 테이크로 여러 환경을 관통하며 피사체를 따라갑니다 — 컷 없이. 《좋은 친구들》의 유명한 코파카바나 씬이나 《올드보이》의 복도 격투 장면을 떠올려 보세요.",[11,11982,11983],{},"Seedance 2.0에서는 연속 트래킹 무브먼트를 보여주는 레퍼런스 비디오를 업로드한 후, 동일한 카메라 경로를 따르는 새로운 콘텐츠를 생성하는 방식으로 이를 복제합니다.",[92,11985,11986],{"id":11986},"준비물",[11,11988,11989,11992],{},[23,11990,11991],{},"레퍼런스 비디오:"," 연속 트래킹 카메라 무브먼트를 보여주는 클립 (2~15초). 짐벌 워킹 샷, 드론 팔로잉 샷, 또는 스테디캠 클립이 적합합니다.",[11,11994,11995,11998,11999,12002],{},[23,11996,11997],{},"프롬프트:"," 비디오의 카메라 무브먼트를 레퍼런스하면서 생성할 ",[2621,12000,12001],{},"새로운 콘텐츠","를 설명합니다.",[92,12004,12005],{"id":12005},"프롬프트",[137,12007,12010],{"className":12008,"code":12009,"language":2183},[2181],"Replicate @Video1's camera movement exactly — continuous one-take\ntracking shot, maintaining the same speed, trajectory, and smooth\nforward motion throughout.\n\nApply this camera work to a new scene: a parkour runner sprinting\nthrough narrow city alleyways, leaping over obstacles, vaulting up\na staircase, and reaching a rooftop overlooking the city skyline.\nGolden sunset lighting. Dynamic and energetic. No cuts.\n",[28,12011,12009],{"__ignoreMap":142},[11,12013,12014],{},"이 프롬프트의 핵심 요소:",[97,12016,12017,12025,12031],{},[73,12018,12019,2424,12022,12024],{},[23,12020,12021],{},"1~3행:",[28,12023,11427],{},"에서 카메라 무브먼트를 추출하도록 모델에게 명시적으로 지시합니다",[73,12026,12027,12030],{},[23,12028,12029],{},"5~8행:"," 완전히 새로운 콘텐츠를 설명합니다 — 모델이 이 피사체를 생성합니다",[73,12032,12033,12036],{},[23,12034,12035],{},"\"No cuts\":"," 원테이크 요구 사항을 강조합니다",[92,12038,12040],{"id":12039},"전체-python-코드","전체 Python 코드",[137,12042,12044],{"className":338,"code":12043,"language":340,"meta":142,"style":142},"# Case 1: One-Take Tracking Shot\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera movement exactly — continuous \"\n            \"one-take tracking shot, maintaining the same speed, \"\n            \"trajectory, and smooth forward motion throughout.\\n\\n\"\n            \"Apply this camera work to a new scene: a parkour runner \"\n            \"sprinting through narrow city alleyways, leaping over \"\n            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n            \"overlooking the city skyline. Golden sunset lighting. \"\n            \"Dynamic and energetic. No cuts.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/tracking_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12045,12046,12051,12055,12063,12075,12085,12093,12103,12109,12114,12119,12129,12134,12139,12144,12149,12154,12158,12170,12180,12188,12192,12196,12200,12214,12234],{"__ignoreMap":142},[146,12047,12048],{"class":148,"line":149},[146,12049,12050],{"class":175},"# Case 1: One-Take Tracking Shot\n",[146,12052,12053],{"class":148,"line":167},[146,12054,376],{"emptyLinePlaceholder":58},[146,12056,12057,12059,12061],{"class":148,"line":179},[146,12058,6532],{"class":263},[146,12060,267],{"class":259},[146,12062,1432],{"class":263},[146,12064,12065,12067,12069,12071,12073],{"class":148,"line":188},[146,12066,6541],{"class":259},[146,12068,449],{"class":160},[146,12070,679],{"class":156},[146,12072,1444],{"class":160},[146,12074,452],{"class":263},[146,12076,12077,12079,12081,12083],{"class":148,"line":373},[146,12078,6554],{"class":701},[146,12080,267],{"class":259},[146,12082,423],{"class":156},[146,12084,452],{"class":263},[146,12086,12087,12089,12091],{"class":148,"line":379},[146,12088,6565],{"class":701},[146,12090,267],{"class":259},[146,12092,1864],{"class":263},[146,12094,12095,12097,12099,12101],{"class":148,"line":385},[146,12096,1303],{"class":160},[146,12098,437],{"class":263},[146,12100,1308],{"class":160},[146,12102,452],{"class":263},[146,12104,12105,12107],{"class":148,"line":409},[146,12106,1319],{"class":160},[146,12108,1322],{"class":263},[146,12110,12111],{"class":148,"line":420},[146,12112,12113],{"class":160},"            \"Replicate @Video1's camera movement exactly — continuous \"\n",[146,12115,12116],{"class":148,"line":431},[146,12117,12118],{"class":160},"            \"one-take tracking shot, maintaining the same speed, \"\n",[146,12120,12121,12124,12127],{"class":148,"line":455},[146,12122,12123],{"class":160},"            \"trajectory, and smooth forward motion throughout.",[146,12125,12126],{"class":156},"\\n\\n",[146,12128,950],{"class":160},[146,12130,12131],{"class":148,"line":466},[146,12132,12133],{"class":160},"            \"Apply this camera work to a new scene: a parkour runner \"\n",[146,12135,12136],{"class":148,"line":600},[146,12137,12138],{"class":160},"            \"sprinting through narrow city alleyways, leaping over \"\n",[146,12140,12141],{"class":148,"line":605},[146,12142,12143],{"class":160},"            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n",[146,12145,12146],{"class":148,"line":611},[146,12147,12148],{"class":160},"            \"overlooking the city skyline. Golden sunset lighting. \"\n",[146,12150,12151],{"class":148,"line":617},[146,12152,12153],{"class":160},"            \"Dynamic and energetic. No cuts.\"\n",[146,12155,12156],{"class":148,"line":623},[146,12157,1342],{"class":263},[146,12159,12160,12163,12165,12168],{"class":148,"line":628},[146,12161,12162],{"class":160},"        \"video_urls\"",[146,12164,10846],{"class":263},[146,12166,12167],{"class":160},"\"https://your-cdn.com/tracking_reference.mp4\"",[146,12169,10852],{"class":263},[146,12171,12172,12174,12176,12178],{"class":148,"line":639},[146,12173,1347],{"class":160},[146,12175,437],{"class":263},[146,12177,537],{"class":156},[146,12179,452],{"class":263},[146,12181,12182,12184,12186],{"class":148,"line":654},[146,12183,1363],{"class":160},[146,12185,437],{"class":263},[146,12187,8513],{"class":160},[146,12189,12190],{"class":148,"line":660},[146,12191,1407],{"class":263},[146,12193,12194],{"class":148,"line":671},[146,12195,406],{"class":263},[146,12197,12198],{"class":148,"line":698},[146,12199,376],{"emptyLinePlaceholder":58},[146,12201,12202,12205,12207,12210,12212],{"class":148,"line":710},[146,12203,12204],{"class":263},"task_id ",[146,12206,267],{"class":259},[146,12208,12209],{"class":263}," response.json()[",[146,12211,1626],{"class":160},[146,12213,764],{"class":263},[146,12215,12216,12218,12220,12222,12224,12226,12228,12230,12232],{"class":148,"line":716},[146,12217,6587],{"class":156},[146,12219,794],{"class":263},[146,12221,440],{"class":259},[146,12223,1524],{"class":160},[146,12225,685],{"class":156},[146,12227,688],{"class":263},[146,12229,691],{"class":156},[146,12231,449],{"class":160},[146,12233,406],{"class":263},[146,12235,12236,12239,12241],{"class":148,"line":722},[146,12237,12238],{"class":263},"result ",[146,12240,267],{"class":259},[146,12242,12243],{"class":263}," poll_task(task_id)\n",[92,12245,12247],{"id":12246},"예상-결과","예상 결과",[11,12249,12250,12251,12254],{},"생성된 비디오는 도시 환경의 파쿠르 러너를 보여줍니다 — 하지만 카메라 무브먼트(트래킹 속도, 전진 모멘텀, 부드러운 연속 동작)는 레퍼런스 비디오에서 가져옵니다. 모델은 레퍼런스의 피사체나 배경을 복사하지 않습니다. ",[2621,12252,12253],{},"카메라가 어떻게 움직이는지","를 복사합니다.",[56,12256,60,12257],{"controls":58,"playsInline":58,"style":59},[62,12258],{"src":12259,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%9F%8E%E5%B8%82%E8%B7%91%E9%85%B7.mp4",[11,12261,12262],{},[2621,12263,12264],{},"예시 출력: 도시 환경을 관통하며 파쿠르 러너를 따라가는 원테이크 트래킹 샷. 카메라가 짐벌과 같은 안정성으로 연속적인 전진 모션을 유지합니다.",[11,12266,12267,12270],{},[23,12268,12269],{},"직접 시도해 보세요:"," 자신만의 레퍼런스 비디오를 사용해 보세요 — 드론 팔로잉 샷, 자동차 블랙박스 영상, 또는 워킹 짐벌 비디오 — 그리고 원하는 장면에 맞게 프롬프트를 변경하세요. 카메라 무브먼트가 전이됩니다.",[45,12272],{},[48,12274,12276],{"id":12275},"사례-2-히치콕-줌-돌리-줌","사례 2: 히치콕 줌 (돌리 줌)",[11,12278,12279],{},"돌리 줌 — 알프레드 히치콕의 《현기증》(1958)을 위해 발명된 기법 — 은 영화사에서 가장 강렬하고 강력한 카메라 기법 중 하나입니다. 카메라가 피사체를 향해(또는 피사체에서 멀어지며) 물리적으로 이동하면서 렌즈는 반대 방향으로 줌합니다. 피사체는 프레임 내에서 동일한 크기를 유지하지만 배경은 극적으로 왜곡됩니다. 불안감, 깨달음, 또는 감정적 전환을 본능적으로 느끼게 하는 효과입니다.",[11,12281,12282],{},"실제 영화 제작에서는 돌리 트랙과 정밀한 줌 타이밍이 필요합니다. Seedance 2.0에서는 레퍼런스 클립만 있으면 됩니다.",[92,12284,11986],{"id":12285},"준비물-1",[11,12287,12288,12290],{},[23,12289,11991],{}," 돌리 줌 효과를 보여주는 클립. YouTube에서 \"dolly zoom effect\" 또는 \"vertigo effect tutorial\"을 검색하면 예시를 찾을 수 있습니다. 피사체가 정지한 상태에서 배경이 압축/확장되는 3~8초 분량의 클립이 적합합니다.",[11,12292,12293,12295],{},[23,12294,11997],{}," 명시적인 돌리 줌 레퍼런스와 함께 새로운 피사체를 설명합니다.",[92,12297,12005],{"id":12298},"프롬프트-1",[137,12300,12303],{"className":12301,"code":12302,"language":2183},[2181],"Replicate @Video1's camera technique exactly — the dolly zoom\n(Hitchcock zoom) effect where the camera moves forward while\nzooming out, keeping the subject the same size while the\nbackground dramatically stretches.\n\nApply this effect to: a detective standing in a dim corridor.\nAs the dolly zoom activates, the corridor behind him stretches\nimpossibly long, creating a sense of dawning horror.\nDramatic side lighting with deep shadows. Film noir atmosphere.\n",[28,12304,12302],{"__ignoreMap":142},[92,12306,12040],{"id":12307},"전체-python-코드-1",[137,12309,12311],{"className":338,"code":12310,"language":340,"meta":142,"style":142},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera technique exactly — the dolly \"\n            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n            \"while zooming out, keeping the subject the same size while \"\n            \"the background dramatically stretches.\\n\\n\"\n            \"Apply this effect to: a detective standing in a dim \"\n            \"corridor. As the dolly zoom activates, the corridor behind \"\n            \"him stretches impossibly long, creating a sense of dawning \"\n            \"horror. Dramatic side lighting with deep shadows. \"\n            \"Film noir atmosphere.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/dolly_zoom_reference.mp4\"],\n        \"duration\": 8,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12312,12313,12318,12322,12330,12342,12352,12360,12370,12376,12381,12386,12391,12400,12405,12410,12415,12420,12425,12429,12440,12450,12458,12462,12466,12470,12482,12502],{"__ignoreMap":142},[146,12314,12315],{"class":148,"line":149},[146,12316,12317],{"class":175},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n",[146,12319,12320],{"class":148,"line":167},[146,12321,376],{"emptyLinePlaceholder":58},[146,12323,12324,12326,12328],{"class":148,"line":179},[146,12325,6532],{"class":263},[146,12327,267],{"class":259},[146,12329,1432],{"class":263},[146,12331,12332,12334,12336,12338,12340],{"class":148,"line":188},[146,12333,6541],{"class":259},[146,12335,449],{"class":160},[146,12337,679],{"class":156},[146,12339,1444],{"class":160},[146,12341,452],{"class":263},[146,12343,12344,12346,12348,12350],{"class":148,"line":373},[146,12345,6554],{"class":701},[146,12347,267],{"class":259},[146,12349,423],{"class":156},[146,12351,452],{"class":263},[146,12353,12354,12356,12358],{"class":148,"line":379},[146,12355,6565],{"class":701},[146,12357,267],{"class":259},[146,12359,1864],{"class":263},[146,12361,12362,12364,12366,12368],{"class":148,"line":385},[146,12363,1303],{"class":160},[146,12365,437],{"class":263},[146,12367,1308],{"class":160},[146,12369,452],{"class":263},[146,12371,12372,12374],{"class":148,"line":409},[146,12373,1319],{"class":160},[146,12375,1322],{"class":263},[146,12377,12378],{"class":148,"line":420},[146,12379,12380],{"class":160},"            \"Replicate @Video1's camera technique exactly — the dolly \"\n",[146,12382,12383],{"class":148,"line":431},[146,12384,12385],{"class":160},"            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n",[146,12387,12388],{"class":148,"line":455},[146,12389,12390],{"class":160},"            \"while zooming out, keeping the subject the same size while \"\n",[146,12392,12393,12396,12398],{"class":148,"line":466},[146,12394,12395],{"class":160},"            \"the background dramatically stretches.",[146,12397,12126],{"class":156},[146,12399,950],{"class":160},[146,12401,12402],{"class":148,"line":600},[146,12403,12404],{"class":160},"            \"Apply this effect to: a detective standing in a dim \"\n",[146,12406,12407],{"class":148,"line":605},[146,12408,12409],{"class":160},"            \"corridor. As the dolly zoom activates, the corridor behind \"\n",[146,12411,12412],{"class":148,"line":611},[146,12413,12414],{"class":160},"            \"him stretches impossibly long, creating a sense of dawning \"\n",[146,12416,12417],{"class":148,"line":617},[146,12418,12419],{"class":160},"            \"horror. Dramatic side lighting with deep shadows. \"\n",[146,12421,12422],{"class":148,"line":623},[146,12423,12424],{"class":160},"            \"Film noir atmosphere.\"\n",[146,12426,12427],{"class":148,"line":628},[146,12428,1342],{"class":263},[146,12430,12431,12433,12435,12438],{"class":148,"line":639},[146,12432,12162],{"class":160},[146,12434,10846],{"class":263},[146,12436,12437],{"class":160},"\"https://your-cdn.com/dolly_zoom_reference.mp4\"",[146,12439,10852],{"class":263},[146,12441,12442,12444,12446,12448],{"class":148,"line":654},[146,12443,1347],{"class":160},[146,12445,437],{"class":263},[146,12447,3702],{"class":156},[146,12449,452],{"class":263},[146,12451,12452,12454,12456],{"class":148,"line":660},[146,12453,1363],{"class":160},[146,12455,437],{"class":263},[146,12457,8513],{"class":160},[146,12459,12460],{"class":148,"line":671},[146,12461,1407],{"class":263},[146,12463,12464],{"class":148,"line":698},[146,12465,406],{"class":263},[146,12467,12468],{"class":148,"line":710},[146,12469,376],{"emptyLinePlaceholder":58},[146,12471,12472,12474,12476,12478,12480],{"class":148,"line":716},[146,12473,12204],{"class":263},[146,12475,267],{"class":259},[146,12477,12209],{"class":263},[146,12479,1626],{"class":160},[146,12481,764],{"class":263},[146,12483,12484,12486,12488,12490,12492,12494,12496,12498,12500],{"class":148,"line":722},[146,12485,6587],{"class":156},[146,12487,794],{"class":263},[146,12489,440],{"class":259},[146,12491,1524],{"class":160},[146,12493,685],{"class":156},[146,12495,688],{"class":263},[146,12497,691],{"class":156},[146,12499,449],{"class":160},[146,12501,406],{"class":263},[146,12503,12504,12506,12508],{"class":148,"line":728},[146,12505,12238],{"class":263},[146,12507,267],{"class":259},[146,12509,12243],{"class":263},[92,12511,12513],{"id":12512},"이-방법이-효과적인-이유","이 방법이 효과적인 이유",[11,12515,12516,12517,12520],{},"돌리 줌은 텍스트로 묘사하기가 매우 어렵기로 유명합니다. \"zoom in while moving backward\"라고 프롬프트를 작성하면 다른 AI 비디오 도구에서 혼란스러운 결과가 나오는 경우가 많습니다. 기법을 ",[2621,12518,12519],{},"시연하는"," 레퍼런스 비디오를 제공함으로써 Seedance 2.0은 공간 관계의 변화 — 전경 대비 배경이 어떻게 압축/확장되는지 — 를 분석하고 정밀하게 재현할 수 있습니다.",[11,12522,12523,12525],{},[23,12524,134],{}," 레퍼런스 비디오에서 돌리 줌이 깨끗하고 독립적일수록 결과가 좋습니다. 피사체 움직임이 많거나 장면 전환이 있는 레퍼런스 클립은 피하세요 — 모델이 카메라 모션과 피사체 모션을 혼동할 수 있습니다.",[45,12527],{},[48,12529,12531],{"id":12530},"사례-3-오비탈-카메라-360도-회전","사례 3: 오비탈 카메라 (360도 회전)",[11,12533,12534],{},"오비탈 샷은 피사체 주위로 카메라를 회전시켜 극적인 공개 효과를 만들거나 캐릭터의 존재감을 강조합니다. 뮤직 비디오, 히어로 등장, 제품 소개의 단골 기법입니다.",[92,12536,11986],{"id":12537},"준비물-2",[11,12539,12540,12542],{},[23,12541,11991],{}," 피사체 주위를 카메라가 공전하는 클립. 부드러운 180도 또는 360도 회전이 가장 효과적입니다. 턴테이블 제품 촬영이나 캐릭터 리빌 샷이 이상적인 레퍼런스입니다.",[11,12544,12545,12547],{},[23,12546,11997],{}," 새로운 피사체 + 명시적인 오비탈 레퍼런스.",[92,12549,12005],{"id":12550},"프롬프트-2",[137,12552,12555],{"className":12553,"code":12554,"language":2183},[2181],"Replicate @Video1's orbital camera movement — the smooth 360°\nrotation around the subject, maintaining consistent distance\nand speed throughout the arc.\n\nApply this camera movement to: a lone astronaut standing on\nthe surface of Mars. Red desert landscape stretches to the\nhorizon. The orbital camera reveals the astronaut from all\nangles as dust particles float in the thin atmosphere.\nEpic cinematic scale. Golden hour Martian lighting.\n",[28,12556,12554],{"__ignoreMap":142},[92,12558,12040],{"id":12559},"전체-python-코드-2",[137,12561,12563],{"className":338,"code":12562,"language":340,"meta":142,"style":142},"# Case 3: Orbital Camera (360 Rotation)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — the smooth \"\n            \"360 degree rotation around the subject, maintaining consistent \"\n            \"distance and speed throughout the arc.\\n\\n\"\n            \"Apply this camera movement to: a lone astronaut standing \"\n            \"on the surface of Mars. Red desert landscape stretches to \"\n            \"the horizon. The orbital camera reveals the astronaut from \"\n            \"all angles as dust particles float in the thin atmosphere. \"\n            \"Epic cinematic scale. Golden hour Martian lighting.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/orbital_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12564,12565,12570,12574,12582,12594,12604,12612,12622,12628,12633,12638,12647,12652,12657,12662,12667,12672,12676,12687,12697,12705,12709,12713,12717,12729,12749],{"__ignoreMap":142},[146,12566,12567],{"class":148,"line":149},[146,12568,12569],{"class":175},"# Case 3: Orbital Camera (360 Rotation)\n",[146,12571,12572],{"class":148,"line":167},[146,12573,376],{"emptyLinePlaceholder":58},[146,12575,12576,12578,12580],{"class":148,"line":179},[146,12577,6532],{"class":263},[146,12579,267],{"class":259},[146,12581,1432],{"class":263},[146,12583,12584,12586,12588,12590,12592],{"class":148,"line":188},[146,12585,6541],{"class":259},[146,12587,449],{"class":160},[146,12589,679],{"class":156},[146,12591,1444],{"class":160},[146,12593,452],{"class":263},[146,12595,12596,12598,12600,12602],{"class":148,"line":373},[146,12597,6554],{"class":701},[146,12599,267],{"class":259},[146,12601,423],{"class":156},[146,12603,452],{"class":263},[146,12605,12606,12608,12610],{"class":148,"line":379},[146,12607,6565],{"class":701},[146,12609,267],{"class":259},[146,12611,1864],{"class":263},[146,12613,12614,12616,12618,12620],{"class":148,"line":385},[146,12615,1303],{"class":160},[146,12617,437],{"class":263},[146,12619,1308],{"class":160},[146,12621,452],{"class":263},[146,12623,12624,12626],{"class":148,"line":409},[146,12625,1319],{"class":160},[146,12627,1322],{"class":263},[146,12629,12630],{"class":148,"line":420},[146,12631,12632],{"class":160},"            \"Replicate @Video1's orbital camera movement — the smooth \"\n",[146,12634,12635],{"class":148,"line":431},[146,12636,12637],{"class":160},"            \"360 degree rotation around the subject, maintaining consistent \"\n",[146,12639,12640,12643,12645],{"class":148,"line":455},[146,12641,12642],{"class":160},"            \"distance and speed throughout the arc.",[146,12644,12126],{"class":156},[146,12646,950],{"class":160},[146,12648,12649],{"class":148,"line":466},[146,12650,12651],{"class":160},"            \"Apply this camera movement to: a lone astronaut standing \"\n",[146,12653,12654],{"class":148,"line":600},[146,12655,12656],{"class":160},"            \"on the surface of Mars. Red desert landscape stretches to \"\n",[146,12658,12659],{"class":148,"line":605},[146,12660,12661],{"class":160},"            \"the horizon. The orbital camera reveals the astronaut from \"\n",[146,12663,12664],{"class":148,"line":611},[146,12665,12666],{"class":160},"            \"all angles as dust particles float in the thin atmosphere. \"\n",[146,12668,12669],{"class":148,"line":617},[146,12670,12671],{"class":160},"            \"Epic cinematic scale. Golden hour Martian lighting.\"\n",[146,12673,12674],{"class":148,"line":623},[146,12675,1342],{"class":263},[146,12677,12678,12680,12682,12685],{"class":148,"line":628},[146,12679,12162],{"class":160},[146,12681,10846],{"class":263},[146,12683,12684],{"class":160},"\"https://your-cdn.com/orbital_reference.mp4\"",[146,12686,10852],{"class":263},[146,12688,12689,12691,12693,12695],{"class":148,"line":639},[146,12690,1347],{"class":160},[146,12692,437],{"class":263},[146,12694,537],{"class":156},[146,12696,452],{"class":263},[146,12698,12699,12701,12703],{"class":148,"line":654},[146,12700,1363],{"class":160},[146,12702,437],{"class":263},[146,12704,8513],{"class":160},[146,12706,12707],{"class":148,"line":660},[146,12708,1407],{"class":263},[146,12710,12711],{"class":148,"line":671},[146,12712,406],{"class":263},[146,12714,12715],{"class":148,"line":698},[146,12716,376],{"emptyLinePlaceholder":58},[146,12718,12719,12721,12723,12725,12727],{"class":148,"line":710},[146,12720,12204],{"class":263},[146,12722,267],{"class":259},[146,12724,12209],{"class":263},[146,12726,1626],{"class":160},[146,12728,764],{"class":263},[146,12730,12731,12733,12735,12737,12739,12741,12743,12745,12747],{"class":148,"line":716},[146,12732,6587],{"class":156},[146,12734,794],{"class":263},[146,12736,440],{"class":259},[146,12738,1524],{"class":160},[146,12740,685],{"class":156},[146,12742,688],{"class":263},[146,12744,691],{"class":156},[146,12746,449],{"class":160},[146,12748,406],{"class":263},[146,12750,12751,12753,12755],{"class":148,"line":722},[146,12752,12238],{"class":263},[146,12754,267],{"class":259},[146,12756,12243],{"class":263},[92,12758,12760],{"id":12759},"올바른-오비탈-레퍼런스-선택하기","올바른 오비탈 레퍼런스 선택하기",[11,12762,12763],{},"모든 오비탈 샷이 동일한 것은 아닙니다. 레퍼런스 비디오가 결과를 결정합니다:",[2035,12765,12766,12776],{},[2038,12767,12768],{},[2041,12769,12770,12773],{},[2044,12771,12772],{},"레퍼런스 품질",[2044,12774,12775],{},"결과 품질",[2051,12777,12778,12786,12794,12802],{},[2041,12779,12780,12783],{},[2056,12781,12782],{},"일정한 속도로 부드럽고 안정적인 회전",[2056,12784,12785],{},"깔끔하고 전문적인 오비탈",[2041,12787,12788,12791],{},[2056,12789,12790],{},"핸드헬드 흔들리는 회전",[2056,12792,12793],{},"오가닉한 다큐멘터리 스타일 오비트",[2041,12795,12796,12799],{},[2056,12797,12798],{},"빠른 휩 어라운드",[2056,12800,12801],{},"다이내믹하고 에너지 넘치는 리빌",[2041,12803,12804,12807],{},[2056,12805,12806],{},"느린 90도 부분 오비트",[2056,12808,12809],{},"섬세하고 드라마틱한 앵글 전환",[11,12811,12812],{},"원하는 에너지에 맞는 레퍼런스를 선택하세요. 턴테이블 제품 비디오는 기계적으로 매끄러운 회전을 제공합니다. 핸드헬드 워크 어라운드는 오가닉한 움직임을 제공합니다.",[45,12814],{},[48,12816,12818],{"id":12817},"고급-카메라-무브먼트와-다른-레퍼런스-결합하기","고급: 카메라 무브먼트와 다른 레퍼런스 결합하기",[11,12820,12821],{},"Seedance 2.0 레퍼런스 시스템의 진정한 위력은 카메라 무브먼트를 다른 입력 유형과 결합할 때 발휘됩니다. 단일 레퍼런스에 제한되지 않습니다 — 비디오 레퍼런스 최대 3개와 이미지 레퍼런스 최대 9개 (총 12개 파일)를 사용할 수 있습니다.",[92,12823,12825],{"id":12824},"카메라-캐릭터-스타일","카메라 + 캐릭터 + 스타일",[11,12827,12828],{},"세 가지 입력을 조합하는 예시입니다:",[97,12830,12831,12836,12841],{},[73,12832,12833,12835],{},[28,12834,11427],{}," — 카메라 무브먼트 (오비탈 샷)",[73,12837,12838,12840],{},[28,12839,2911],{}," — 캐릭터 외형 (특정 캐릭터 디자인)",[73,12842,12843,12845],{},[28,12844,2920],{}," — 스타일 레퍼런스 (특정 아트 스타일 또는 색상 팔레트)",[137,12847,12849],{"className":338,"code":12848,"language":340,"meta":142,"style":142},"# Advanced: Camera + Character + Style combination\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — smooth \"\n            \"rotation around the subject.\\n\\n\"\n            \"@Image1 is the character — maintain this character's \"\n            \"appearance exactly.\\n\\n\"\n            \"@Image2 is the visual style reference — match its color \"\n            \"palette, lighting mood, and artistic treatment.\\n\\n\"\n            \"Scene: The character from @Image1 stands in the center \"\n            \"of a grand cathedral. The orbital camera from @Video1 \"\n            \"slowly reveals the architecture. Visual style matches \"\n            \"@Image2 throughout.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character_design.png\",\n            \"https://your-cdn.com/art_style_reference.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/orbital_reference.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12850,12851,12856,12860,12868,12880,12890,12898,12908,12914,12919,12928,12933,12942,12947,12956,12961,12966,12971,12976,12980,12986,12993,12998,13002,13008,13013,13017,13027,13035,13039,13043,13047,13059,13079],{"__ignoreMap":142},[146,12852,12853],{"class":148,"line":149},[146,12854,12855],{"class":175},"# Advanced: Camera + Character + Style combination\n",[146,12857,12858],{"class":148,"line":167},[146,12859,376],{"emptyLinePlaceholder":58},[146,12861,12862,12864,12866],{"class":148,"line":179},[146,12863,6532],{"class":263},[146,12865,267],{"class":259},[146,12867,1432],{"class":263},[146,12869,12870,12872,12874,12876,12878],{"class":148,"line":188},[146,12871,6541],{"class":259},[146,12873,449],{"class":160},[146,12875,679],{"class":156},[146,12877,1444],{"class":160},[146,12879,452],{"class":263},[146,12881,12882,12884,12886,12888],{"class":148,"line":373},[146,12883,6554],{"class":701},[146,12885,267],{"class":259},[146,12887,423],{"class":156},[146,12889,452],{"class":263},[146,12891,12892,12894,12896],{"class":148,"line":379},[146,12893,6565],{"class":701},[146,12895,267],{"class":259},[146,12897,1864],{"class":263},[146,12899,12900,12902,12904,12906],{"class":148,"line":385},[146,12901,1303],{"class":160},[146,12903,437],{"class":263},[146,12905,1308],{"class":160},[146,12907,452],{"class":263},[146,12909,12910,12912],{"class":148,"line":409},[146,12911,1319],{"class":160},[146,12913,1322],{"class":263},[146,12915,12916],{"class":148,"line":420},[146,12917,12918],{"class":160},"            \"Replicate @Video1's orbital camera movement — smooth \"\n",[146,12920,12921,12924,12926],{"class":148,"line":431},[146,12922,12923],{"class":160},"            \"rotation around the subject.",[146,12925,12126],{"class":156},[146,12927,950],{"class":160},[146,12929,12930],{"class":148,"line":455},[146,12931,12932],{"class":160},"            \"@Image1 is the character — maintain this character's \"\n",[146,12934,12935,12938,12940],{"class":148,"line":466},[146,12936,12937],{"class":160},"            \"appearance exactly.",[146,12939,12126],{"class":156},[146,12941,950],{"class":160},[146,12943,12944],{"class":148,"line":600},[146,12945,12946],{"class":160},"            \"@Image2 is the visual style reference — match its color \"\n",[146,12948,12949,12952,12954],{"class":148,"line":605},[146,12950,12951],{"class":160},"            \"palette, lighting mood, and artistic treatment.",[146,12953,12126],{"class":156},[146,12955,950],{"class":160},[146,12957,12958],{"class":148,"line":611},[146,12959,12960],{"class":160},"            \"Scene: The character from @Image1 stands in the center \"\n",[146,12962,12963],{"class":148,"line":617},[146,12964,12965],{"class":160},"            \"of a grand cathedral. The orbital camera from @Video1 \"\n",[146,12967,12968],{"class":148,"line":623},[146,12969,12970],{"class":160},"            \"slowly reveals the architecture. Visual style matches \"\n",[146,12972,12973],{"class":148,"line":628},[146,12974,12975],{"class":160},"            \"@Image2 throughout.\"\n",[146,12977,12978],{"class":148,"line":639},[146,12979,1342],{"class":263},[146,12981,12982,12984],{"class":148,"line":654},[146,12983,2690],{"class":160},[146,12985,2693],{"class":263},[146,12987,12988,12991],{"class":148,"line":660},[146,12989,12990],{"class":160},"            \"https://your-cdn.com/character_design.png\"",[146,12992,452],{"class":263},[146,12994,12995],{"class":148,"line":671},[146,12996,12997],{"class":160},"            \"https://your-cdn.com/art_style_reference.jpg\"\n",[146,12999,13000],{"class":148,"line":698},[146,13001,2703],{"class":263},[146,13003,13004,13006],{"class":148,"line":710},[146,13005,12162],{"class":160},[146,13007,2693],{"class":263},[146,13009,13010],{"class":148,"line":716},[146,13011,13012],{"class":160},"            \"https://your-cdn.com/orbital_reference.mp4\"\n",[146,13014,13015],{"class":148,"line":722},[146,13016,2703],{"class":263},[146,13018,13019,13021,13023,13025],{"class":148,"line":728},[146,13020,1347],{"class":160},[146,13022,437],{"class":263},[146,13024,537],{"class":156},[146,13026,452],{"class":263},[146,13028,13029,13031,13033],{"class":148,"line":739},[146,13030,1363],{"class":160},[146,13032,437],{"class":263},[146,13034,8513],{"class":160},[146,13036,13037],{"class":148,"line":744},[146,13038,1407],{"class":263},[146,13040,13041],{"class":148,"line":750},[146,13042,406],{"class":263},[146,13044,13045],{"class":148,"line":767},[146,13046,376],{"emptyLinePlaceholder":58},[146,13048,13049,13051,13053,13055,13057],{"class":148,"line":788},[146,13050,12204],{"class":263},[146,13052,267],{"class":259},[146,13054,12209],{"class":263},[146,13056,1626],{"class":160},[146,13058,764],{"class":263},[146,13060,13061,13063,13065,13067,13069,13071,13073,13075,13077],{"class":148,"line":834},[146,13062,6587],{"class":156},[146,13064,794],{"class":263},[146,13066,440],{"class":259},[146,13068,1524],{"class":160},[146,13070,685],{"class":156},[146,13072,688],{"class":263},[146,13074,691],{"class":156},[146,13076,449],{"class":160},[146,13078,406],{"class":263},[146,13080,13081,13083,13085],{"class":148,"line":839},[146,13082,12238],{"class":263},[146,13084,267],{"class":259},[146,13086,12243],{"class":263},[92,13088,13090],{"id":13089},"레퍼런스-할당-전략","레퍼런스 할당 전략",[11,13092,13093],{},"여러 레퍼런스 유형을 혼합할 때는 12개 파일 예산을 전략적으로 배분하세요:",[2035,13095,13096,13111],{},[2038,13097,13098],{},[2041,13099,13100,13102,13105,13108],{},[2044,13101,8268],{},[2044,13103,13104],{},"비디오 레퍼런스",[2044,13106,13107],{},"이미지 레퍼런스",[2044,13109,13110],{},"오디오 레퍼런스",[2051,13112,13113,13125,13137,13148,13160],{},[2041,13114,13115,13118,13121,13123],{},[2056,13116,13117],{},"카메라 복제만",[2056,13119,13120],{},"1 (카메라)",[2056,13122,783],{},[2056,13124,783],{},[2041,13126,13127,13130,13132,13135],{},[2056,13128,13129],{},"카메라 + 캐릭터",[2056,13131,13120],{},[2056,13133,13134],{},"1 (캐릭터)",[2056,13136,783],{},[2041,13138,13139,13141,13143,13146],{},[2056,13140,12825],{},[2056,13142,13120],{},[2056,13144,13145],{},"2 (캐릭터 + 스타일)",[2056,13147,783],{},[2041,13149,13150,13153,13156,13158],{},[2056,13151,13152],{},"카메라 + 안무 + 캐릭터",[2056,13154,13155],{},"2 (카메라 + 댄스)",[2056,13157,13134],{},[2056,13159,783],{},[2041,13161,13162,13165,13167,13170],{},[2056,13163,13164],{},"풀 프로덕션",[2056,13166,13120],{},[2056,13168,13169],{},"3 (캐릭터 + 장면 + 스타일)",[2056,13171,13172],{},"1 (음악)",[11,13174,13175,13178],{},[23,13176,13177],{},"경험 법칙:"," 2~3개 레퍼런스로 시작하세요. 레퍼런스를 더 추가한다고 항상 결과가 좋아지는 것은 아닙니다 — 오히려 서로 충돌하는 신호를 만들 수 있습니다. 의도를 전달하는 데 필요한 최소한의 레퍼런스를 사용하세요.",[11,13180,13181,13182,1260],{},"멀티 레퍼런스 전략에 대한 자세한 내용은 ",[37,13183,11554],{"href":2969},[45,13185],{},[48,13187,13189],{"id":13188},"자주-하는-실수와-해결-방법","자주 하는 실수와 해결 방법",[92,13191,13193],{"id":13192},"실수-1-레퍼런스-대상을-지정하지-않는-경우","실수 1: 레퍼런스 대상을 지정하지 않는 경우",[11,13195,13196],{},[23,13197,13198],{},"나쁜 예:",[137,13200,13203],{"className":13201,"code":13202,"language":2183},[2181],"Use @Video1. A knight rides a horse through a valley.\n",[28,13204,13202],{"__ignoreMap":142},[11,13206,13207,13208,13210],{},"모델은 ",[28,13209,11427],{},"에서 카메라 무브먼트, 피사체 동작, 비주얼 스타일, 또는 모든 것을 원하는지 알 수 없습니다.",[11,13212,13213],{},[23,13214,13215],{},"좋은 예:",[137,13217,13220],{"className":13218,"code":13219,"language":2183},[2181],"Replicate @Video1's camera movement and tracking trajectory.\nA knight rides a horse through a green valley at sunrise.\n",[28,13221,13219],{"__ignoreMap":142},[92,13223,13225],{"id":13224},"실수-2-레퍼런스-비디오가-너무-길거나-복잡한-경우","실수 2: 레퍼런스 비디오가 너무 길거나 복잡한 경우",[11,13227,13228],{},"레퍼런스 비디오는 2~15초 길이여야 하며 깨끗하고 식별 가능한 카메라 무브먼트를 보여줘야 합니다. 세 가지 다른 카메라 기법(팬, 줌, 오비트)이 포함된 15초 클립은 혼란스러운 신호를 줍니다.",[11,13230,13231,13234],{},[23,13232,13233],{},"해결:"," 레퍼런스를 트리밍하여 원하는 특정 카메라 무브먼트만 분리하세요. 해당 기법의 가장 단순하고 깨끗한 예시를 사용하세요.",[92,13236,13238],{"id":13237},"실수-3-카메라-무브먼트와-피사체-움직임을-혼동하는-경우","실수 3: 카메라 무브먼트와 피사체 움직임을 혼동하는 경우",[11,13240,13241,13242,13245,13246,13249],{},"누군가가 춤추는 레퍼런스 비디오에는 두 가지 요소가 포함되어 있습니다: ",[2621,13243,13244],{},"카메라","가 어떻게 움직이는지와 ",[2621,13247,13248],{},"피사체","가 어떻게 움직이는지. 카메라 워크만 원한다면 명시적으로 말하세요:",[137,13251,13254],{"className":13252,"code":13253,"language":2183},[2181],"Replicate ONLY @Video1's camera movement — the pan speed, tracking\ntrajectory, and framing rhythm. Ignore the subject's actions.\n\nNew subject: a robot assembling car parts on a factory floor.\n",[28,13255,13253],{"__ignoreMap":142},[92,13257,13259],{"id":13258},"실수-4-프롬프트와-레퍼런스가-충돌하는-경우","실수 4: 프롬프트와 레퍼런스가 충돌하는 경우",[11,13261,13262],{},"레퍼런스가 느리고 부드러운 돌리 푸시인을 보여주는데 프롬프트에서 \"fast-paced action with rapid cuts\"라고 작성하면, 모델이 상반된 신호를 받게 됩니다.",[11,13264,13265,13267,13268,13271,13272,13275],{},[23,13266,13233],{}," 텍스트 프롬프트를 레퍼런스 비디오의 에너지와 일치시키세요. 프롬프트는 ",[2621,13269,13270],{},"콘텐츠","를 설명하고, 레퍼런스는 ",[2621,13273,13274],{},"기법","을 시연합니다.",[92,13277,13279],{"id":13278},"실수-5-첫-번째-시도에서-완벽한-결과를-기대하는-경우","실수 5: 첫 번째 시도에서 완벽한 결과를 기대하는 경우",[11,13281,13282],{},"카메라 복제는 정교한 작업입니다. 첫 번째 시도가 레퍼런스와 완벽하게 일치하지 않을 수 있습니다. 반복하세요:",[70,13284,13285,13288,13291,13294],{},[73,13286,13287],{},"간단한 프롬프트 + 깨끗한 레퍼런스로 시작합니다",[73,13289,13290],{},"출력을 검토합니다 — 카메라 무브먼트가 유사한가요?",[73,13292,13293],{},"부족한 부분에 대해 프롬프트 표현을 더 구체적으로 조정합니다",[73,13295,13296],{},"기법이 전이되지 않는다면 다른 레퍼런스 비디오를 시도합니다",[45,13298],{},[48,13300,13302],{"id":13301},"faq","FAQ",[92,13304,13306],{"id":13305},"한-비디오의-카메라-무브먼트와-다른-비디오의-안무를-결합할-수-있나요","한 비디오의 카메라 무브먼트와 다른 비디오의 안무를 결합할 수 있나요?",[11,13308,13309,13310,13312,13313,13315,13316,13319],{},"네. 두 개의 ",[28,13311,2961],{}," 레퍼런스를 사용하세요: ",[28,13314,11427],{},"은 카메라 무브먼트용, ",[28,13317,13318],{},"@Video2","는 안무/액션용입니다. 프롬프트에 \"Replicate @Video1's camera movement and @Video2's dance choreography\"라고 명시하세요. Seedance 2.0은 최대 3개의 비디오 레퍼런스를 동시에 지원합니다.",[92,13321,13323],{"id":13322},"카메라-레퍼런스에-가장-적합한-비디오-형식과-길이는-무엇인가요","카메라 레퍼런스에 가장 적합한 비디오 형식과 길이는 무엇인가요?",[11,13325,13326,13327,13330],{},"MP4 형식, 480p",[2429,13328,13329],{},"720p 해상도, 2","15초 재생 시간, 50MB 이하 파일 크기. 카메라 무브먼트 레퍼런스의 경우 짧은 것이 더 좋은 경우가 많습니다 — 단일 카메라 기법을 보여주는 깨끗한 3~5초 클립이 여러 기법이 포함된 긴 클립보다 더 안정적으로 전이됩니다.",[92,13332,13334],{"id":13333},"sora나-kling의-카메라-제어와-어떻게-다른가요","Sora나 Kling의 카메라 제어와 어떻게 다른가요?",[11,13336,13337,13338,13340],{},"Sora 2와 Kling 3.0은 텍스트 기반 카메라 방향 지정을 사용합니다 — 움직임을 텍스트로 묘사합니다 (\"dolly in,\" \"pan left\"). 결과는 모델이 텍스트를 얼마나 잘 해석하느냐에 달려 있습니다. Seedance 2.0은 레퍼런스 기반 카메라 제어를 사용합니다 — ",[28,13339,2961],{}," 태그를 통해 원하는 것을 모델에게 보여줍니다. 이 방식은 특히 히치콕 줌이나 원테이크 트래킹 샷처럼 텍스트로 묘사하기 어려운 복잡한 무브먼트에서 더 정밀하고 일관된 카메라 복제를 제공합니다.",[92,13342,13344],{"id":13343},"화면-녹화나-스마트폰-영상을-카메라-레퍼런스로-사용할-수-있나요","화면 녹화나 스마트폰 영상을 카메라 레퍼런스로 사용할 수 있나요?",[11,13346,13347],{},"네. 원하는 카메라 무브먼트를 보여주는 모든 비디오가 레퍼런스로 사용 가능합니다. 걸으면서 촬영한 스마트폰 영상은 핸드헬드 트래킹 샷을 생성합니다. 영화 클립의 화면 녹화는 해당 영화의 카메라 언어를 전이시킵니다. 모델은 프로덕션 품질에 관계없이 카메라 동작을 추출합니다.",[92,13349,13351],{"id":13350},"카메라-복제가-이미지-투-비디오-생성과-함께-작동하나요","카메라 복제가 이미지-투-비디오 생성과 함께 작동하나요?",[11,13353,13354,13355,13357,13358,13360],{},"네. ",[28,13356,11427],{}," (카메라 무브먼트 레퍼런스)과 ",[28,13359,2911],{}," (첫 번째 프레임 / 캐릭터)을 결합하여 이미지에서 시작하고 비디오 레퍼런스에 따라 카메라를 움직이는 비디오를 생성할 수 있습니다. 이 방법은 제품 비디오와 캐릭터 소개에 매우 유용합니다.",[45,13362],{},[48,13364,13366],{"id":13365},"어떤-카메라-무브먼트든-복제를-시작하세요","어떤 카메라 무브먼트든 복제를 시작하세요",[11,13368,13369,13370,13372],{},"카메라 무브먼트는 더 이상 장비나 전문 기술에 의해 제한되지 않습니다. 레퍼런스 비디오와 Seedance 2.0의 ",[28,13371,2961],{}," 태그 시스템을 사용하면, 섬세한 랙 포커스 풀부터 완전한 히치콕 줌까지 — 어떤 카메라 기법이든 복제하여 설명 가능한 모든 콘텐츠에 적용할 수 있습니다.",[11,13374,13375],{},"이 튜토리얼의 세 가지 사례는 가장 많이 요청되는 카메라 기법을 다룹니다:",[97,13377,13378,13384,13390],{},[73,13379,13380,13383],{},[23,13381,13382],{},"원테이크 트래킹"," — 몰입감 있는 연속 움직임",[73,13385,13386,13389],{},[23,13387,13388],{},"돌리 줌"," — 드라마틱한 긴장감과 심리적 효과",[73,13391,13392,13395],{},[23,13393,13394],{},"오비탈 샷"," — 캐릭터 리빌과 제품 소개",[11,13397,13398],{},"각각 동일한 방식으로 작동합니다: 레퍼런스를 업로드하고, 태그를 지정하고, 장면을 설명하고, 카메라는 모델에게 맡기세요.",[11,13400,9056,13401,13405],{},[37,13402,13404],{"href":212,"rel":13403},[41],"무료 EvoLink API 키를 발급받고"," 정밀한 카메라 제어로 시네마틱 AI 비디오를 생성해 보세요.",[45,13407],{},[11,13409,13410],{},[2621,13411,13412],{},"관련 읽을거리:",[97,13414,13415,13425],{},[73,13416,13417,13420,13421,13424],{},[37,13418,13419],{"href":1766},"Seedance 2.0 프롬프트: 멀티모달 비디오 생성 완벽 가이드"," — 복잡한 장면을 위한 ",[37,13422,13423],{"href":1766},"숏-스크립트 프롬프팅 포맷","을 마스터하세요",[73,13426,13427,13430,13431,13434],{},[37,13428,13429],{"href":2969},"Seedance 2.0 멀티모달 레퍼런스: @Tags 완벽 가이드"," — 전체 ",[37,13432,13433],{"href":2969},"@tag 레퍼런스 시스템","에 대한 심층 가이드",[45,13436],{},[11,13438,13439],{},[2621,13440,13441],{},"최종 업데이트: 2026년 2월 20일 | 작성자: J, EvoLink Growth Lead",[11222,13443,13444],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":142,"searchDepth":167,"depth":167,"links":13446},[13447,13448,13452,13457,13463,13469,13475,13479,13486,13493],{"id":11360,"depth":167,"text":11361},{"id":11408,"depth":167,"text":11409,"children":13449},[13450,13451],{"id":11421,"depth":179,"text":11422},{"id":11463,"depth":179,"text":11464},{"id":11559,"depth":167,"text":11560,"children":13453},[13454,13455,13456],{"id":11563,"depth":179,"text":11564},{"id":11590,"depth":179,"text":11591},{"id":11606,"depth":179,"text":11607},{"id":11976,"depth":167,"text":11977,"children":13458},[13459,13460,13461,13462],{"id":11986,"depth":179,"text":11986},{"id":12005,"depth":179,"text":12005},{"id":12039,"depth":179,"text":12040},{"id":12246,"depth":179,"text":12247},{"id":12275,"depth":167,"text":12276,"children":13464},[13465,13466,13467,13468],{"id":12285,"depth":179,"text":11986},{"id":12298,"depth":179,"text":12005},{"id":12307,"depth":179,"text":12040},{"id":12512,"depth":179,"text":12513},{"id":12530,"depth":167,"text":12531,"children":13470},[13471,13472,13473,13474],{"id":12537,"depth":179,"text":11986},{"id":12550,"depth":179,"text":12005},{"id":12559,"depth":179,"text":12040},{"id":12759,"depth":179,"text":12760},{"id":12817,"depth":167,"text":12818,"children":13476},[13477,13478],{"id":12824,"depth":179,"text":12825},{"id":13089,"depth":179,"text":13090},{"id":13188,"depth":167,"text":13189,"children":13480},[13481,13482,13483,13484,13485],{"id":13192,"depth":179,"text":13193},{"id":13224,"depth":179,"text":13225},{"id":13237,"depth":179,"text":13238},{"id":13258,"depth":179,"text":13259},{"id":13278,"depth":179,"text":13279},{"id":13301,"depth":167,"text":13302,"children":13487},[13488,13489,13490,13491,13492],{"id":13305,"depth":179,"text":13306},{"id":13322,"depth":179,"text":13323},{"id":13333,"depth":179,"text":13334},{"id":13343,"depth":179,"text":13344},{"id":13350,"depth":179,"text":13351},{"id":13365,"depth":167,"text":13366},"Seedance 2.0 API를 사용하여 히치콕 줌, 원테이크 트래킹 샷, 오비탈 카메라를 복제하는 방법을 배워보세요. @Video 태그를 활용한 3가지 완전한 Python 예제를 제공합니다.",{"date":13496,"image":11314,"seoTitle":13497},"2026-02-20","Seedance 2.0 API로 카메라 무브먼트 복제하기 | 튜토리얼","/ko/blog/seedance-2-camera-movement-api",{"title":11296,"description":13494},"ko/blog/seedance-2-camera-movement-api","wQvNrznb9uuarDv9vYKUlQlkUHZ83A7tfjTfbOFESaQ",{"id":13503,"title":13504,"body":13505,"description":17384,"extension":11284,"meta":17385,"navigation":58,"path":17390,"seo":17391,"stem":17392,"__hash__":17393},"content/ko/blog/seedance-2-copyright-api-guide.md","Seedance 2.0 저작권 논란: API 개발자가 반드시 알아야 할 사항",{"type":8,"value":13506,"toc":17339},[13507,13510,13513,13517,13520,13523,13527,13539,13542,13554,13569,13572,13576,13592,13600,13620,13628,13645,13653,13672,13680,13684,13687,13724,13732,13736,13739,13743,13746,13754,13757,13761,13764,13770,13776,13782,13788,13801,13805,13808,13931,13934,13937,13941,13944,13947,13950,13953,13957,13960,13964,13979,14005,14009,14012,14018,14024,14030,14036,14039,14043,14046,14052,14058,14064,14070,14087,14093,14099,14107,14111,14117,14120,14124,14127,14132,14135,14138,14141,14146,14149,14166,14169,14173,14273,14277,14280,14368,14376,14394,14398,14404,14407,14411,14414,14515,14518,14522,14525,14595,14599,14602,14622,14625,14645,14648,14652,14655,15079,15082,15308,15311,15315,15323,15443,15448,15456,15460,15463,16120,16125,16129,16146,16149,16153,16156,16165,16280,16285,16289,16295,16464,16468,16484,16488,16491,16674,16680,16695,16699,16702,17117,17121,17124,17127,17133,17135,17139,17152,17154,17161,17165,17168,17172,17179,17183,17186,17264,17270,17272,17276,17279,17282,17314,17317,17331,17336],[11,13508,13509],{},"Seedance 2.0 API 출시가 보류되었습니다. 원래 2026년 2월 24일로 예정되어 있었지만, 헐리우드 5대 메이저 스튜디오가 바이트댄스(ByteDance)에 경고장을 발송했고, 미국영화협회(MPA)는 Seedance 2.0을 \"체계적 침해를 위해 만들어진 기계\"라고 규정했습니다. 이제 이 모델을 기반으로 개발 중인 개발자들은 출시 일정, 법적 리스크, 상업적 타당성에 대한 현실적인 질문에 직면하고 있습니다.",[11,13511,13512],{},"Seedance 2.0을 영상 생성 파이프라인에 통합하고 있다면, 이 가이드에서 필요한 모든 정보를 다룹니다. 저작권 분쟁의 전체 타임라인, 헐리우드가 이 모델을 특별히 겨냥하는 이유, API 출시 연기가 실무에 미치는 영향, 상업 프로젝트를 보호하는 방법, 코드 예제를 포함한 안전한 프롬프트 엔지니어링 전략, 그리고 상황이 해결될 때까지 통합 멀티모델 API를 통해 파이프라인을 계속 운영하는 방법까지 모두 설명합니다.",[48,13514,13516],{"id":13515},"사건-경과-seedance-20-저작권-분쟁-타임라인","사건 경과: Seedance 2.0 저작권 분쟁 타임라인",[11,13518,13519],{},"Seedance 2.0 저작권 위기는 하루아침에 발생한 것이 아닙니다. 하지만 한번 시작되자 놀라울 정도로 빠르게 격화되었습니다. 2026년 2월 단 한 주 만에, 바이트댄스는 비공식적인 불만 접수 단계에서 헐리우드 모든 메이저 스튜디오의 조직적인 법적 조치에 직면하는 상황까지 치달았습니다.",[11,13521,13522],{},"다음은 주요 언론 보도를 바탕으로 정리한 검증된 타임라인입니다.",[92,13524,13526],{"id":13525},"_1주차-반발의-확산-2월-1416일","1주차: 반발의 확산 (2월 14~16일)",[11,13528,13529,13532,13533,13538],{},[23,13530,13531],{},"2026년 2월 15일"," -- ",[37,13534,13537],{"href":13535,"rel":13536},"https://techcrunch.com",[41],"TechCrunch 보도","에 따르면, 헐리우드 스튜디오들이 Seedance 2.0의 성능에 \"불만을 표하고 있습니다.\" 해당 기사는 이 모델이 저작권이 있는 영화와 TV 프로그램과 유사한 영상 콘텐츠를 생성할 수 있다는 점을 상세히 다루었습니다. 이 시점에서는 아직 비공식적인 불만 단계로, 법적 조치는 취해지지 않았지만 어조는 날카로웠습니다.",[11,13540,13541],{},"발단은 소셜 미디어에 올라온 일련의 게시물이었습니다. Seedance 2.0이 알아볼 수 있는 디즈니 캐릭터, 마블 슈퍼히어로, 특정 영화를 명백히 모방한 장면을 생성하는 모습이 퍼져나갔습니다. 이 시연 영상들이 바이럴되면서 헐리우드가 주목하기 시작했습니다.",[11,13543,13544,13547,13548,13553],{},[23,13545,13546],{},"2026년 2월 16일"," -- 이 사건이 여러 매체를 통해 본격적으로 보도되기 시작했습니다. ",[37,13549,13552],{"href":13550,"rel":13551},"https://www.cnbc.com",[41],"CNBC 보도","에 따르면, 바이트댄스가 우려를 인정하고 Seedance 2.0에 안전장치를 추가하겠다고 약속했습니다. 가장 주목할 만한 발언은 MPA CEO 찰스 리브킨(Charles Rivkin)의 것으로, 이 상황을 \"대규모 무단 사용\"이라고 규정했습니다.",[11,13555,13556,13557,13562,13563,13568],{},"같은 날, ",[37,13558,13561],{"href":13559,"rel":13560},"https://www.aljazeera.com",[41],"알자지라(Al Jazeera)","가 바이트댄스의 공식 개선 약속을 보도했고, ",[37,13564,13567],{"href":13565,"rel":13566},"https://www.nbcnews.com",[41],"NBC News","도 바이트댄스의 대응을 보도했습니다. 바이트댄스의 성명은 매우 신중하게 작성되었습니다. 우려 사항을 인정하면서도 잘못을 시인하지 않았고, \"강화된 콘텐츠 보호 조치\"를 약속하면서도 구체적인 내용이나 시기는 명시하지 않았습니다.",[11,13570,13571],{},"이 시점에서 많은 개발자들은 이것이 약간의 PR 관리와 소소한 제품 수정으로 지나갈 전형적인 IT 업계 논란이라고 생각했습니다. 그러나 그렇지 않았습니다.",[92,13573,13575],{"id":13574},"_2주차-조직적-법적-대응-2월-2022일","2주차: 조직적 법적 대응 (2월 20~22일)",[11,13577,13578,13581,13582,13587,13588,13591],{},[23,13579,13580],{},"2026년 2월 20일"," -- 상황이 PR 문제에서 법적 위기로 격화되었습니다. ",[37,13583,13586],{"href":13584,"rel":13585},"https://www.axios.com",[41],"Axios 보도","에 따르면, 디즈니, 워너브라더스 디스커버리(Warner Bros. Discovery), 파라마운트(Paramount), 넷플릭스(Netflix), 소니(Sony) 등 5개 스튜디오가 바이트댄스에 ",[23,13589,13590],{},"개별"," 경고장을 발송했습니다. 이것은 중요한 부분입니다. MPA를 통한 공동 서한이 아닙니다(그것은 나중에 따로 옵니다). 각 스튜디오의 법무팀이 독자적으로 Seedance 2.0이 직접적인 법적 조치를 취할 만큼 심각한 위협이라고 판단한 것입니다.",[11,13593,13594,13599],{},[37,13595,13598],{"href":13596,"rel":13597},"https://copyrightlately.com",[41],"Copyright Lately"," 보도에 따르면, 이 경고장의 표현은 초기 중지 요청서로서는 이례적으로 공격적이었습니다.",[97,13601,13602,13608,13614],{},[73,13603,13604,13607],{},[23,13605,13606],{},"디즈니","는 Seedance 2.0을 저작권 콘텐츠에 대한 \"가상 약탈(virtual smash-and-grab)\"이라고 표현했습니다. 이는 사고가 아닌 의도적인 절도로 프레이밍한 것입니다",[73,13609,13610,13613],{},[23,13611,13612],{},"파라마운트","는 Seedance 2.0의 출력물이 자사 저작물과 \"구별할 수 없다(indistinguishable)\"고 진술했습니다. 이는 침해 소송을 뒷받침할 수 있는 법적으로 중요한 주장입니다",[73,13615,13616,13619],{},[23,13617,13618],{},"워너브라더스 디스커버리, 넷플릭스, 소니"," 또한 유사하게 강경한 표현으로 각각 경고장을 발송했습니다",[11,13621,13622,13627],{},[37,13623,13626],{"href":13624,"rel":13625},"https://reddit.com/r/comfyui",[41],"Reddit r/comfyui (2/20)"," 커뮤니티에서는 딥페이크 및 저작권 문제로 인해 예정된 API 출시가 연기되었다는 보고가 올라오기 시작했습니다. 개발자 포럼에서는 일정과 파급효과에 대한 논의가 활발해졌습니다.",[11,13629,13630,13633,13634,2962,13639,13644],{},[23,13631,13632],{},"2026년 2월 21일"," -- MPA가 업계의 공식 입장을 발표했습니다. ",[37,13635,13638],{"href":13636,"rel":13637},"https://www.hollywoodreporter.com",[41],"The Hollywood Reporter",[37,13640,13643],{"href":13641,"rel":13642},"https://variety.com",[41],"Variety"," 모두 MPA가 바이트댄스에 자체 경고장을 발송하며 Seedance 2.0을 \"체계적 침해\" 도구라고 규정했다고 보도했습니다. 이는 5개 스튜디오를 포함한 업계 무역협회가 개별 스튜디오의 조치에 기관의 무게를 더한 것입니다.",[11,13646,13647,13652],{},[37,13648,13651],{"href":13649,"rel":13650},"https://news.ycombinator.com",[41],"Hacker News (2/21)"," 논의에서는 API 출시가 공식적으로 연기되었으며, 바이트댄스가 출시 전 \"사전 안전장치\"를 추가하고 있다는 것이 확인되었습니다.",[11,13654,13655,13532,13658,13663,13664,13667,13668,13671],{},[23,13656,13657],{},"2026년 2월 22일",[37,13659,13662],{"href":13660,"rel":13661},"https://the-decoder.com",[41],"The Decoder 보도","에서 MPA가 Seedance 2.0을 \"체계적 침해를 위해 만들어진 기계\"로 규정했다는 전문이 공개되었습니다. MPA 변호사들이 신중하게 선택한 이 표현은, 이 도구가 침해에 ",[2621,13665,13666],{},"사용될 수 있다","는 주장을 넘어 침해를 위해 ",[2621,13669,13670],{},"설계되었다","고 주장하는 것으로, 소송으로 이어질 경우 중대한 법적 함의를 가집니다.",[11,13673,13556,13674,13679],{},[37,13675,13678],{"href":13676,"rel":13677},"https://www.chosun.com",[41],"조선일보","는 바이트댄스가 저작권 분쟁으로 인해 Seedance 2.0 API 출시를 공식 연기했다고 보도했습니다. 이는 바이트댄스 내부 소식통을 가진 언론에서 API 일정 변경이 단순한 개발 지연이 아닌 법적 조치로 인한 것이라고 직접 확인한 첫 사례입니다.",[92,13681,13683],{"id":13682},"현재-상황-2026년-2월-23일","현재 상황 (2026년 2월 23일)",[11,13685,13686],{},"현재 기준:",[97,13688,13689,13696,13702,13711,13718],{},[73,13690,13691,13692,13695],{},"디즈니, 워너브라더스 디스커버리, 파라마운트, 넷플릭스, 소니로부터 ",[23,13693,13694],{},"5건의 개별 경고장"," 발송",[73,13697,13698,13699,13695],{},"MPA의 ",[23,13700,13701],{},"기관 차원 경고장 1건",[73,13703,13704,13707,13708],{},[23,13705,13706],{},"API 출시","가 2월 24일에서 미정으로 ",[23,13709,13710],{},"연기",[73,13712,13713,13714,13717],{},"바이트댄스가 ",[23,13715,13716],{},"안전장치 구현을 약속","했으나 구체적인 구현 내용이나 일정은 미공개",[73,13719,13720,13723],{},[23,13721,13722],{},"아직 소송은 제기되지 않음"," -- 다만 경고장은 요구가 충족되지 않을 경우 소송의 전 단계",[18,13725,13726],{},[11,13727,13728,13731],{},[23,13729,13730],{},"개발자를 위한 핵심 요약:"," 이것은 빠르게 해결될 사소한 PR 이슈가 아닙니다. 법적 대응의 조직적 성격 -- 5개 스튜디오와 MPA의 공동 대응 -- 은 바이트댄스가 API 출시 전에 실질적인 변경을 해야 한다는 막대한 압박에 직면해 있음을 의미합니다. 이에 맞게 계획을 세우십시오.",[48,13733,13735],{"id":13734},"헐리우드가-seedance-20을-특별히-겨냥하는-이유","헐리우드가 Seedance 2.0을 특별히 겨냥하는 이유",[11,13737,13738],{},"다른 AI 영상 생성 도구도 존재합니다 -- Kling, Sora, Veo, Runway Gen-3, Pika 등. 그런데 왜 Seedance 2.0이 이 정도 수준의 법적 공격을 받는 것일까요? 그 답은 헐리우드 콘텐츠에 유독 위협적인 특정 역량 조합, 출력 품질, 부재한 안전장치에 있습니다.",[92,13740,13742],{"id":13741},"학습-데이터-문제","학습 데이터 문제",[11,13744,13745],{},"모든 경고장의 핵심에 있는 주장은 Seedance 2.0이 허가 없이 저작권이 있는 영화 및 TV 콘텐츠로 학습되었다는 것입니다. 이는 Seedance만의 문제가 아닙니다. 거의 모든 대규모 생성형 모델이 유사한 의문에 직면합니다. 하지만 MPA의 표현으로 미루어 볼 때, 바이트댄스의 학습 데이터셋이 헐리우드 콘텐츠를 특히 많이 포함하고 있다고 판단하는 것으로 보입니다.",[11,13747,13748,13749,13753],{},"MPA CEO 리브킨의 \"대규모 무단 사용\"(",[37,13750,13752],{"href":13550,"rel":13751},[41],"CNBC, 2/16",")이라는 표현은, 스튜디오들이 학습 데이터 구성에 대한 증거(또는 최소한 강한 추정)를 가지고 있음을 시사합니다. 디즈니의 \"약탈\" 표현은 이것이 우연이 아닌 의도적이라고 판단하고 있음을 보여줍니다.",[11,13755,13756],{},"학습 데이터 문제가 Seedance 2.0에 특히 첨예한 이유는 바이트댄스가 중국 기술 기업이라는 점입니다. 바이트댄스는 틱톡(TikTok)을 운영하며, 틱톡에는 수십억 개의 클립이 호스팅되어 있고 그 중 상당수는 사용자가 업로드한 저작권 콘텐츠입니다. 스튜디오들은 (공식적으로 확인되지는 않았지만) Seedance 2.0의 학습 데이터에 틱톡의 방대한 사용자 업로드 영화 클립, TV 영상, 뮤직비디오 라이브러리가 포함되었을 것으로 의심할 수 있습니다.",[92,13758,13760],{"id":13759},"출력-정밀도-문제","출력 정밀도 문제",[11,13762,13763],{},"Seedance 2.0이 기존 AI 영상 도구와 차별화되는 것은 ��력 품질, 특히 헐리우드에 가장 중요한 영역에서의 품질입니다. 이 모델은 저작권 침해를 용이하게 만드는 바로 그 역량에서 탁월합니다.",[11,13765,13766,13769],{},[23,13767,13768],{},"장면 간 캐릭터 일관성."," Seedance 2.0은 영상 전체에 걸쳐 일관된 캐릭터 외형을 유지합니다 -- 같은 얼굴, 같은 의상, 같은 비율. 이전 모델들은 프레임 간에 캐릭터 외형이 변하는 경우가 많았습니다. 이 일관성 덕분에 사용자가 저작권 캐릭터를 담은 콘텐츠를 생성하면, 해당 캐릭터가 한 프레임이 아닌 영상 전체에서 해당 캐릭터로 보입니다.",[11,13771,13772,13775],{},[23,13773,13774],{},"정밀한 표정 및 감정 제어."," 이 모델은 미묘한 감정 연기를 생성할 수 있습니다 -- 놀람에서 기쁨으로, 또는 차분함에서 공포로의 전환. 이를 통해 저작권 캐릭터의 기존 성격에 맞는 새로운 \"연기\"를 만들어낼 수 있습니다.",[11,13777,13778,13781],{},[23,13779,13780],{},"시네마틱 카메라 워크."," Seedance 2.0은 특정 촬영 기법을 재현합니다. 히치콕 줌, 트래킹 샷, 크레인 무빙, 원테이크 시퀀스 등. 이는 헐리우드 영화 제작의 시각적 특징이며, 이 모델은 높은 정밀도로 이를 재현할 수 있습니다.",[11,13783,13784,13787],{},[23,13785,13786],{},"네이티브 오디오 생성."," 대부분의 경쟁 모델과 달리, Seedance 2.0은 영상과 함께 동기화된 오디오 -- 대사, 효과음, 음악 -- 를 생성합니다. 즉, 생성된 콘텐츠는 단순한 시각적 복제가 아니라 캐릭터 음성을 포함할 수 있는 완전한 시청각 작품입니다.",[11,13789,13790,2424,13793,13796,13797,13800],{},[23,13791,13792],{},"멀티모달 레퍼런스.",[28,13794,13795],{},"@-reference"," 시스템을 통해 사용자는 이미지, 영상, 오디오를 창작 레퍼런스로 업로드할 수 있습니다. 사용자가 저작권 캐릭터의 이미지와 특정 카메라 동선을 보여주는 클립을 업로드하면, 모델이 둘을 결합하여 새로운 콘텐츠를 만들어냅니다. 이 시스템에 대한 자세한 내용은 ",[37,13798,13799],{"href":2969},"@태그 멀티모달 가이드","를 참고하세요.",[92,13802,13804],{"id":13803},"부재한-안전장치","부재한 안전장치",[11,13806,13807],{},"출시 당시 Seedance 2.0에는 최소한의 콘텐츠 필터링만 적용되어 있었습니다. 사용자들은 시스템 차원의 개입 없이 디즈니 캐릭터, 마블 히어로, 스타워즈 장면 등 보호된 지적재산(IP)이 포함된 영상을 자유롭게 생성할 수 있었습니다. 이는 경쟁 모델들과 뚜렷한 대조를 이룹니다.",[2035,13809,13810,13833],{},[2038,13811,13812],{},[2041,13813,13814,13817,13821,13824,13827,13830],{},[2044,13815,13816],{},"플랫폼",[2044,13818,13820],{"align":13819},"center","저작권 필터",[2044,13822,13823],{"align":13819},"캐릭터 차단",[2044,13825,13826],{"align":13819},"유명인 감지",[2044,13828,13829],{"align":13819},"워터마크",[2044,13831,13832],{"align":13819},"콘텐츠 정책",[2051,13834,13835,13852,13869,13884,13901,13916],{},[2041,13836,13837,13840,13843,13845,13847,13849],{},[2056,13838,13839],{},"Seedance 2.0 (출시 시점)",[2056,13841,13842],{"align":13819},"❌",[2056,13844,13842],{"align":13819},[2056,13846,13842],{"align":13819},[2056,13848,13842],{"align":13819},[2056,13850,13851],{"align":13819},"최소한",[2041,13853,13854,13857,13860,13862,13864,13866],{},[2056,13855,13856],{},"OpenAI Sora",[2056,13858,13859],{"align":13819},"✅",[2056,13861,13859],{"align":13819},[2056,13863,13859],{"align":13819},[2056,13865,13859],{"align":13819},[2056,13867,13868],{"align":13819},"엄격",[2041,13870,13871,13874,13876,13878,13880,13882],{},[2056,13872,13873],{},"Google Veo 2",[2056,13875,13859],{"align":13819},[2056,13877,13859],{"align":13819},[2056,13879,13859],{"align":13819},[2056,13881,13859],{"align":13819},[2056,13883,13868],{"align":13819},[2041,13885,13886,13889,13892,13894,13896,13898],{},[2056,13887,13888],{},"Runway Gen-3",[2056,13890,13891],{"align":13819},"부분적",[2056,13893,13891],{"align":13819},[2056,13895,13842],{"align":13819},[2056,13897,13859],{"align":13819},[2056,13899,13900],{"align":13819},"보통",[2041,13902,13903,13906,13908,13910,13912,13914],{},[2056,13904,13905],{},"Kling",[2056,13907,13891],{"align":13819},[2056,13909,13842],{"align":13819},[2056,13911,13891],{"align":13819},[2056,13913,13859],{"align":13819},[2056,13915,13900],{"align":13819},[2041,13917,13918,13921,13923,13925,13927,13929],{},[2056,13919,13920],{},"Pika",[2056,13922,13891],{"align":13819},[2056,13924,13842],{"align":13819},[2056,13926,13842],{"align":13819},[2056,13928,13859],{"align":13819},[2056,13930,13900],{"align":13819},[11,13932,13933],{},"OpenAI와 Google은 영상 모델 출시 전에 콘텐츠 안전 시스템에 대규모 투자를 했습니다. Sora에는 여러 겹의 필터링이 적용되어 있습니다. 저작권 캐릭터 이름을 언급하는 프롬프트 차단, 실제 공인과 닮은 생성 얼굴 감지, 가시적/비가시적 워터마크 적용, 경계 사례에 대한 사람의 검토 프로세스 등입니다.",[11,13935,13936],{},"바이트댄스는 Seedance 2.0 초기 릴리스에서 안전보다 성능을 우선시한 것으로 보입니다. 그 결과, 헐리우드 자체 IP로 헐리우드 수준의 콘텐츠를 생성할 수 있는 모델이 아무런 제한 없이 공개된 것입니다.",[92,13938,13940],{"id":13939},"다른-ai-영상-도구가-유사한-조치를-받지-않은-이유","다른 AI 영상 도구가 유사한 조치를 받지 않은 이유",[11,13942,13943],{},"간단한 답: 상대적으로 낮은 출력 품질, 강력한 안전 필터, 그리고 협상이 용이한 미국 내 법적 존재감의 조합 때문입니다.",[11,13945,13946],{},"Sora와 Veo는 모두 미국 기업(OpenAI와 Google)이 제작한 것으로, 확립된 법무팀과 콘텐츠 권리자와의 기존 관계를 보유하고 있습니다. 이들 기업은 선제적으로 권리자와 소통하고, 강력한 콘텐츠 필터링을 구현했으며, 일부 경우에는 라이선스 계약을 추진했습니다.",[11,13948,13949],{},"Runway와 Kling은 일부 비판을 받았지만, 헐리우드 변호사들이 존재적 위협으로 간주할 만큼의 출력 정밀도 임계점에 도달하지 못했습니다. Seedance 2.0은 그 임계점을 넘었습니다.",[11,13951,13952],{},"최고 수준의 출력 정밀도, 부재한 안전장치, 미국 관할권 밖에 위치한 모회사의 조합이 법적 조치의 완벽한 조건을 만들었습니다.",[48,13954,13956],{"id":13955},"api-출시-연기-현재까지-알려진-사항","API 출시 연기: 현재까지 알려진 사항",[11,13958,13959],{},"Seedance 2.0 API는 원래 2026년 2월 24일 공개 출시 예정이었습니다. 이 일정이 새로운 확정 일자 없이 연기되었습니다.",[92,13961,13963],{"id":13962},"바이트댄스가-약속한-내용","바이트댄스가 약속한 내용",[11,13965,13966,13967,400,13971,400,13974,13978],{},"법적 압박에 대응하여, 바이트댄스는 API 출시 전에 여러 안전장치를 구현하겠다고 약속했습니다. ",[37,13968,13970],{"href":13550,"rel":13969},[41],"CNBC (2/16)",[37,13972,13651],{"href":13649,"rel":13973},[41],[37,13975,13977],{"href":13559,"rel":13976},[41],"알자지라 (2/16)","의 보도를 종합하면 다음과 같습니다.",[97,13980,13981,13987,13993,13999],{},[73,13982,13983,13986],{},[23,13984,13985],{},"얼굴 감지 및 차단"," -- 인식 가능한 실존 인물의 생성을 방지합니다. 배우, 공인, 그리고 잠재적으로 학습 데이터에 얼굴이 포함된 모든 실제 개인이 대상입니다. 시스템은 생성된 얼굴을 알려진 인물 데이터베이스와 비교해야 합니다.",[73,13988,13989,13992],{},[23,13990,13991],{},"저작권 캐릭터 차단"," -- 알려진 IP를 참조하는 프롬프트를 차단합니다. 이는 텍스트 수준 필터링(\"Spider-Man\"이나 \"Elsa\" 감지)과 시각 수준 감지(업로드된 저작권 캐릭터 레퍼런스 이미지 감지) 모두를 의미합니다. 대규모로 구현하기에는 기술적으로 복잡합니다.",[73,13994,13995,13998],{},[23,13996,13997],{},"워터마킹"," -- 출처 추적을 위해 모든 생성 콘텐츠에 비가시적 워터마크를 추가합니다. 이를 통해 권리자가 AI 생성 콘텐츠를 식별하고, 플랫폼과 잠재적으로 생성한 사용자까지 추적할 수 있습니다.",[73,14000,14001,14004],{},[23,14002,14003],{},"콘텐츠 유사도 감지"," -- 특정 저작물과 유사한 콘텐츠 생성을 방지하는 포괄적 필터링입니다. 생성된 프레임을 저작물 데이터베이스와 비교하는 방식이 될 수 있으며, 연산 비용은 높지만 법적으로 필수적입니다.",[92,14006,14008],{"id":14007},"구현의-어려움","구현의 어려움",[11,14010,14011],{},"이러한 안전장치는 구현이 간단하지 않습니다. 각각 상당한 엔지니어링이 필요합니다.",[11,14013,14014,14017],{},[23,14015,14016],{},"텍스트 수준 필터링","은 가장 쉽습니다 -- 캐릭터 이름, 프랜차이즈 이름, 상표명의 차단 목록을 관리하면 됩니다. 하지만 가장 우회하기도 쉽습니다(\"둥근 귀에 빨간 반바지를 입은 쥐\").",[11,14019,14020,14023],{},[23,14021,14022],{},"시각 수준 감지","는 더 어렵습니다. 시스템은 간접적으로 묘사된 저작권 캐릭터도 인식해야 하고, 생성된 출력이 특정 저작물과 닮은 경우도 감지해야 합니다. 이를 위해서는 저작물 자체에 대해 별도의 감지 모델을 학습시켜야 하며, 이것 자체가 라이선스 문제를 야기합니다.",[11,14025,14026,14029],{},[23,14027,14028],{},"얼굴 인식"," 기반의 유명인/배우 차단에는 종합적인 얼굴 데이터베이스와 생성 중 실시간 비교가 필요합니다. 다양한 각도, 조명 조건, 아트 스타일을 모두 처리해야 합니다.",[11,14031,14032,14033,14035],{},"압축, 크롭, 포맷 변환에도 살아남는 ",[23,14034,13997],{},"은 현재 활발한 연구 분야입니다. 바이트댄스는 시청자에게는 보이지 않으면서도 일반적인 소셜 미디어 유통 과정의 처리를 견딜 수 있을 만큼 견고한 워터마크가 필요합니다.",[11,14037,14038],{},"MPA는 형식적인 점검만으로는 만족하지 않을 것입니다. 이 안전장치들은 실제로 작동해야 하며, 그것을 검증하는 데는 시간이 걸립니다.",[92,14040,14042],{"id":14041},"개발자에게-당장-미치는-영향","개발자에게 당장 미치는 영향",[11,14044,14045],{},"Seedance 2.0 API를 기반으로 개발해왔다면, 이번 연기로 인해 여러 가지 당장의 실질적 문제가 발생합니다.",[11,14047,14048,14051],{},[23,14049,14050],{},"1. 확정된 출시일 없음."," 바이트댄스는 새로운 일정을 발표하지 않았습니다. 안전장치가 5개 메이저 스튜디오와 MPA의 법무팀을 만족시켜야 하는데, 이는 빠른 과정이 아닙니다. 안전장치 요구 수준에 따라 현실적으로 수 주에서 수 개월이 소요될 것으로 예상됩니다.",[11,14053,14054,14057],{},[23,14055,14056],{},"2. API 동작이 변경됨."," 콘텐츠 필터링 추가로 인해 새로운 에러 코드, 변경된 프롬프트 처리, 기존 웹 인터페이스에서는 정상 작동했던 입력의 거부가 발생합니다. 저작물에 너무 가까운 특정 시각 스타일을 참조하는 프롬프트는 실패할 가능성이 높습니다. 코드에서 이러한 거부를 적절히 처리해야 합니다.",[11,14059,14060,14063],{},[23,14061,14062],{},"3. 가격 불확실성."," 콘텐츠 필터링 인프라에는 비용이 듭니다 -- 실시간 감지를 위한 연산 비용과 구축 및 유지보수를 위한 엔지니어링 비용 모두. 추가 오버헤드를 충당하기 위해 건당 생성 비용이 인상될 가능성이 있습니다. 바이트댄스가 콘텐츠 필터링 수준에 따른 차등 가격제를 도입할 수도 있습니다.",[11,14065,14066,14069],{},[23,14067,14068],{},"4. 이용약관 강화."," 더 엄격한 이용 정책이 예상되며, 특히 다음 항목에서 그러합니다:",[97,14071,14072,14075,14078,14081,14084],{},[73,14073,14074],{},"생성 콘텐츠의 상업적 사용",[73,14076,14077],{},"침해 출력물에 대한 책임",[73,14079,14080],{},"프롬프트 기록 요구사항",[73,14082,14083],{},"특정 카테고리의 콘텐츠 생성 제한",[73,14085,14086],{},"면책 보상 조항(또는 그 부재)",[11,14088,14089,14092],{},[23,14090,14091],{},"5. 속도 제한 및 심사 프로세스."," 기업용 API 사용자에 대해 바이트댄스는 대량 계정이나 특정 카테고리의 콘텐츠에 대한 추가 심사 프로세스를 도입할 수 있습니다.",[11,14094,14095,14098],{},[23,14096,14097],{},"6. 하류 플랫폼 리스크."," Seedance 2.0 API 위에 제품을 구축하여 사용자에게 영상 생성 서비스를 제공하는 경우, 존재하는 책임 공백을 그대로 승계하게 됩니다. 사용자가 귀사의 플랫폼을 통해 침해 콘텐츠를 생성할 수 있으며, 권리자로부터 클레임을 받을 수 있습니다.",[11,14100,14101,14102,14106],{},"오늘 당장 영상 생성 기능이 필요하면서 Seedance 연기가 해결될 때까지 기다릴 수 없는 개발자에게는, 멀티모델 페일오버 구현이 현실적인 해결책입니다. 이에 대해서는 아래 ",[37,14103,14105],{"href":14104},"#how-to-access-seedance-20-api-through-evolink","EvoLink 통합 섹션","에서 자세히 다룹니다.",[48,14108,14110],{"id":14109},"상업-프로젝트에-미치는-영향","상업 프로젝트에 미치는 영향",[11,14112,14113,14114],{},"AI 영상 생성을 기반으로 개발하는 모든 개발자가 묻는 핵심 질문은 이것입니다. ",[23,14115,14116],{},"Seedance 2.0 API로 생성한 콘텐츠를 상업 제품에 안전하게 사용할 수 있는가?",[11,14118,14119],{},"솔직한 답변: 무엇을 어떻게 생성하느냐에 전적으로 달려 있습니다. 리스크는 이분법적이지 않습니다. 스펙트럼 위에 존재하며, 자신의 특정 사용 사례가 그 스펙트럼의 어디에 해당하는지 이해하는 것이 핵심입니다.",[92,14121,14123],{"id":14122},"저작권-리스크의-두-가지-층위","저작권 리스크의 두 가지 층위",[11,14125,14126],{},"AI 생성 콘텐츠의 저작권 리스크는 두 가지 별개의 법적 차원에 존재합니다. 이를 혼동하면 과도한 경계(기술 자체를 완전히 기피) 또는 위험한 안일함(모든 것이 괜찮다고 가정)으로 이어집니다. 둘 다 바람직하지 않습니다.",[11,14128,14129],{},[23,14130,14131],{},"1층: 학습 데이터 책임 (모델 수준 리스크)",[11,14133,14134],{},"이것이 MPA의 주된 관심사이자 경고장의 근거입니다. Seedance 2.0이 라이선스 없이 저작권 콘텐츠로 학습되었다면, 바이트댄스는 법정 손해배상에 직면할 수 있습니다. 그런데 개발자에게 중요한 질문은, 그 책임이 하류의 API 사용자에게까지 확장되는가 하는 점입니다.",[11,14136,14137],{},"2026년 2월 현재, 미국 법원에서 AI 모델의 하류 사용자가 모델의 학습 데이터 구성에 대해 책임이 있다고 판결한 사례는 없습니다. 가장 유사한 선례는 Stability AI, Midjourney 등에 대한 진행 중인 소송에서 나왔지만, 이들은 모델 개발자를 대상으로 하지 최종 사용자를 대상으로 하지 않습니다.",[11,14139,14140],{},"그러나 법적 환경은 빠르게 변화하고 있습니다. 만약 법원이 침해 학습 데이터에서 파생된 AI 생성 콘텐츠가 그 자체로 2차적 저작물이라고 판결한다면, 해당 콘텐츠를 상업화한 개발자는 소급 청구에 직면할 수 있습니다. 가능성은 논쟁의 여지가 있지만, 잠재적 영향은 그렇지 않습니다.",[11,14142,14143],{},[23,14144,14145],{},"2층: 출력 콘텐츠 책임 (사용자 수준 리스크)",[11,14147,14148],{},"개발자에게 더 즉각적이고 대응 가능한 리스크입니다. 학습 데이터 문제와 무관하게, Seedance로 생성한 영상이 다음에 해당하면:",[97,14150,14151,14154,14157,14160,14163],{},[73,14152,14153],{},"인식 가능한 저작권 캐릭터 포함 (미키 마우스, 스파이더맨, 다스 베이더)",[73,14155,14156],{},"특정 저작권 장면이나 시퀀스를 밀접하게 재현",[73,14158,14159],{},"동의 없이 인식 가능한 실존 인물 등장",[73,14161,14162],{},"상표 등록된 로고, 브랜드 요소, 또는 특유의 시각적 정체성 재현",[73,14164,14165],{},"특정 아티스트나 스튜디오의 보호된 시각 스타일을 혼동을 야기할 정도로 모방",[11,14167,14168],{},"...이 경우 직접적인 저작권, 상표권, 또는 퍼블리시티권 책임에 직면합니다. 이 리스크는 학습 데이터 문제와 무관하게, 어떤 AI 모델을 사용하든 존재합니다.",[92,14170,14172],{"id":14171},"일반적-사용-사례별-리스크-수준","일반적 사용 사례별 리스크 수준",[2035,14174,14175,14188],{},[2038,14176,14177],{},[2041,14178,14179,14182,14185],{},[2044,14180,14181],{},"사용 사례",[2044,14183,14184],{},"리스크 수준",[2044,14186,14187],{},"주요 요인",[2051,14189,14190,14201,14211,14221,14232,14242,14253,14263],{},[2041,14191,14192,14195,14198],{},[2056,14193,14194],{},"자체 제품 이미지를 활용한 오리지널 제품 쇼케이스 영상",[2056,14196,14197],{},"🟢 낮음",[2056,14199,14200],{},"자체 자산, 일반적 묘사, IP 참조 없음",[2041,14202,14203,14206,14208],{},[2056,14204,14205],{},"오리지널 캐릭터와 장면으로 구성된 마케팅 영상",[2056,14207,14197],{},[2056,14209,14210],{},"독창적인 크리에이티브 방향, 기존 IP 없음",[2041,14212,14213,14216,14218],{},[2056,14214,14215],{},"일반적인 스톡 스타일 영상 (자연, 도시 풍경, 추상)",[2056,14217,14197],{},[2056,14219,14220],{},"캐릭터나 IP 관련 없음",[2041,14222,14223,14226,14229],{},[2056,14224,14225],{},"특정 영화의 시각 스타일을 모방한 영상",[2056,14227,14228],{},"🟡 중간",[2056,14230,14231],{},"스타일 자체는 저작권 대상이 아니지만, 지나친 모방은 위험",[2041,14233,14234,14237,14239],{},[2056,14235,14236],{},"저작권 캐릭터와 닮은 오리지널 캐릭터가 등장하는 콘텐츠",[2056,14238,14228],{},[2056,14240,14241],{},"\"영감을 받은\" vs. \"실질적으로 유사한\" -- 회색 지대",[2041,14243,14244,14247,14250],{},[2056,14245,14246],{},"인식 가능한 저작권 캐릭터가 등장하는 영상",[2056,14248,14249],{},"🔴 높음",[2056,14251,14252],{},"사용 도구와 무관하게 직접적 침해",[2041,14254,14255,14258,14260],{},[2056,14256,14257],{},"실제 유명인의 초상이 포함된 콘텐츠",[2056,14259,14249],{},[2056,14261,14262],{},"퍼블리시티권 침해",[2041,14264,14265,14268,14270],{},[2056,14266,14267],{},"특정 저작권 장면의 복제",[2056,14269,14249],{},[2056,14271,14272],{},"보호 대상 표현의 직접 복제",[92,14274,14276],{"id":14275},"기업-컴플라이언스-체크리스트","기업 컴플라이언스 체크리스트",[11,14278,14279],{},"상업적 콘텐츠에 AI 영상 생성 도구를 사용하기 전, 다음 체크리스트를 점검하세요.",[97,14281,14284,14296,14305,14314,14323,14332,14341,14350,14359],{"className":14282},[14283],"contains-task-list",[73,14285,14288,2424,14292,14295],{"className":14286},[14287],"task-list-item",[14289,14290],"input",{"disabled":58,"type":14291},"checkbox",[23,14293,14294],{},"플랫폼 이용약관 검토"," -- 구체적으로: 출력물의 소유권은 누구에게 있는가? 어떤 상업적 권리가 부여되는가? 어떤 사용 제한이 적용되는가? 플랫폼이 침해 청구에 대해 면책을 제공하는가?",[73,14297,14299,2424,14301,14304],{"className":14298},[14287],[14289,14300],{"disabled":58,"type":14291},[23,14302,14303],{},"사내 AI 사용 정책 수립"," -- AI 생성이 승인된 콘텐츠 유형과 사람이 직접 제작해야 하는 유형을 문서화합니다. 팀원들에게 정책을 교육합니다.",[73,14306,14308,2424,14310,14313],{"className":14307},[14287],[14289,14309],{"disabled":58,"type":14291},[23,14311,14312],{},"제출 전 모든 프롬프트 감사"," -- 특정 저작권 캐릭터, 실존 인물, 상표 등록 재산을 참조하는 내용이 있는가? 상업 프로젝트에는 프롬프트 검토를 도입합니다.",[73,14315,14317,2424,14319,14322],{"className":14316},[14287],[14289,14318],{"disabled":58,"type":14291},[23,14320,14321],{},"게시 전 출력물 유사성 확인"," -- 생성된 콘텐츠가 특정 저작물과 유사한가? 역검색과 사람의 검토를 활용합니다.",[73,14324,14326,2424,14328,14331],{"className":14325},[14287],[14289,14327],{"disabled":58,"type":14291},[23,14329,14330],{},"전체 프로세스 문서화"," -- 프롬프트, 파라미터, 창작 의도, 검토 단계의 기록을 보관합니다. 이의가 제기될 경우 선의(good faith)를 입증하는 데 도움이 됩니다.",[73,14333,14335,2424,14337,14340],{"className":14334},[14287],[14289,14336],{"disabled":58,"type":14291},[23,14338,14339],{},"고위험 콘텐츠에 대한 법률 검토"," -- 광고 캠페인, 브랜드 엔터테인먼트, 또는 대규모 배포 콘텐츠의 경우, 지식재산(IP) 법률 전문가에게 플랫폼 이용약관과 구체적인 출력물 모두에 대한 검토를 받습니다.",[73,14342,14344,2424,14346,14349],{"className":14343},[14287],[14289,14345],{"disabled":58,"type":14291},[23,14347,14348],{},"E&O 보험 검토"," -- AI 생성 콘텐츠를 명시적으로 보장하는 착오 및 누락(E&O) 보험이 점점 보편화되고 있으며, 상업적 영상 제작에서 점점 더 필수적으로 되고 있습니다.",[73,14351,14353,2424,14355,14358],{"className":14352},[14287],[14289,14354],{"disabled":58,"type":14291},[23,14356,14357],{},"법적 동향 모니터링"," -- AI 저작권 관련 법적 업데이트를 구독합니다. 상황은 매달 변하고 있습니다. 오늘 허용되는 관행이 내일은 소송 대상이 될 수 있습니다.",[73,14360,14362,2424,14364,14367],{"className":14361},[14287],[14289,14363],{"disabled":58,"type":14291},[23,14365,14366],{},"콘텐츠 회수 계획 수립"," -- 법적 판결로 인해 이미 게시한 콘텐츠의 리스크 기준이 변경될 경우, 영향받는 자산을 식별하고 대응하는 프로세스를 갖추어야 합니다.",[18,14369,14370],{},[11,14371,14372,14375],{},[23,14373,14374],{},"핵심 정리:"," 서술형 프롬프트로 생성한 일반적이고 독창적인 콘텐츠 -- 캐릭터 이름 없음, 브랜드 참조 없음, 배우 초상 없음, 특정 작품의 의도적 복제 없음 -- 가 가장 낮은 리스크를 수반합니다. 기존 IP를 의도적이거나 부주의하게 복제한 콘텐츠가 가장 높은 리스크를 수반하며, API를 사용한다고 해서 이 리스크로부터 보호되지 않습니다.",[14377,14378,14380,14385,14388],"div",{"style":14379},"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; padding: 2em; margin: 2em 0; color: white;",[11,14381,14382],{},[23,14383,14384],{},"하나의 모델이 지연되어도 멈추지 않는 영상 생성이 필요하신가요?",[11,14386,14387],{},"EvoLink은 Seedance 2.0, Kling, Veo, Sora 등을 위한 통합 API를 제공합니다. Seedance를 사용할 수 없어도 프로덕션 파이프라인은 중단되지 않으며, 자동으로 모델이 전환됩니다.",[11,14389,14390],{},[37,14391,14393],{"href":14392},"/docs/video-generation","Video Generation API 살펴보기 →",[48,14395,14397],{"id":14396},"안전한-프롬프트-사용법-저작권-트리거-회피","안전한 프롬프트 사용법: 저작권 트리거 회피",[11,14399,14400,14401],{},"Seedance 2.0, Sora, Veo 또는 다른 어떤 AI 영상 생성 모델을 사용하든, 안전한 프롬프트 관행이 ��로젝트를 저작권 리스크로부터 보호합니다. 기본 원칙은 다음과 같습니다. ",[23,14402,14403],{},"복제하고 싶은 것이 아니라, 창작하고 싶은 것을 묘사하세요.",[11,14405,14406],{},"이 섹션에서는 Seedance 2.0 API 통합에 바로 사용할 수 있는 코드 예제와 함께 구체적이고 실행 가능한 가이드라인을 제공합니다.",[92,14408,14410],{"id":14409},"피해야-할-프롬프트-패턴","피해야 할 프롬프트 패턴",[11,14412,14413],{},"다음 패턴은 저작권 필터(구현 시)에 걸릴 가능성이 높으며, 필터링과 관계없이 법적 리스크를 야기합니다.",[2035,14415,14416,14429],{},[2038,14417,14418],{},[2041,14419,14420,14423,14426],{},[2044,14421,14422],{},"❌ 위험한 프롬프트 패턴",[2044,14424,14425],{},"위험한 이유",[2044,14427,14428],{},"법적 노출",[2051,14430,14431,14442,14452,14462,14472,14482,14493,14504],{},[2041,14432,14433,14436,14439],{},[2056,14434,14435],{},"\"Generate a video of Spider-Man swinging through New York\"",[2056,14437,14438],{},"저작권 캐릭터 직접 참조",[2056,14440,14441],{},"저작권 침해",[2041,14443,14444,14447,14450],{},[2056,14445,14446],{},"\"Create a scene that looks like it's from Frozen\"",[2056,14448,14449],{},"저작물의 의도적 복제",[2056,14451,14441],{},[2041,14453,14454,14457,14460],{},[2056,14455,14456],{},"\"Make a video featuring someone who looks like Scarlett Johansson\"",[2056,14458,14459],{},"초상권 침해",[2056,14461,14262],{},[2041,14463,14464,14467,14470],{},[2056,14465,14466],{},"\"Replicate the opening sequence of Blade Runner 2049\"",[2056,14468,14469],{},"장면의 직접적 복제",[2056,14471,14441],{},[2041,14473,14474,14477,14480],{},[2056,14475,14476],{},"\"A character that looks like Elsa with ice powers\"",[2056,14478,14479],{},"저작권 캐릭터의 간접 참조",[2056,14481,14441],{},[2041,14483,14484,14487,14490],{},[2056,14485,14486],{},"\"Generate a video with the Nike swoosh logo\"",[2056,14488,14489],{},"상표 사용",[2056,14491,14492],{},"상표권 침해",[2041,14494,14495,14498,14501],{},[2056,14496,14497],{},"\"A wizard school that looks like Hogwarts\"",[2056,14499,14500],{},"상표 등록된 배경 복제",[2056,14502,14503],{},"상표 희석",[2041,14505,14506,14509,14512],{},[2056,14507,14508],{},"\"An anime girl in the exact style of Studio Ghibli\"",[2056,14510,14511],{},"특정 스튜디오 스타일 복제",[2056,14513,14514],{},"회색 지대, 잠재적 위험",[11,14516,14517],{},"간접적인 참조가 특히 위험합니다. 텍스트 수준 필터를 통과하면서도 침해 출력을 생성할 수 있기 때문입니다. \"플래티넘 금발 머리에 얼음 능력을 가진 파란 드레스의 공주\"는 \"엘사\"를 말하지 않지만, 출력물은 거의 확실히 엘사처럼 보입니다.",[92,14519,14521],{"id":14520},"안전하게-사용할-수-있는-프롬프트-패턴","안전하게 사용할 수 있는 프롬프트 패턴",[11,14523,14524],{},"다음 패턴은 저작권 문제 없이 매력적인 독창 콘텐츠를 생성합니다.",[2035,14526,14527,14537],{},[2038,14528,14529],{},[2041,14530,14531,14534],{},[2044,14532,14533],{},"✅ 안전한 프롬프트 패턴",[2044,14535,14536],{},"안전한 이유",[2051,14538,14539,14547,14555,14563,14571,14579,14587],{},[2041,14540,14541,14544],{},[2056,14542,14543],{},"\"A superhero in an original red and gold suit flies over a futuristic city at sunset\"",[2056,14545,14546],{},"오리지널 캐릭터, 오리지널 배경",[2041,14548,14549,14552],{},[2056,14550,14551],{},"\"Cinematic drone shot over a coastal city at golden hour, warm color palette, anamorphic lens\"",[2056,14553,14554],{},"시네마틱 기법 묘사를 활용한 일반적 장면",[2041,14556,14557,14560],{},[2056,14558,14559],{},"\"A young woman in a flowing blue dress walks through a sunlit Mediterranean village\"",[2056,14561,14562],{},"오리지널 캐릭터, 일반적 배경",[2041,14564,14565,14568],{},[2056,14566,14567],{},"\"Product showcase: silver smartwatch rotating on marble surface, studio lighting\"",[2056,14569,14570],{},"자체 제품, 일반적 연출",[2041,14572,14573,14576],{},[2056,14574,14575],{},"\"@Image1 as first frame, tracking shot following the subject through a forest\"",[2056,14577,14578],{},"자체 레퍼런스 자산 활용",[2041,14580,14581,14584],{},[2056,14582,14583],{},"\"Anime-style warrior in ornate jade armor standing on a cliff overlooking a stormy sea\"",[2056,14585,14586],{},"일반적 스타일 카테고리의 오리지널 캐릭터",[2041,14588,14589,14592],{},[2056,14590,14591],{},"\"Pixar-quality 3D animation: a wise old cat in spectacles sits at a cafe table\"",[2056,14593,14594],{},"스타일 품질 참조 (특정 Pixar 작품 아님)",[92,14596,14598],{"id":14597},"스타일-vs-캐릭터-구분","스타일 vs. 캐릭터 구분",[11,14600,14601],{},"법적으로 중요한 미묘한 차이입니다. 일반적으로 다음은 참조할 수 있습니다:",[97,14603,14604,14610,14616],{},[73,14605,14606,14609],{},[23,14607,14608],{},"넓은 범위의 예술 스타일"," -- \"anime style\", \"Pixar-quality 3D\", \"oil painting aesthetic\", \"noir cinematography\"",[73,14611,14612,14615],{},[23,14613,14614],{},"촬영 기법"," -- \"Hitchcock zoom\", \"Steadicam tracking shot\", \"Dutch angle\"",[73,14617,14618,14621],{},[23,14619,14620],{},"장르 관습"," -- \"cyberpunk cityscape\", \"fantasy medieval village\", \"space opera\"",[11,14623,14624],{},"다음은 참조하지 말아야 합니다:",[97,14626,14627,14633,14639],{},[73,14628,14629,14632],{},[23,14630,14631],{},"특정 작품"," -- \"like the chase scene in The Dark Knight\"",[73,14634,14635,14638],{},[23,14636,14637],{},"특정 캐릭터"," -- 간접적으로 묘사하더라도",[73,14640,14641,14644],{},[23,14642,14643],{},"특정 스튜디오의 고유 스타일"," -- 출처를 특정할 수 있을 정도로 구체적인 묘사",[11,14646,14647],{},"경계선이 모호하며, 확신이 없을 때는 더 일반적으로 작성하세요.",[92,14649,14651],{"id":14650},"코드-예제-안전한-프롬프트-vs-위험한-프롬프트-비교","코드 예제: 안전한 프롬프트 vs. 위험한 프롬프트 비교",[11,14653,14654],{},"이 가이드의 모든 코드 예제에 사용되는 기본 설정입니다. EvoLink을 통해 Seedance 2.0 API를 호출합니다.",[137,14656,14658],{"className":338,"code":14657,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get yours at evolink.ai/early-access\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_video(payload):\n    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n    task_id = task[\"id\"]\n    print(f\"Task created: {task_id} (model: {task['model']})\")\n\n    # Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        status_resp.raise_for_status()\n        result = status_resp.json()\n\n        if result[\"status\"] == \"completed\":\n            video_url = result[\"task_info\"][\"video_url\"]\n            print(f\"✅ Video ready: {video_url}\")\n            return result\n        elif result[\"status\"] == \"failed\":\n            raise Exception(f\"Task failed: {result.get('error', 'Unknown')}\")\n\n        print(f\"⏳ Progress: {result.get('progress', 0)}%\")\n        time.sleep(10)\n",[28,14659,14660,14666,14672,14676,14688,14696,14704,14720,14728,14732,14736,14745,14750,14758,14770,14780,14788,14792,14796,14804,14816,14850,14854,14859,14868,14877,14897,14905,14909,14914,14923,14927,14944,14962,14983,14989,15005,15036,15040,15070],{"__ignoreMap":142},[146,14661,14662,14664],{"class":148,"line":149},[146,14663,347],{"class":259},[146,14665,329],{"class":263},[146,14667,14668,14670],{"class":148,"line":167},[146,14669,347],{"class":259},[146,14671,356],{"class":263},[146,14673,14674],{"class":148,"line":179},[146,14675,376],{"emptyLinePlaceholder":58},[146,14677,14678,14680,14682,14685],{"class":148,"line":188},[146,14679,388],{"class":156},[146,14681,391],{"class":259},[146,14683,14684],{"class":160}," \"your-evolink-api-key\"",[146,14686,14687],{"class":175},"  # Get yours at evolink.ai/early-access\n",[146,14689,14690,14692,14694],{"class":148,"line":373},[146,14691,412],{"class":156},[146,14693,391],{"class":259},[146,14695,417],{"class":160},[146,14697,14698,14700,14702],{"class":148,"line":379},[146,14699,423],{"class":156},[146,14701,391],{"class":259},[146,14703,428],{"class":263},[146,14705,14706,14708,14710,14712,14714,14716,14718],{"class":148,"line":385},[146,14707,434],{"class":160},[146,14709,437],{"class":263},[146,14711,440],{"class":259},[146,14713,443],{"class":160},[146,14715,446],{"class":156},[146,14717,449],{"class":160},[146,14719,452],{"class":263},[146,14721,14722,14724,14726],{"class":148,"line":409},[146,14723,458],{"class":160},[146,14725,437],{"class":263},[146,14727,463],{"class":160},[146,14729,14730],{"class":148,"line":420},[146,14731,469],{"class":263},[146,14733,14734],{"class":148,"line":431},[146,14735,376],{"emptyLinePlaceholder":58},[146,14737,14738,14740,14743],{"class":148,"line":455},[146,14739,526],{"class":259},[146,14741,14742],{"class":152}," generate_video",[146,14744,5851],{"class":263},[146,14746,14747],{"class":148,"line":466},[146,14748,14749],{"class":160},"    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n",[146,14751,14752,14754,14756],{"class":148,"line":600},[146,14753,1427],{"class":263},[146,14755,267],{"class":259},[146,14757,1432],{"class":263},[146,14759,14760,14762,14764,14766,14768],{"class":148,"line":605},[146,14761,1437],{"class":259},[146,14763,449],{"class":160},[146,14765,679],{"class":156},[146,14767,1444],{"class":160},[146,14769,452],{"class":263},[146,14771,14772,14774,14776,14778],{"class":148,"line":611},[146,14773,1455],{"class":701},[146,14775,267],{"class":259},[146,14777,423],{"class":156},[146,14779,452],{"class":263},[146,14781,14782,14784,14786],{"class":148,"line":617},[146,14783,1470],{"class":701},[146,14785,267],{"class":259},[146,14787,2790],{"class":263},[146,14789,14790],{"class":148,"line":623},[146,14791,1483],{"class":263},[146,14793,14794],{"class":148,"line":628},[146,14795,2799],{"class":263},[146,14797,14798,14800,14802],{"class":148,"line":639},[146,14799,1496],{"class":263},[146,14801,267],{"class":259},[146,14803,736],{"class":263},[146,14805,14806,14808,14810,14812,14814],{"class":148,"line":654},[146,14807,7221],{"class":263},[146,14809,267],{"class":259},[146,14811,758],{"class":263},[146,14813,1626],{"class":160},[146,14815,764],{"class":263},[146,14817,14818,14820,14822,14824,14826,14828,14830,14832,14835,14837,14839,14842,14844,14846,14848],{"class":148,"line":660},[146,14819,1102],{"class":156},[146,14821,794],{"class":263},[146,14823,440],{"class":259},[146,14825,1524],{"class":160},[146,14827,685],{"class":156},[146,14829,688],{"class":263},[146,14831,691],{"class":156},[146,14833,14834],{"class":160}," (model: ",[146,14836,685],{"class":156},[146,14838,1529],{"class":263},[146,14840,14841],{"class":160},"'model'",[146,14843,1535],{"class":263},[146,14845,691],{"class":156},[146,14847,5515],{"class":160},[146,14849,406],{"class":263},[146,14851,14852],{"class":148,"line":671},[146,14853,376],{"emptyLinePlaceholder":58},[146,14855,14856],{"class":148,"line":698},[146,14857,14858],{"class":175},"    # Poll for completion\n",[146,14860,14861,14863,14866],{"class":148,"line":710},[146,14862,642],{"class":259},[146,14864,14865],{"class":156}," True",[146,14867,860],{"class":263},[146,14869,14870,14873,14875],{"class":148,"line":716},[146,14871,14872],{"class":263},"        status_resp ",[146,14874,267],{"class":259},[146,14876,668],{"class":263},[146,14878,14879,14881,14883,14885,14887,14889,14891,14893,14895],{"class":148,"line":722},[146,14880,674],{"class":259},[146,14882,449],{"class":160},[146,14884,679],{"class":156},[146,14886,682],{"class":160},[146,14888,685],{"class":156},[146,14890,688],{"class":263},[146,14892,691],{"class":156},[146,14894,449],{"class":160},[146,14896,452],{"class":263},[146,14898,14899,14901,14903],{"class":148,"line":728},[146,14900,702],{"class":701},[146,14902,267],{"class":259},[146,14904,707],{"class":156},[146,14906,14907],{"class":148,"line":739},[146,14908,713],{"class":263},[146,14910,14911],{"class":148,"line":744},[146,14912,14913],{"class":263},"        status_resp.raise_for_status()\n",[146,14915,14916,14918,14920],{"class":148,"line":750},[146,14917,11772],{"class":263},[146,14919,267],{"class":259},[146,14921,14922],{"class":263}," status_resp.json()\n",[146,14924,14925],{"class":148,"line":767},[146,14926,376],{"emptyLinePlaceholder":58},[146,14928,14929,14931,14933,14935,14938,14940,14942],{"class":148,"line":788},[146,14930,848],{"class":259},[146,14932,1648],{"class":263},[146,14934,761],{"class":160},[146,14936,14937],{"class":263},"] ",[146,14939,854],{"class":259},[146,14941,857],{"class":160},[146,14943,860],{"class":263},[146,14945,14946,14948,14950,14952,14955,14957,14960],{"class":148,"line":834},[146,14947,7407],{"class":263},[146,14949,267],{"class":259},[146,14951,1648],{"class":263},[146,14953,14954],{"class":160},"\"task_info\"",[146,14956,1562],{"class":263},[146,14958,14959],{"class":160},"\"video_url\"",[146,14961,764],{"class":263},[146,14963,14964,14966,14968,14970,14973,14975,14977,14979,14981],{"class":148,"line":839},[146,14965,5580],{"class":156},[146,14967,794],{"class":263},[146,14969,440],{"class":259},[146,14971,14972],{"class":160},"\"✅ Video ready: ",[146,14974,685],{"class":156},[146,14976,1678],{"class":263},[146,14978,691],{"class":156},[146,14980,449],{"class":160},[146,14982,406],{"class":263},[146,14984,14985,14987],{"class":148,"line":845},[146,14986,866],{"class":259},[146,14988,1706],{"class":263},[146,14990,14991,14993,14995,14997,14999,15001,15003],{"class":148,"line":863},[146,14992,875],{"class":259},[146,14994,1648],{"class":263},[146,14996,761],{"class":160},[146,14998,14937],{"class":263},[146,15000,854],{"class":259},[146,15002,882],{"class":160},[146,15004,860],{"class":263},[146,15006,15007,15009,15011,15013,15015,15018,15020,15022,15024,15026,15028,15030,15032,15034],{"class":148,"line":872},[146,15008,906],{"class":259},[146,15010,7065],{"class":156},[146,15012,794],{"class":263},[146,15014,440],{"class":259},[146,15016,15017],{"class":160},"\"Task failed: ",[146,15019,685],{"class":156},[146,15021,11871],{"class":263},[146,15023,11874],{"class":160},[146,15025,400],{"class":263},[146,15027,9959],{"class":160},[146,15029,118],{"class":263},[146,15031,691],{"class":156},[146,15033,449],{"class":160},[146,15035,406],{"class":263},[146,15037,15038],{"class":148,"line":887},[146,15039,376],{"emptyLinePlaceholder":58},[146,15041,15042,15044,15046,15048,15051,15053,15055,15058,15060,15062,15064,15066,15068],{"class":148,"line":903},[146,15043,791],{"class":156},[146,15045,794],{"class":263},[146,15047,440],{"class":259},[146,15049,15050],{"class":160},"\"⏳ Progress: ",[146,15052,685],{"class":156},[146,15054,11871],{"class":263},[146,15056,15057],{"class":160},"'progress'",[146,15059,400],{"class":263},[146,15061,783],{"class":156},[146,15063,118],{"class":263},[146,15065,691],{"class":156},[146,15067,829],{"class":160},[146,15069,406],{"class":263},[146,15071,15072,15075,15077],{"class":148,"line":915},[146,15073,15074],{"class":263},"        time.sleep(",[146,15076,537],{"class":156},[146,15078,406],{"class":263},[11,15080,15081],{},"이제 위험한 프롬프트와 안전한 대안을 비교해보겠습니다. 두 프롬프트 모두 유사한 크리에이티브 결과를 목표로 합니다.",[137,15083,15085],{"className":338,"code":15084,"language":340,"meta":142,"style":142},"# ❌ DANGEROUS — references copyrighted character and specific film\ndangerous_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Spider-Man swings between skyscrapers in New York City, \"\n              \"wearing his classic red and blue suit. He shoots a web \"\n              \"line and does a backflip, landing on a rooftop. \"\n              \"Marvel cinematic style, dramatic lighting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n# This will likely be rejected by copyright filters AND exposes you legally\n\n# ✅ SAFE — original character, similar visual impact\nsafe_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A masked vigilante in a sleek crimson and silver suit \"\n              \"swings between futuristic skyscrapers using retractable \"\n              \"grappling cables. Dynamic tracking shot follows the arc \"\n              \"of movement as the figure performs an acrobatic flip \"\n              \"mid-air and lands on a glass rooftop. Cinematic action \"\n              \"sequence, golden hour lighting, anamorphic lens flare. \"\n              \"The city below is a mix of neon signs and steam vents.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(safe_payload)\n",[28,15086,15087,15092,15101,15111,15120,15125,15130,15137,15147,15157,15167,15175,15179,15184,15188,15193,15202,15212,15221,15226,15231,15236,15241,15246,15253,15263,15273,15283,15291,15295,15299],{"__ignoreMap":142},[146,15088,15089],{"class":148,"line":149},[146,15090,15091],{"class":175},"# ❌ DANGEROUS — references copyrighted character and specific film\n",[146,15093,15094,15097,15099],{"class":148,"line":167},[146,15095,15096],{"class":263},"dangerous_payload ",[146,15098,267],{"class":259},[146,15100,428],{"class":263},[146,15102,15103,15105,15107,15109],{"class":148,"line":179},[146,15104,3674],{"class":160},[146,15106,437],{"class":263},[146,15108,1308],{"class":160},[146,15110,452],{"class":263},[146,15112,15113,15115,15117],{"class":148,"line":188},[146,15114,3685],{"class":160},[146,15116,437],{"class":263},[146,15118,15119],{"class":160},"\"Spider-Man swings between skyscrapers in New York City, \"\n",[146,15121,15122],{"class":148,"line":373},[146,15123,15124],{"class":160},"              \"wearing his classic red and blue suit. He shoots a web \"\n",[146,15126,15127],{"class":148,"line":379},[146,15128,15129],{"class":160},"              \"line and does a backflip, landing on a rooftop. \"\n",[146,15131,15132,15135],{"class":148,"line":385},[146,15133,15134],{"class":160},"              \"Marvel cinematic style, dramatic lighting.\"",[146,15136,452],{"class":263},[146,15138,15139,15141,15143,15145],{"class":148,"line":409},[146,15140,3697],{"class":160},[146,15142,437],{"class":263},[146,15144,537],{"class":156},[146,15146,452],{"class":263},[146,15148,15149,15151,15153,15155],{"class":148,"line":420},[146,15150,3709],{"class":160},[146,15152,437],{"class":263},[146,15154,1368],{"class":160},[146,15156,452],{"class":263},[146,15158,15159,15161,15163,15165],{"class":148,"line":431},[146,15160,3721],{"class":160},[146,15162,437],{"class":263},[146,15164,1384],{"class":160},[146,15166,452],{"class":263},[146,15168,15169,15171,15173],{"class":148,"line":455},[146,15170,3737],{"class":160},[146,15172,437],{"class":263},[146,15174,3742],{"class":156},[146,15176,15177],{"class":148,"line":466},[146,15178,469],{"class":263},[146,15180,15181],{"class":148,"line":600},[146,15182,15183],{"class":175},"# This will likely be rejected by copyright filters AND exposes you legally\n",[146,15185,15186],{"class":148,"line":605},[146,15187,376],{"emptyLinePlaceholder":58},[146,15189,15190],{"class":148,"line":611},[146,15191,15192],{"class":175},"# ✅ SAFE — original character, similar visual impact\n",[146,15194,15195,15198,15200],{"class":148,"line":617},[146,15196,15197],{"class":263},"safe_payload ",[146,15199,267],{"class":259},[146,15201,428],{"class":263},[146,15203,15204,15206,15208,15210],{"class":148,"line":623},[146,15205,3674],{"class":160},[146,15207,437],{"class":263},[146,15209,1308],{"class":160},[146,15211,452],{"class":263},[146,15213,15214,15216,15218],{"class":148,"line":628},[146,15215,3685],{"class":160},[146,15217,437],{"class":263},[146,15219,15220],{"class":160},"\"A masked vigilante in a sleek crimson and silver suit \"\n",[146,15222,15223],{"class":148,"line":639},[146,15224,15225],{"class":160},"              \"swings between futuristic skyscrapers using retractable \"\n",[146,15227,15228],{"class":148,"line":654},[146,15229,15230],{"class":160},"              \"grappling cables. Dynamic tracking shot follows the arc \"\n",[146,15232,15233],{"class":148,"line":660},[146,15234,15235],{"class":160},"              \"of movement as the figure performs an acrobatic flip \"\n",[146,15237,15238],{"class":148,"line":671},[146,15239,15240],{"class":160},"              \"mid-air and lands on a glass rooftop. Cinematic action \"\n",[146,15242,15243],{"class":148,"line":698},[146,15244,15245],{"class":160},"              \"sequence, golden hour lighting, anamorphic lens flare. \"\n",[146,15247,15248,15251],{"class":148,"line":710},[146,15249,15250],{"class":160},"              \"The city below is a mix of neon signs and steam vents.\"",[146,15252,452],{"class":263},[146,15254,15255,15257,15259,15261],{"class":148,"line":716},[146,15256,3697],{"class":160},[146,15258,437],{"class":263},[146,15260,537],{"class":156},[146,15262,452],{"class":263},[146,15264,15265,15267,15269,15271],{"class":148,"line":722},[146,15266,3709],{"class":160},[146,15268,437],{"class":263},[146,15270,1368],{"class":160},[146,15272,452],{"class":263},[146,15274,15275,15277,15279,15281],{"class":148,"line":728},[146,15276,3721],{"class":160},[146,15278,437],{"class":263},[146,15280,1384],{"class":160},[146,15282,452],{"class":263},[146,15284,15285,15287,15289],{"class":148,"line":739},[146,15286,3737],{"class":160},[146,15288,437],{"class":263},[146,15290,3742],{"class":156},[146,15292,15293],{"class":148,"line":744},[146,15294,469],{"class":263},[146,15296,15297],{"class":148,"line":750},[146,15298,376],{"emptyLinePlaceholder":58},[146,15300,15301,15303,15305],{"class":148,"line":767},[146,15302,12238],{"class":263},[146,15304,267],{"class":259},[146,15306,15307],{"class":263}," generate_video(safe_payload)\n",[11,15309,15310],{},"안전한 프롬프트로도 동일하게 매력적인 영상을 생성할 수 있습니다. 오리지널 캐릭터 디자인, 역동적인 액션, 시네마틱 품질을 갖추면서도 어떤 저작권 자산도 참조하지 않습니다. 출력물은 독창적인 창작 표현이기 때문에 상업적으로 사용 가능합니다.",[92,15312,15314],{"id":15313},"제품-및-브랜드-콘텐츠-자체-자산을-안전하게-활용하기","제품 및 브랜드 콘텐츠: 자체 자산을 안전하게 활용하기",[11,15316,15317,15318,2962,15320,15322],{},"상업용 제품 영상의 경우, 가장 안전하고 효과적인 접근법은 ",[28,15319,4148],{},[28,15321,2961],{}," 레퍼런스 태그를 통해 자체 자산을 참조하는 것입니다. 이를 통해 설계상 저작권에 안전한 콘텐츠가 생성됩니다.",[137,15324,15326],{"className":338,"code":15325,"language":340,"meta":142,"style":142},"# ✅ Product showcase using your own brand assets\nproduct_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as the hero product. Cinematic product reveal: \"\n              \"camera orbits slowly around the product on a clean white \"\n              \"marble surface. Soft studio lighting with a single dramatic \"\n              \"key light creating elegant shadows. Shallow depth of field. \"\n              \"Premium commercial photography aesthetic. Camera movement: \"\n              \"smooth 180-degree orbit, then slow push-in to detail shot.\",\n    \"image_urls\": [\"https://your-cdn.com/your-product-photo.jpg\"],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n",[28,15327,15328,15333,15342,15352,15361,15366,15371,15376,15381,15388,15400,15410,15420,15430,15439],{"__ignoreMap":142},[146,15329,15330],{"class":148,"line":149},[146,15331,15332],{"class":175},"# ✅ Product showcase using your own brand assets\n",[146,15334,15335,15338,15340],{"class":148,"line":167},[146,15336,15337],{"class":263},"product_payload ",[146,15339,267],{"class":259},[146,15341,428],{"class":263},[146,15343,15344,15346,15348,15350],{"class":148,"line":179},[146,15345,3674],{"class":160},[146,15347,437],{"class":263},[146,15349,1308],{"class":160},[146,15351,452],{"class":263},[146,15353,15354,15356,15358],{"class":148,"line":188},[146,15355,3685],{"class":160},[146,15357,437],{"class":263},[146,15359,15360],{"class":160},"\"@Image1 as the hero product. Cinematic product reveal: \"\n",[146,15362,15363],{"class":148,"line":373},[146,15364,15365],{"class":160},"              \"camera orbits slowly around the product on a clean white \"\n",[146,15367,15368],{"class":148,"line":379},[146,15369,15370],{"class":160},"              \"marble surface. Soft studio lighting with a single dramatic \"\n",[146,15372,15373],{"class":148,"line":385},[146,15374,15375],{"class":160},"              \"key light creating elegant shadows. Shallow depth of field. \"\n",[146,15377,15378],{"class":148,"line":409},[146,15379,15380],{"class":160},"              \"Premium commercial photography aesthetic. Camera movement: \"\n",[146,15382,15383,15386],{"class":148,"line":420},[146,15384,15385],{"class":160},"              \"smooth 180-degree orbit, then slow push-in to detail shot.\"",[146,15387,452],{"class":263},[146,15389,15390,15393,15395,15398],{"class":148,"line":431},[146,15391,15392],{"class":160},"    \"image_urls\"",[146,15394,10846],{"class":263},[146,15396,15397],{"class":160},"\"https://your-cdn.com/your-product-photo.jpg\"",[146,15399,10852],{"class":263},[146,15401,15402,15404,15406,15408],{"class":148,"line":455},[146,15403,3697],{"class":160},[146,15405,437],{"class":263},[146,15407,3702],{"class":156},[146,15409,452],{"class":263},[146,15411,15412,15414,15416,15418],{"class":148,"line":466},[146,15413,3709],{"class":160},[146,15415,437],{"class":263},[146,15417,3714],{"class":160},[146,15419,452],{"class":263},[146,15421,15422,15424,15426,15428],{"class":148,"line":600},[146,15423,3721],{"class":160},[146,15425,437],{"class":263},[146,15427,1384],{"class":160},[146,15429,452],{"class":263},[146,15431,15432,15434,15436],{"class":148,"line":605},[146,15433,3737],{"class":160},[146,15435,437],{"class":263},[146,15437,15438],{"class":156},"False\n",[146,15440,15441],{"class":148,"line":611},[146,15442,469],{"class":263},[11,15444,15445],{},[2621,15446,15447],{},"위 첫 번째 예제와 동일한 설정 및 폴링 함수를 사용합니다.",[11,15449,15450,15451,15453,15454,13800],{},"타임코드 기반 장면 묘사를 활용한 촬영 스크립트 형식, 고급 ",[28,15452,13795],{}," 조합 등 더 많은 프롬프트 엔지니어링 기법은 종합 ",[37,15455,2209],{"href":1766},[92,15457,15459],{"id":15458},"애플리케이션에-프롬프트-안전-계층-구축하기","애플리케이션에 프롬프트 안전 계층 구축하기",[11,15461,15462],{},"사용자가 영상 콘텐츠를 생성할 수 있는 제품을 구축하는 경우, API에 요청을 보내기 전에 클라이언트 측 프롬프트 안전 검사를 구현하는 것을 권장합니다.",[137,15464,15466],{"className":338,"code":15465,"language":340,"meta":142,"style":142},"import re\n\n# Basic copyright safety check — extend as needed\nBLOCKED_TERMS = {\n    # Characters\n    \"spider-man\", \"spiderman\", \"batman\", \"superman\", \"iron man\",\n    \"mickey mouse\", \"elsa\", \"buzz lightyear\", \"pikachu\", \"mario\",\n    \"harry potter\", \"darth vader\", \"baby yoda\", \"grogu\",\n    # Franchises\n    \"marvel\", \"disney\", \"pixar movie\", \"star wars\", \"pokemon\",\n    \"lord of the rings\", \"game of thrones\", \"hogwarts\",\n    # Studios (when used to replicate their specific works)\n    \"studio ghibli film\", \"dreamworks movie\",\n    # Brands\n    \"nike swoosh\", \"coca-cola\", \"apple logo\",\n}\n\nBLOCKED_PATTERNS = [\n    r\"looks?\\s+like\\s+\\w+\\s+(from|in)\\s+\",  # \"looks like X from Y\"\n    r\"(scene|sequence)\\s+(from|in)\\s+[A-Z]\",  # \"scene from [Movie]\"\n    r\"in\\s+the\\s+style\\s+of\\s+[A-Z]\\w+\\s+[A-Z]\",  # \"in the style of [Studio Name]\"\n]\n\ndef check_prompt_safety(prompt: str) -> dict:\n    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n    prompt_lower = prompt.lower()\n    issues = []\n\n    for term in BLOCKED_TERMS:\n        if term in prompt_lower:\n            issues.append(f\"Blocked term found: '{term}'\")\n\n    for pattern in BLOCKED_PATTERNS:\n        if re.search(pattern, prompt, re.IGNORECASE):\n            issues.append(f\"Risky pattern detected: {pattern}\")\n\n    return {\n        \"safe\": len(issues) == 0,\n        \"issues\": issues,\n        \"recommendation\": \"Revise prompt to use original descriptions\"\n                          if issues else \"Prompt appears safe\"\n    }\n\n# Usage\nresult = check_prompt_safety(\n    \"A Spider-Man style hero swinging through New York\"\n)\nprint(result)\n# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n#  'recommendation': 'Revise prompt to use original descriptions'}\n\nresult = check_prompt_safety(\n    \"A masked hero in crimson armor swings between futuristic towers\"\n)\nprint(result)\n# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[28,15467,15468,15475,15479,15484,15493,15498,15525,15552,15574,15579,15606,15623,15628,15640,15645,15662,15666,15670,15679,15735,15777,15827,15831,15835,15854,15859,15869,15878,15882,15896,15907,15928,15932,15946,15958,15978,15982,15988,16008,16016,16026,16040,16044,16048,16053,16062,16067,16071,16078,16083,16088,16092,16100,16105,16109,16115],{"__ignoreMap":142},[146,15469,15470,15472],{"class":148,"line":149},[146,15471,347],{"class":259},[146,15473,15474],{"class":263}," re\n",[146,15476,15477],{"class":148,"line":167},[146,15478,376],{"emptyLinePlaceholder":58},[146,15480,15481],{"class":148,"line":179},[146,15482,15483],{"class":175},"# Basic copyright safety check — extend as needed\n",[146,15485,15486,15489,15491],{"class":148,"line":188},[146,15487,15488],{"class":156},"BLOCKED_TERMS",[146,15490,391],{"class":259},[146,15492,428],{"class":263},[146,15494,15495],{"class":148,"line":373},[146,15496,15497],{"class":175},"    # Characters\n",[146,15499,15500,15503,15505,15508,15510,15513,15515,15518,15520,15523],{"class":148,"line":379},[146,15501,15502],{"class":160},"    \"spider-man\"",[146,15504,400],{"class":263},[146,15506,15507],{"class":160},"\"spiderman\"",[146,15509,400],{"class":263},[146,15511,15512],{"class":160},"\"batman\"",[146,15514,400],{"class":263},[146,15516,15517],{"class":160},"\"superman\"",[146,15519,400],{"class":263},[146,15521,15522],{"class":160},"\"iron man\"",[146,15524,452],{"class":263},[146,15526,15527,15530,15532,15535,15537,15540,15542,15545,15547,15550],{"class":148,"line":385},[146,15528,15529],{"class":160},"    \"mickey mouse\"",[146,15531,400],{"class":263},[146,15533,15534],{"class":160},"\"elsa\"",[146,15536,400],{"class":263},[146,15538,15539],{"class":160},"\"buzz lightyear\"",[146,15541,400],{"class":263},[146,15543,15544],{"class":160},"\"pikachu\"",[146,15546,400],{"class":263},[146,15548,15549],{"class":160},"\"mario\"",[146,15551,452],{"class":263},[146,15553,15554,15557,15559,15562,15564,15567,15569,15572],{"class":148,"line":409},[146,15555,15556],{"class":160},"    \"harry potter\"",[146,15558,400],{"class":263},[146,15560,15561],{"class":160},"\"darth vader\"",[146,15563,400],{"class":263},[146,15565,15566],{"class":160},"\"baby yoda\"",[146,15568,400],{"class":263},[146,15570,15571],{"class":160},"\"grogu\"",[146,15573,452],{"class":263},[146,15575,15576],{"class":148,"line":420},[146,15577,15578],{"class":175},"    # Franchises\n",[146,15580,15581,15584,15586,15589,15591,15594,15596,15599,15601,15604],{"class":148,"line":431},[146,15582,15583],{"class":160},"    \"marvel\"",[146,15585,400],{"class":263},[146,15587,15588],{"class":160},"\"disney\"",[146,15590,400],{"class":263},[146,15592,15593],{"class":160},"\"pixar movie\"",[146,15595,400],{"class":263},[146,15597,15598],{"class":160},"\"star wars\"",[146,15600,400],{"class":263},[146,15602,15603],{"class":160},"\"pokemon\"",[146,15605,452],{"class":263},[146,15607,15608,15611,15613,15616,15618,15621],{"class":148,"line":455},[146,15609,15610],{"class":160},"    \"lord of the rings\"",[146,15612,400],{"class":263},[146,15614,15615],{"class":160},"\"game of thrones\"",[146,15617,400],{"class":263},[146,15619,15620],{"class":160},"\"hogwarts\"",[146,15622,452],{"class":263},[146,15624,15625],{"class":148,"line":466},[146,15626,15627],{"class":175},"    # Studios (when used to replicate their specific works)\n",[146,15629,15630,15633,15635,15638],{"class":148,"line":600},[146,15631,15632],{"class":160},"    \"studio ghibli film\"",[146,15634,400],{"class":263},[146,15636,15637],{"class":160},"\"dreamworks movie\"",[146,15639,452],{"class":263},[146,15641,15642],{"class":148,"line":605},[146,15643,15644],{"class":175},"    # Brands\n",[146,15646,15647,15650,15652,15655,15657,15660],{"class":148,"line":611},[146,15648,15649],{"class":160},"    \"nike swoosh\"",[146,15651,400],{"class":263},[146,15653,15654],{"class":160},"\"coca-cola\"",[146,15656,400],{"class":263},[146,15658,15659],{"class":160},"\"apple logo\"",[146,15661,452],{"class":263},[146,15663,15664],{"class":148,"line":617},[146,15665,469],{"class":263},[146,15667,15668],{"class":148,"line":623},[146,15669,376],{"emptyLinePlaceholder":58},[146,15671,15672,15675,15677],{"class":148,"line":628},[146,15673,15674],{"class":156},"BLOCKED_PATTERNS",[146,15676,391],{"class":259},[146,15678,8868],{"class":263},[146,15680,15681,15684,15686,15690,15693,15696,15698,15701,15703,15705,15708,15710,15712,15714,15716,15718,15721,15723,15726,15728,15730,15732],{"class":148,"line":639},[146,15682,15683],{"class":259},"    r",[146,15685,449],{"class":160},[146,15687,15689],{"class":15688},"sns5M","looks",[146,15691,15692],{"class":259},"?",[146,15694,15695],{"class":156},"\\s",[146,15697,5430],{"class":259},[146,15699,15700],{"class":15688},"like",[146,15702,15695],{"class":156},[146,15704,5430],{"class":259},[146,15706,15707],{"class":156},"\\w",[146,15709,5430],{"class":259},[146,15711,15695],{"class":156},[146,15713,5430],{"class":259},[146,15715,794],{"class":156},[146,15717,6731],{"class":15688},[146,15719,15720],{"class":259},"|",[146,15722,1180],{"class":15688},[146,15724,15725],{"class":156},")\\s",[146,15727,5430],{"class":259},[146,15729,449],{"class":160},[146,15731,1447],{"class":263},[146,15733,15734],{"class":175},"# \"looks like X from Y\"\n",[146,15736,15737,15739,15741,15743,15746,15748,15751,15753,15755,15757,15759,15761,15763,15765,15767,15770,15772,15774],{"class":148,"line":654},[146,15738,15683],{"class":259},[146,15740,449],{"class":160},[146,15742,794],{"class":156},[146,15744,15745],{"class":15688},"scene",[146,15747,15720],{"class":259},[146,15749,15750],{"class":15688},"sequence",[146,15752,15725],{"class":156},[146,15754,5430],{"class":259},[146,15756,794],{"class":156},[146,15758,6731],{"class":15688},[146,15760,15720],{"class":259},[146,15762,1180],{"class":15688},[146,15764,15725],{"class":156},[146,15766,5430],{"class":259},[146,15768,15769],{"class":156},"[A-Z]",[146,15771,449],{"class":160},[146,15773,1447],{"class":263},[146,15775,15776],{"class":175},"# \"scene from [Movie]\"\n",[146,15778,15779,15781,15783,15785,15787,15789,15792,15794,15796,15798,15800,15802,15805,15807,15809,15812,15814,15816,15818,15820,15822,15824],{"class":148,"line":660},[146,15780,15683],{"class":259},[146,15782,449],{"class":160},[146,15784,1180],{"class":15688},[146,15786,15695],{"class":156},[146,15788,5430],{"class":259},[146,15790,15791],{"class":15688},"the",[146,15793,15695],{"class":156},[146,15795,5430],{"class":259},[146,15797,11222],{"class":15688},[146,15799,15695],{"class":156},[146,15801,5430],{"class":259},[146,15803,15804],{"class":15688},"of",[146,15806,15695],{"class":156},[146,15808,5430],{"class":259},[146,15810,15811],{"class":156},"[A-Z]\\w",[146,15813,5430],{"class":259},[146,15815,15695],{"class":156},[146,15817,5430],{"class":259},[146,15819,15769],{"class":156},[146,15821,449],{"class":160},[146,15823,1447],{"class":263},[146,15825,15826],{"class":175},"# \"in the style of [Studio Name]\"\n",[146,15828,15829],{"class":148,"line":671},[146,15830,764],{"class":263},[146,15832,15833],{"class":148,"line":698},[146,15834,376],{"emptyLinePlaceholder":58},[146,15836,15837,15839,15842,15845,15847,15850,15852],{"class":148,"line":710},[146,15838,526],{"class":259},[146,15840,15841],{"class":152}," check_prompt_safety",[146,15843,15844],{"class":263},"(prompt: ",[146,15846,8674],{"class":156},[146,15848,15849],{"class":263},") -> ",[146,15851,8799],{"class":156},[146,15853,860],{"class":263},[146,15855,15856],{"class":148,"line":716},[146,15857,15858],{"class":160},"    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n",[146,15860,15861,15864,15866],{"class":148,"line":722},[146,15862,15863],{"class":263},"    prompt_lower ",[146,15865,267],{"class":259},[146,15867,15868],{"class":263}," prompt.lower()\n",[146,15870,15871,15874,15876],{"class":148,"line":728},[146,15872,15873],{"class":263},"    issues ",[146,15875,267],{"class":259},[146,15877,5879],{"class":263},[146,15879,15880],{"class":148,"line":739},[146,15881,376],{"emptyLinePlaceholder":58},[146,15883,15884,15886,15889,15891,15894],{"class":148,"line":744},[146,15885,5122],{"class":259},[146,15887,15888],{"class":263}," term ",[146,15890,1180],{"class":259},[146,15892,15893],{"class":156}," BLOCKED_TERMS",[146,15895,860],{"class":263},[146,15897,15898,15900,15902,15904],{"class":148,"line":750},[146,15899,848],{"class":259},[146,15901,15888],{"class":263},[146,15903,1180],{"class":259},[146,15905,15906],{"class":263}," prompt_lower:\n",[146,15908,15909,15912,15914,15917,15919,15922,15924,15926],{"class":148,"line":767},[146,15910,15911],{"class":263},"            issues.append(",[146,15913,440],{"class":259},[146,15915,15916],{"class":160},"\"Blocked term found: '",[146,15918,685],{"class":156},[146,15920,15921],{"class":263},"term",[146,15923,691],{"class":156},[146,15925,6112],{"class":160},[146,15927,406],{"class":263},[146,15929,15930],{"class":148,"line":788},[146,15931,376],{"emptyLinePlaceholder":58},[146,15933,15934,15936,15939,15941,15944],{"class":148,"line":834},[146,15935,5122],{"class":259},[146,15937,15938],{"class":263}," pattern ",[146,15940,1180],{"class":259},[146,15942,15943],{"class":156}," BLOCKED_PATTERNS",[146,15945,860],{"class":263},[146,15947,15948,15950,15953,15956],{"class":148,"line":839},[146,15949,848],{"class":259},[146,15951,15952],{"class":263}," re.search(pattern, prompt, re.",[146,15954,15955],{"class":156},"IGNORECASE",[146,15957,548],{"class":263},[146,15959,15960,15962,15964,15967,15969,15972,15974,15976],{"class":148,"line":845},[146,15961,15911],{"class":263},[146,15963,440],{"class":259},[146,15965,15966],{"class":160},"\"Risky pattern detected: ",[146,15968,685],{"class":156},[146,15970,15971],{"class":263},"pattern",[146,15973,691],{"class":156},[146,15975,449],{"class":160},[146,15977,406],{"class":263},[146,15979,15980],{"class":148,"line":863},[146,15981,376],{"emptyLinePlaceholder":58},[146,15983,15984,15986],{"class":148,"line":872},[146,15985,1703],{"class":259},[146,15987,428],{"class":263},[146,15989,15990,15993,15995,15998,16001,16003,16006],{"class":148,"line":887},[146,15991,15992],{"class":160},"        \"safe\"",[146,15994,437],{"class":263},[146,15996,15997],{"class":156},"len",[146,15999,16000],{"class":263},"(issues) ",[146,16002,854],{"class":259},[146,16004,16005],{"class":156}," 0",[146,16007,452],{"class":263},[146,16009,16010,16013],{"class":148,"line":903},[146,16011,16012],{"class":160},"        \"issues\"",[146,16014,16015],{"class":263},": issues,\n",[146,16017,16018,16021,16023],{"class":148,"line":915},[146,16019,16020],{"class":160},"        \"recommendation\"",[146,16022,437],{"class":263},[146,16024,16025],{"class":160},"\"Revise prompt to use original descriptions\"\n",[146,16027,16028,16031,16034,16037],{"class":148,"line":953},[146,16029,16030],{"class":259},"                          if",[146,16032,16033],{"class":263}," issues ",[146,16035,16036],{"class":259},"else",[146,16038,16039],{"class":160}," \"Prompt appears safe\"\n",[146,16041,16042],{"class":148,"line":959},[146,16043,1407],{"class":263},[146,16045,16046],{"class":148,"line":964},[146,16047,376],{"emptyLinePlaceholder":58},[146,16049,16050],{"class":148,"line":970},[146,16051,16052],{"class":175},"# Usage\n",[146,16054,16055,16057,16059],{"class":148,"line":976},[146,16056,12238],{"class":263},[146,16058,267],{"class":259},[146,16060,16061],{"class":263}," check_prompt_safety(\n",[146,16063,16064],{"class":148,"line":988},[146,16065,16066],{"class":160},"    \"A Spider-Man style hero swinging through New York\"\n",[146,16068,16069],{"class":148,"line":993},[146,16070,406],{"class":263},[146,16072,16073,16075],{"class":148,"line":5534},[146,16074,6587],{"class":156},[146,16076,16077],{"class":263},"(result)\n",[146,16079,16080],{"class":148,"line":5543},[146,16081,16082],{"class":175},"# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n",[146,16084,16085],{"class":148,"line":5549},[146,16086,16087],{"class":175},"#  'recommendation': 'Revise prompt to use original descriptions'}\n",[146,16089,16090],{"class":148,"line":5577},[146,16091,376],{"emptyLinePlaceholder":58},[146,16093,16094,16096,16098],{"class":148,"line":5608},[146,16095,12238],{"class":263},[146,16097,267],{"class":259},[146,16099,16061],{"class":263},[146,16101,16102],{"class":148,"line":5628},[146,16103,16104],{"class":160},"    \"A masked hero in crimson armor swings between futuristic towers\"\n",[146,16106,16107],{"class":148,"line":5634},[146,16108,406],{"class":263},[146,16110,16111,16113],{"class":148,"line":5640},[146,16112,6587],{"class":156},[146,16114,16077],{"class":263},[146,16116,16117],{"class":148,"line":5645},[146,16118,16119],{"class":175},"# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[11,16121,16122],{},[2621,16123,16124],{},"이것은 기본적인 출발점입니다. 프로덕션 시스템에서는 더 정교한 NLP 기반 감지, 정기적으로 업데이트되는 차단 목록, 경계 사례에 대한 사람의 검토가 필요합니다.",[48,16126,16128],{"id":16127},"evolink을-통해-seedance-20-api에-접근하는-방법","EvoLink을 통해 Seedance 2.0 API에 접근하는 방법",[18,16130,16131],{},[11,16132,16133,16134,16137,16138,16141,16142,16145],{},"⚠️ ",[23,16135,16136],{},"중요 면책 사항:"," EvoLink은 여러 영상 생성 모델을 위한 통합 API 게이트웨이입니다. EvoLink은 컴플라이언스 중개자로서의 역할을 하지 ",[23,16139,16140],{},"않으며",", 어떤 모델의 출력물에 대해서도 저작권 상태를 ",[23,16143,16144],{},"보증하지 않습니다."," 저작권 준수는 개발자의 책임입니다. EvoLink은 접근성과 인프라를 제공할 뿐, 법적 보호를 제공하지 않습니다.",[11,16147,16148],{},"이 점을 명확히 한 상태에서, EvoLink이 Seedance 2.0을 사용하는 개발자에게 제공하는 내용은 다음과 같습니다.",[92,16150,16152],{"id":16151},"api-통합-지금-준비-완료-바이트댄스-개방-시-즉시-활성화","API 통합: 지금 준비 완료, 바이트댄스 개방 시 즉시 활성화",[11,16154,16155],{},"EvoLink은 Seedance 2.0 API 어댑터 개발을 완료했습니다. 엔드포인트, 파라미터, 응답 형식이 확정되어 문서화되었습니다. 바이트댄스가 저작권 안전장치 구현 후 공식적으로 API를 활성화하면, EvoLink 통합이 즉시 활성화됩니다 -- 코드 변경이 전혀 필요 없습니다.",[11,16157,16158,16159,16164],{},"통합은 ",[37,16160,16163],{"href":16161,"rel":16162},"https://docs.evolink.ai/en/api-manual/video-series/seedance2.0/seedance-2.0-video-generate",[41],"EvoLink Seedance 2.0 Video Generation API"," 명세를 따릅니다.",[137,16166,16168],{"className":338,"code":16167,"language":340,"meta":142,"style":142},"# Text-to-video: Seedance 2.0 via EvoLink\ntext_to_video = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A wise old cat in round spectacles sits at a cozy cafe \"\n              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n              \"curls upward. The cat speaks in a calm, measured tone. \"\n              \"Warm afternoon light through the cafe window, Pixar-quality \"\n              \"3D animation, warm color palette, expressive character acting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(text_to_video)\n",[28,16169,16170,16175,16184,16194,16203,16208,16213,16218,16225,16235,16245,16255,16263,16267,16271],{"__ignoreMap":142},[146,16171,16172],{"class":148,"line":149},[146,16173,16174],{"class":175},"# Text-to-video: Seedance 2.0 via EvoLink\n",[146,16176,16177,16180,16182],{"class":148,"line":167},[146,16178,16179],{"class":263},"text_to_video ",[146,16181,267],{"class":259},[146,16183,428],{"class":263},[146,16185,16186,16188,16190,16192],{"class":148,"line":179},[146,16187,3674],{"class":160},[146,16189,437],{"class":263},[146,16191,1308],{"class":160},[146,16193,452],{"class":263},[146,16195,16196,16198,16200],{"class":148,"line":188},[146,16197,3685],{"class":160},[146,16199,437],{"class":263},[146,16201,16202],{"class":160},"\"A wise old cat in round spectacles sits at a cozy cafe \"\n",[146,16204,16205],{"class":148,"line":373},[146,16206,16207],{"class":160},"              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n",[146,16209,16210],{"class":148,"line":379},[146,16211,16212],{"class":160},"              \"curls upward. The cat speaks in a calm, measured tone. \"\n",[146,16214,16215],{"class":148,"line":385},[146,16216,16217],{"class":160},"              \"Warm afternoon light through the cafe window, Pixar-quality \"\n",[146,16219,16220,16223],{"class":148,"line":409},[146,16221,16222],{"class":160},"              \"3D animation, warm color palette, expressive character acting.\"",[146,16224,452],{"class":263},[146,16226,16227,16229,16231,16233],{"class":148,"line":420},[146,16228,3697],{"class":160},[146,16230,437],{"class":263},[146,16232,537],{"class":156},[146,16234,452],{"class":263},[146,16236,16237,16239,16241,16243],{"class":148,"line":431},[146,16238,3709],{"class":160},[146,16240,437],{"class":263},[146,16242,1368],{"class":160},[146,16244,452],{"class":263},[146,16246,16247,16249,16251,16253],{"class":148,"line":455},[146,16248,3721],{"class":160},[146,16250,437],{"class":263},[146,16252,1384],{"class":160},[146,16254,452],{"class":263},[146,16256,16257,16259,16261],{"class":148,"line":466},[146,16258,3737],{"class":160},[146,16260,437],{"class":263},[146,16262,3742],{"class":156},[146,16264,16265],{"class":148,"line":600},[146,16266,469],{"class":263},[146,16268,16269],{"class":148,"line":605},[146,16270,376],{"emptyLinePlaceholder":58},[146,16272,16273,16275,16277],{"class":148,"line":611},[146,16274,12238],{"class":263},[146,16276,267],{"class":259},[146,16278,16279],{"class":263}," generate_video(text_to_video)\n",[11,16281,16282],{},[2621,16283,16284],{},"위 첫 번째 코드 예제와 동일한 설정 및 폴링 함수를 사용합니다.",[92,16286,16288],{"id":16287},"완전한-멀티모달-생성-이미지-영상-오디오","완전한 멀티모달 생성: 이미지 + 영상 + 오디오",[11,16290,16291,16292,16294],{},"Seedance 2.0의 핵심 차별점은 멀티모달 ",[28,16293,13795],{}," 시스템입니다. 이미지, 영상, 오디오 입력을 단일 생성 요청 내에서 크리에이티브 레퍼런스로 결합할 수 있는 기능입니다. EvoLink을 통해 모든 입력 모달리티가 완전히 지원됩니다.",[137,16296,16298],{"className":338,"code":16297,"language":340,"meta":142,"style":142},"# Multimodal generation — character ref + camera ref + audio sync\nmultimodal_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as character reference — dancer in athletic wear. \"\n              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n              \"and motion energy to the beat. The dancer performs energetically \"\n              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n              \"with the rhythm. Smoke effects catch the colored lighting.\",\n    \"image_urls\": [\n        \"https://your-cdn.com/character-design.png\"\n    ],\n    \"video_urls\": [\n        \"https://your-cdn.com/camera-reference.mp4\"\n    ],\n    \"audio_urls\": [\n        \"https://your-cdn.com/background-track.mp3\"\n    ],\n    \"duration\": 12,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(multimodal_payload)\n",[28,16299,16300,16305,16314,16324,16333,16338,16343,16348,16353,16360,16366,16371,16376,16383,16388,16392,16399,16404,16408,16419,16429,16439,16447,16451,16455],{"__ignoreMap":142},[146,16301,16302],{"class":148,"line":149},[146,16303,16304],{"class":175},"# Multimodal generation — character ref + camera ref + audio sync\n",[146,16306,16307,16310,16312],{"class":148,"line":167},[146,16308,16309],{"class":263},"multimodal_payload ",[146,16311,267],{"class":259},[146,16313,428],{"class":263},[146,16315,16316,16318,16320,16322],{"class":148,"line":179},[146,16317,3674],{"class":160},[146,16319,437],{"class":263},[146,16321,1308],{"class":160},[146,16323,452],{"class":263},[146,16325,16326,16328,16330],{"class":148,"line":188},[146,16327,3685],{"class":160},[146,16329,437],{"class":263},[146,16331,16332],{"class":160},"\"@Image1 as character reference — dancer in athletic wear. \"\n",[146,16334,16335],{"class":148,"line":373},[146,16336,16337],{"class":160},"              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n",[146,16339,16340],{"class":148,"line":379},[146,16341,16342],{"class":160},"              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n",[146,16344,16345],{"class":148,"line":385},[146,16346,16347],{"class":160},"              \"and motion energy to the beat. The dancer performs energetically \"\n",[146,16349,16350],{"class":148,"line":409},[146,16351,16352],{"class":160},"              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n",[146,16354,16355,16358],{"class":148,"line":420},[146,16356,16357],{"class":160},"              \"with the rhythm. Smoke effects catch the colored lighting.\"",[146,16359,452],{"class":263},[146,16361,16362,16364],{"class":148,"line":431},[146,16363,15392],{"class":160},[146,16365,2693],{"class":263},[146,16367,16368],{"class":148,"line":455},[146,16369,16370],{"class":160},"        \"https://your-cdn.com/character-design.png\"\n",[146,16372,16373],{"class":148,"line":466},[146,16374,16375],{"class":263},"    ],\n",[146,16377,16378,16381],{"class":148,"line":600},[146,16379,16380],{"class":160},"    \"video_urls\"",[146,16382,2693],{"class":263},[146,16384,16385],{"class":148,"line":605},[146,16386,16387],{"class":160},"        \"https://your-cdn.com/camera-reference.mp4\"\n",[146,16389,16390],{"class":148,"line":611},[146,16391,16375],{"class":263},[146,16393,16394,16397],{"class":148,"line":617},[146,16395,16396],{"class":160},"    \"audio_urls\"",[146,16398,2693],{"class":263},[146,16400,16401],{"class":148,"line":623},[146,16402,16403],{"class":160},"        \"https://your-cdn.com/background-track.mp3\"\n",[146,16405,16406],{"class":148,"line":628},[146,16407,16375],{"class":263},[146,16409,16410,16412,16414,16417],{"class":148,"line":639},[146,16411,3697],{"class":160},[146,16413,437],{"class":263},[146,16415,16416],{"class":156},"12",[146,16418,452],{"class":263},[146,16420,16421,16423,16425,16427],{"class":148,"line":654},[146,16422,3709],{"class":160},[146,16424,437],{"class":263},[146,16426,1368],{"class":160},[146,16428,452],{"class":263},[146,16430,16431,16433,16435,16437],{"class":148,"line":660},[146,16432,3721],{"class":160},[146,16434,437],{"class":263},[146,16436,1384],{"class":160},[146,16438,452],{"class":263},[146,16440,16441,16443,16445],{"class":148,"line":671},[146,16442,3737],{"class":160},[146,16444,437],{"class":263},[146,16446,3742],{"class":156},[146,16448,16449],{"class":148,"line":698},[146,16450,469],{"class":263},[146,16452,16453],{"class":148,"line":710},[146,16454,376],{"emptyLinePlaceholder":58},[146,16456,16457,16459,16461],{"class":148,"line":716},[146,16458,12238],{"class":263},[146,16460,267],{"class":259},[146,16462,16463],{"class":263}," generate_video(multimodal_payload)\n",[11,16465,16466],{},[2621,16467,16284],{},[14377,16469,16470,16475,16478],{"style":14379},[11,16471,16472],{},[23,16473,16474],{},"EvoLink Video Generation API 시작하기",[11,16476,16477],{},"무료 티어 제공. 하나의 API 키로 여러 모델 사용. Seedance 2.0 통합 준비 완료 -- 바이트댄스가 접근을 개방하는 즉시 활성화됩니다.",[11,16479,16480],{},[37,16481,16483],{"href":16482},"/early-access","무료 API 키 받기 →",[92,16485,16487],{"id":16486},"전체-api-파라미터-레퍼런스","전체 API 파라미터 레퍼런스",[11,16489,16490],{},"EvoLink을 통해 Seedance 2.0에 지원되는 전체 파라미터 목록입니다.",[2035,16492,16493,16506],{},[2038,16494,16495],{},[2041,16496,16497,16499,16501,16504],{},[2044,16498,3403],{},[2044,16500,3406],{},[2044,16502,16503],{"align":13819},"필수",[2044,16505,3415],{},[2051,16507,16508,16522,16543,16559,16574,16589,16602,16621,16648,16661],{},[2041,16509,16510,16514,16516,16518],{},[2056,16511,16512],{},[28,16513,1747],{},[2056,16515,3426],{},[2056,16517,13859],{"align":13819},[2056,16519,16520],{},[28,16521,1308],{},[2041,16523,16524,16528,16530,16532],{},[2056,16525,16526],{},[28,16527,1762],{},[2056,16529,3426],{},[2056,16531,13859],{"align":13819},[2056,16533,16534,16535,400,16537,400,16539,16542],{},"최대 2000 토큰. ",[28,16536,2911],{},[28,16538,11427],{},[28,16540,16541],{},"@Audio1"," 레퍼런스 지원",[2041,16544,16545,16549,16553,16556],{},[2056,16546,16547],{},[28,16548,2898],{},[2056,16550,3426,16551],{},[146,16552],{},[2056,16554,16555],{"align":13819},"--",[2056,16557,16558],{},"최대 9개 이미지, 각 최대 30MB. 형식: jpeg, png, webp, bmp, tiff, gif",[2041,16560,16561,16565,16569,16571],{},[2056,16562,16563],{},[28,16564,3570],{},[2056,16566,3426,16567],{},[146,16568],{},[2056,16570,16555],{"align":13819},[2056,16572,16573],{},"최대 3개 영상, 총 2~15초, 각 최대 50MB. 형식: mp4, mov",[2041,16575,16576,16580,16584,16586],{},[2056,16577,16578],{},[28,16579,3587],{},[2056,16581,3426,16582],{},[146,16583],{},[2056,16585,16555],{"align":13819},[2056,16587,16588],{},"최대 3개 오디오 트랙, 총 15초 이하, 각 최대 15MB. 형식: mp3, wav",[2041,16590,16591,16595,16597,16599],{},[2056,16592,16593],{},[28,16594,1774],{},[2056,16596,3461],{},[2056,16598,16555],{"align":13819},[2056,16600,16601],{},"4~15초 (기본값: 5)",[2041,16603,16604,16608,16610,16612],{},[2056,16605,16606],{},[28,16607,1782],{},[2056,16609,3426],{},[2056,16611,16555],{"align":13819},[2056,16613,16614,400,16616,16618,16619],{},[28,16615,4017],{},[28,16617,1368],{}," (기본값), ",[28,16620,3714],{},[2041,16622,16623,16627,16629,16631],{},[2056,16624,16625],{},[28,16626,1802],{},[2056,16628,3426],{},[2056,16630,16555],{"align":13819},[2056,16632,16633,16618,16635,400,16637,400,16639,400,16641,400,16643,400,16645],{},[28,16634,1384],{},[28,16636,3726],{},[28,16638,6143],{},[28,16640,6148],{},[28,16642,6153],{},[28,16644,3837],{},[28,16646,16647],{},"\"adaptive\"",[2041,16649,16650,16654,16656,16658],{},[2056,16651,16652],{},[28,16653,1822],{},[2056,16655,3533],{},[2056,16657,16555],{"align":13819},[2056,16659,16660],{},"동기화된 오디오 생성 활성화 (기본값: true)",[2041,16662,16663,16667,16669,16671],{},[2056,16664,16665],{},[28,16666,3603],{},[2056,16668,3426],{},[2056,16670,16555],{"align":13819},[2056,16672,16673],{},"작업 완료 알림을 위한 HTTPS 웹훅 URL",[11,16675,16676,16679],{},[23,16677,16678],{},"입력 제한:"," 모든 모달리티 합산 최대 12개 파일. 사실적인 사람 얼굴 업로드는 자동으로 거부됩니다. 모든 URL은 서버에서 직접 접근 가능해야 합니다.",[11,16681,16682,16685,16686,16691,16692,16694],{},[23,16683,16684],{},"작업 흐름:"," API는 즉시 작업 ID를 반환합니다. ",[37,16687,16690],{"href":16688,"rel":16689},"https://docs.evolink.ai/en/api-manual/task-management/get-task-detail",[41],"작업 상태 엔드포인트","를 폴링하거나 ",[28,16693,3603],{}," 웹훅을 사용하여 완료 알림을 받을 수 있습니다. 생성된 영상 URL은 24시간 동안 유효하므로, 신속하게 다운로드하여 저장하세요.",[92,16696,16698],{"id":16697},"멀티모델-페일오버-출시-연기-기간에도-파이프라인-유지","멀티모델 페일오버: 출시 연기 기간에도 파이프라인 유지",[11,16700,16701],{},"EvoLink의 통합 API 아키텍처가 Seedance 2.0 저작권 지연 기간 동안 실질적 가치를 발휘하는 부분입니다. 각 모델별로 별도의 통합을 구축하고 유지하는 대신, 단일 코드 경로로 자동 페일오버를 구현할 수 있습니다.",[137,16703,16705],{"className":338,"code":16704,"language":340,"meta":142,"style":142},"# Multi-model failover — your pipeline never stops\nMODEL_PRIORITY = [\n    \"seedance-2.0\",  # Preferred: best multimodal capabilities\n    \"kling\",          # Fallback 1: strong motion quality\n    \"veo-2\",          # Fallback 2: high visual fidelity\n    \"sora\",           # Fallback 3: robust safety, good adherence\n]\n\ndef generate_with_failover(prompt, duration=10, quality=\"720p\",\n                           aspect_ratio=\"16:9\", **kwargs):\n    \"\"\"Try models in priority order. First success wins.\"\"\"\n    errors = {}\n    for model in MODEL_PRIORITY:\n        try:\n            payload = {\n                \"model\": model,\n                \"prompt\": prompt,\n                \"duration\": duration,\n                \"quality\": quality,\n                \"aspect_ratio\": aspect_ratio,\n                **kwargs\n            }\n            result = generate_video(payload)\n            print(f\"✅ Generated with: {model}\")\n            return result\n        except Exception as e:\n            errors[model] = str(e)\n            print(f\"⚠️ {model} unavailable: {e}\")\n            continue\n\n    raise Exception(f\"All models failed: {errors}\")\n\n# Your application code stays the same regardless of model availability\nresult = generate_with_failover(\n    prompt=\"Cinematic drone shot over a mountain lake at sunrise. \"\n           \"Mist rises from the water surface. Golden light breaks \"\n           \"through clouds and reflects off the still water. \"\n           \"Slow, majestic camera movement.\",\n    duration=10,\n    quality=\"720p\",\n    aspect_ratio=\"16:9\",\n    generate_audio=True\n)\n",[28,16706,16707,16712,16721,16731,16741,16751,16762,16766,16770,16793,16810,16815,16824,16838,16844,16853,16861,16868,16876,16884,16892,16900,16905,16914,16935,16941,16951,16964,16994,16998,17002,17026,17030,17035,17044,17054,17059,17064,17071,17082,17093,17104,17113],{"__ignoreMap":142},[146,16708,16709],{"class":148,"line":149},[146,16710,16711],{"class":175},"# Multi-model failover — your pipeline never stops\n",[146,16713,16714,16717,16719],{"class":148,"line":167},[146,16715,16716],{"class":156},"MODEL_PRIORITY",[146,16718,391],{"class":259},[146,16720,8868],{"class":263},[146,16722,16723,16726,16728],{"class":148,"line":179},[146,16724,16725],{"class":160},"    \"seedance-2.0\"",[146,16727,1447],{"class":263},[146,16729,16730],{"class":175},"# Preferred: best multimodal capabilities\n",[146,16732,16733,16736,16738],{"class":148,"line":188},[146,16734,16735],{"class":160},"    \"kling\"",[146,16737,1311],{"class":263},[146,16739,16740],{"class":175},"# Fallback 1: strong motion quality\n",[146,16742,16743,16746,16748],{"class":148,"line":373},[146,16744,16745],{"class":160},"    \"veo-2\"",[146,16747,1311],{"class":263},[146,16749,16750],{"class":175},"# Fallback 2: high visual fidelity\n",[146,16752,16753,16756,16759],{"class":148,"line":379},[146,16754,16755],{"class":160},"    \"sora\"",[146,16757,16758],{"class":263},",           ",[146,16760,16761],{"class":175},"# Fallback 3: robust safety, good adherence\n",[146,16763,16764],{"class":148,"line":385},[146,16765,764],{"class":263},[146,16767,16768],{"class":148,"line":409},[146,16769,376],{"emptyLinePlaceholder":58},[146,16771,16772,16774,16777,16780,16782,16784,16787,16789,16791],{"class":148,"line":420},[146,16773,526],{"class":259},[146,16775,16776],{"class":152}," generate_with_failover",[146,16778,16779],{"class":263},"(prompt, duration",[146,16781,267],{"class":259},[146,16783,537],{"class":156},[146,16785,16786],{"class":263},", quality",[146,16788,267],{"class":259},[146,16790,1368],{"class":160},[146,16792,452],{"class":263},[146,16794,16795,16798,16800,16802,16804,16807],{"class":148,"line":431},[146,16796,16797],{"class":263},"                           aspect_ratio",[146,16799,267],{"class":259},[146,16801,1384],{"class":160},[146,16803,400],{"class":263},[146,16805,16806],{"class":259},"**",[146,16808,16809],{"class":263},"kwargs):\n",[146,16811,16812],{"class":148,"line":455},[146,16813,16814],{"class":160},"    \"\"\"Try models in priority order. First success wins.\"\"\"\n",[146,16816,16817,16819,16821],{"class":148,"line":466},[146,16818,5874],{"class":263},[146,16820,267],{"class":259},[146,16822,16823],{"class":263}," {}\n",[146,16825,16826,16828,16831,16833,16836],{"class":148,"line":600},[146,16827,5122],{"class":259},[146,16829,16830],{"class":263}," model ",[146,16832,1180],{"class":259},[146,16834,16835],{"class":156}," MODEL_PRIORITY",[146,16837,860],{"class":263},[146,16839,16840,16842],{"class":148,"line":605},[146,16841,5138],{"class":259},[146,16843,860],{"class":263},[146,16845,16846,16849,16851],{"class":148,"line":611},[146,16847,16848],{"class":263},"            payload ",[146,16850,267],{"class":259},[146,16852,428],{"class":263},[146,16854,16855,16858],{"class":148,"line":617},[146,16856,16857],{"class":160},"                \"model\"",[146,16859,16860],{"class":263},": model,\n",[146,16862,16863,16866],{"class":148,"line":623},[146,16864,16865],{"class":160},"                \"prompt\"",[146,16867,8492],{"class":263},[146,16869,16870,16873],{"class":148,"line":628},[146,16871,16872],{"class":160},"                \"duration\"",[146,16874,16875],{"class":263},": duration,\n",[146,16877,16878,16881],{"class":148,"line":639},[146,16879,16880],{"class":160},"                \"quality\"",[146,16882,16883],{"class":263},": quality,\n",[146,16885,16886,16889],{"class":148,"line":654},[146,16887,16888],{"class":160},"                \"aspect_ratio\"",[146,16890,16891],{"class":263},": aspect_ratio,\n",[146,16893,16894,16897],{"class":148,"line":660},[146,16895,16896],{"class":259},"                **",[146,16898,16899],{"class":263},"kwargs\n",[146,16901,16902],{"class":148,"line":671},[146,16903,16904],{"class":263},"            }\n",[146,16906,16907,16909,16911],{"class":148,"line":698},[146,16908,8574],{"class":263},[146,16910,267],{"class":259},[146,16912,16913],{"class":263}," generate_video(payload)\n",[146,16915,16916,16918,16920,16922,16925,16927,16929,16931,16933],{"class":148,"line":710},[146,16917,5580],{"class":156},[146,16919,794],{"class":263},[146,16921,440],{"class":259},[146,16923,16924],{"class":160},"\"✅ Generated with: ",[146,16926,685],{"class":156},[146,16928,1747],{"class":263},[146,16930,691],{"class":156},[146,16932,449],{"class":160},[146,16934,406],{"class":263},[146,16936,16937,16939],{"class":148,"line":716},[146,16938,866],{"class":259},[146,16940,1706],{"class":263},[146,16942,16943,16945,16947,16949],{"class":148,"line":722},[146,16944,5537],{"class":259},[146,16946,7065],{"class":156},[146,16948,7068],{"class":259},[146,16950,5655],{"class":263},[146,16952,16953,16956,16958,16961],{"class":148,"line":728},[146,16954,16955],{"class":263},"            errors[model] ",[146,16957,267],{"class":259},[146,16959,16960],{"class":156}," str",[146,16962,16963],{"class":263},"(e)\n",[146,16965,16966,16968,16970,16972,16975,16977,16979,16981,16984,16986,16988,16990,16992],{"class":148,"line":739},[146,16967,5580],{"class":156},[146,16969,794],{"class":263},[146,16971,440],{"class":259},[146,16973,16974],{"class":160},"\"⚠️ ",[146,16976,685],{"class":156},[146,16978,1747],{"class":263},[146,16980,691],{"class":156},[146,16982,16983],{"class":160}," unavailable: ",[146,16985,685],{"class":156},[146,16987,5705],{"class":263},[146,16989,691],{"class":156},[146,16991,449],{"class":160},[146,16993,406],{"class":263},[146,16995,16996],{"class":148,"line":744},[146,16997,5637],{"class":259},[146,16999,17000],{"class":148,"line":750},[146,17001,376],{"emptyLinePlaceholder":58},[146,17003,17004,17006,17008,17010,17012,17015,17017,17020,17022,17024],{"class":148,"line":767},[146,17005,996],{"class":259},[146,17007,7065],{"class":156},[146,17009,794],{"class":263},[146,17011,440],{"class":259},[146,17013,17014],{"class":160},"\"All models failed: ",[146,17016,685],{"class":156},[146,17018,17019],{"class":263},"errors",[146,17021,691],{"class":156},[146,17023,449],{"class":160},[146,17025,406],{"class":263},[146,17027,17028],{"class":148,"line":788},[146,17029,376],{"emptyLinePlaceholder":58},[146,17031,17032],{"class":148,"line":834},[146,17033,17034],{"class":175},"# Your application code stays the same regardless of model availability\n",[146,17036,17037,17039,17041],{"class":148,"line":839},[146,17038,12238],{"class":263},[146,17040,267],{"class":259},[146,17042,17043],{"class":263}," generate_with_failover(\n",[146,17045,17046,17049,17051],{"class":148,"line":845},[146,17047,17048],{"class":701},"    prompt",[146,17050,267],{"class":259},[146,17052,17053],{"class":160},"\"Cinematic drone shot over a mountain lake at sunrise. \"\n",[146,17055,17056],{"class":148,"line":863},[146,17057,17058],{"class":160},"           \"Mist rises from the water surface. Golden light breaks \"\n",[146,17060,17061],{"class":148,"line":872},[146,17062,17063],{"class":160},"           \"through clouds and reflects off the still water. \"\n",[146,17065,17066,17069],{"class":148,"line":887},[146,17067,17068],{"class":160},"           \"Slow, majestic camera movement.\"",[146,17070,452],{"class":263},[146,17072,17073,17076,17078,17080],{"class":148,"line":903},[146,17074,17075],{"class":701},"    duration",[146,17077,267],{"class":259},[146,17079,537],{"class":156},[146,17081,452],{"class":263},[146,17083,17084,17087,17089,17091],{"class":148,"line":915},[146,17085,17086],{"class":701},"    quality",[146,17088,267],{"class":259},[146,17090,1368],{"class":160},[146,17092,452],{"class":263},[146,17094,17095,17098,17100,17102],{"class":148,"line":953},[146,17096,17097],{"class":701},"    aspect_ratio",[146,17099,267],{"class":259},[146,17101,1384],{"class":160},[146,17103,452],{"class":263},[146,17105,17106,17109,17111],{"class":148,"line":959},[146,17107,17108],{"class":701},"    generate_audio",[146,17110,267],{"class":259},[146,17112,3742],{"class":156},[146,17114,17115],{"class":148,"line":964},[146,17116,406],{"class":263},[11,17118,17119],{},[2621,17120,16284],{},[11,17122,17123],{},"Seedance 2.0이 지연되는 동안에도, 파이프라인은 동일한 EvoLink 엔드포인트를 통해 Kling, Veo, 또는 Sora로 영상을 생성합니다. Seedance가 다시 온라인으로 돌아오는 순간, 우선순위 목록에 그대로 들어갑니다 -- 마이그레이션도, 코드 변경도, 다운타임도 없습니다.",[11,17125,17126],{},"이것은 현재의 지연에만 해당되는 이야기가 아닙니다. 모델 가용성은 본질적으로 예측 불가능합니다 -- 속도 제한, 유지보수, 정책 변경, 그리고 법적 조치까지 언제든 어떤 모델이라도 오프라인으로 만들 수 있습니다. 처음부터 모델에 구애받지 않는 설계를 하는 것은 상황이 변할 때마다 효과를 발휘하는 전략적 결정입니다.",[11,17128,17129,17130,13800],{},"Python, Node.js, cURL 예제를 포함한 작업 관리, 웹훅, 에러 처리 등 전체 API 문서는 ",[37,17131,17132],{"href":14392},"EvoLink Video Generation Docs",[48,17134,9067],{"id":9066},[92,17136,17138],{"id":17137},"seedance-20-api는-여전히-출시되나요","Seedance 2.0 API는 여전히 출시되나요?",[11,17140,17141,17142,17146,17147,17151],{},"네, 하지만 시기가 불확실합니다. 바이트댄스는 얼굴 감지, 저작권 캐릭터 차단, 워터마킹 등 저작권 안전장치를 구현하기 위해 원래 2026년 2월 24일로 예정된 출시를 연기했습니다(",[37,17143,17145],{"href":13676,"rel":17144},[41],"조선일보, 2/22","; ",[37,17148,17150],{"href":13649,"rel":17149},[41],"Hacker News, 2/21","). 대체 출시일은 공식 발표되지 않았습니다. 바이트댄스의 안전장치 구현이 자사 법무팀과, 아마도 MPA 경고장에서 제기된 핵심 우려 사항을 해소할 때까지 지연이 지속될 것입니다. 현실적으로 수 주에서 수 개월이 예상됩니다.",[92,17153,9202],{"id":9201},[11,17155,17156,17157,13800],{},"무엇을 생성하느냐에 전적으로 달려 있습니다. 저작권 자산, 실존 인물, 상표 등록 브랜드를 참조하지 않고 오리지널 캐릭터와 장면을 묘사하는 독창적 프롬프트로 만든 콘텐츠가 법적 리스크가 가장 낮습니다. 기존 IP를 의도적이거나 부주의하게 복제하는 콘텐츠는 상당한 리스크를 수반하며, 이는 어떤 AI 모델이 생성하든 마찬가지입니다. API가 출시되면 Seedance 2.0의 이용약관에서 구체적인 상업적 사용 조항을 꼼꼼히 확인하시고, 고위험 또는 대규모 배포 상업 프로젝트에 대해서는 지식재산 법률 전문가와 상담하세요. 실용적인 프레임워크는 위의 ",[37,17158,17160],{"href":17159},"#enterprise-compliance-checklist","컴플라이언스 체크리스트",[92,17162,17164],{"id":17163},"이미-생성한-seedance-영상이-삭제될-수-있나요","이미 생성한 Seedance 영상이 삭제될 수 있나요?",[11,17166,17167],{},"바이트댄스가 Seedance 2.0 웹 인터페이스를 통해 이미 생성된 콘텐츠를 소급하여 제거할 계획이 있다는 징후는 없습니다. MPA의 경고장은 플랫폼으로서 바이트댄스의 관행을 대상으로 하며, 개별 사용자나 그들의 출력물을 대상으로 하지 않습니다. 다만, 인식 가능한 저작권 캐릭터나 실존 인물이 포함된 콘텐츠를 생성하여 게시했다면, 권리자로부터 별도의 삭제 요청(DMCA 통지 또는 이에 상응하는 조치)을 받을 수 있습니다. 이 리스크는 사용한 생성 도구와 무관하게 존재합니다.",[92,17169,17171],{"id":17170},"evolink은-저작권-컴플이언스를-어떻게-처리하나요","EvoLink은 저작권 컴플���이언스를 어떻게 처리하나요?",[11,17173,17174,17175,17178],{},"EvoLink은 통합 API 게이트웨이로, 단일 통합 지점을 통해 여러 영상 생성 모델에 대한 접근을 제공합니다. EvoLink은 프롬프트나 생성된 출력물의 저작권 상태를 필터링, 중재, 또는 검증하지 ",[23,17176,17177],{},"않습니다."," 저작권 준수는 전적으로 개발자의 책임입니다. EvoLink이 제공하는 것은 인프라의 유연성입니다. 특정 모델의 콘텐츠 정책, 가용성, 또는 법적 상황이 요구 사항을 충족하지 못하면, 코드 변경 없이 동일한 API를 통해 다른 모델로 전환할 수 있습니다. 이러한 모델 다양성 자체가 실질적인 리스크 완화 전략입니다 -- 단일 모델의 가용성이나 정책 결정에 종속되지 않기 때문입니다.",[92,17180,17182],{"id":17181},"seedance-api-지연이-계속되면-대안은-무엇인가요","Seedance API 지연이 계속되면 대안은 무엇인가요?",[11,17184,17185],{},"EvoLink의 통합 API를 통해, Seedance에 사용하는 것과 동일한 통합 코드로 프로덕션에 바로 사용 가능한 여러 대안에 접근할 수 있습니다.",[2035,17187,17188,17202],{},[2038,17189,17190],{},[2041,17191,17192,17195,17198,17200],{},[2044,17193,17194],{},"모델",[2044,17196,17197],{},"강점",[2044,17199,13832],{},[2044,17201,2988],{},[2051,17203,17204,17219,17235,17250],{},[2041,17205,17206,17210,17213,17216],{},[2056,17207,17208],{},[23,17209,13905],{},[2056,17211,17212],{},"우수한 모션 품질, 캐릭터 일관성",[2056,17214,17215],{},"보통 수준 필터링",[2056,17217,17218],{},"액션, 캐릭터 애니메이션",[2041,17220,17221,17226,17229,17232],{},[2056,17222,17223],{},[23,17224,17225],{},"Veo 2",[2056,17227,17228],{},"높은 시각적 정밀도, Google 안전 인프라",[2056,17230,17231],{},"엄격한 필터링",[2056,17233,17234],{},"프리미엄 품질, 브랜드 세이프 콘텐츠",[2041,17236,17237,17242,17245,17247],{},[2056,17238,17239],{},[23,17240,17241],{},"Sora",[2056,17243,17244],{},"우수한 프롬프트 준수, OpenAI 안전 스택",[2056,17246,17231],{},[2056,17248,17249],{},"내러티브 콘텐츠, 정밀한 디렉션",[2041,17251,17252,17256,17259,17261],{},[2056,17253,17254],{},[23,17255,13888],{},[2056,17257,17258],{},"확립된 생태계, 양호한 모션",[2056,17260,17215],{},[2056,17262,17263],{},"범용, 빠른 반복",[11,17265,17266,17267,13800],{},"각 모델은 서로 다른 강점, 콘텐츠 정책, 가격, 가용성을 가지고 있습니다. EvoLink의 멀티모델 아키텍처를 통해 별도의 통합을 구축하지 않고도 모든 모델을 평가할 수 있습니다. 위의 페일오버 코드 예제는 가용성에 따라 자동으로 모델을 전환하는 방법을 보여줍니다. 모델별 파라미터와 성능 비교는 ",[37,17268,17269],{"href":14392},"Video Generation API 문서",[45,17271],{},[48,17273,17275],{"id":17274},"앞으로의-전망","앞으로의 전망",[11,17277,17278],{},"Seedance 2.0 저작권 상황은 현재도 진행 중입니다. 바이트댄스가 구현하는 안전장치는 API가 생성할 수 있는 것과 없는 것을 재정의할 것입니다. AI 영상 생성에 대한 법적 선례는 Seedance뿐만 아니라 이 분야의 모든 플랫폼에 영향을 미칠 것입니다.",[11,17280,17281],{},"개발자에게 실질적인 방향은 명확합니다.",[70,17283,17284,17290,17296,17302,17308],{},[73,17285,17286,17289],{},[23,17287,17288],{},"모델에 구애받지 않게 구축하세요."," 프로덕션 파이프라인을 단일 모델의 가용성이나 법적 상태에 의존하지 마세요. 코드 변경 없이 모델을 전환할 수 있는 통합 API를 사용하세요.",[73,17291,17292,17295],{},[23,17293,17294],{},"안전하게 프롬프트를 작성하세요."," 독창적인 묘사, 오리지널 캐릭터, 자체 레퍼런스 자산을 사용하세요. 법적으로 가장 안전한 콘텐츠가 상업적으로도 가장 가치 있는 콘텐츠입니다 -- 왜냐하면 온전히 귀하의 것이기 때문입니다.",[73,17297,17298,17301],{},[23,17299,17300],{},"정보를 지속적으로 파악하세요."," AI 생성 콘텐츠를 둘러싼 법적 환경은 매달 변하고 있습니다. MPA vs. 바이트댄스 상황과 법원에서 진행 중인 AI 저작권 소송의 동향을 주시하세요.",[73,17303,17304,17307],{},[23,17305,17306],{},"모든 것을 문서화하세요."," 프롬프트, 파라미터, 창작 의도, 검토 프로세스의 기록을 보관하세요. 문제가 제기될 경우, 선의(good faith)의 컴플라이언스 노력이 중요합니다.",[73,17309,17310,17313],{},[23,17311,17312],{},"당황하지 마세요."," 하늘이 무너지는 것이 아닙니다. AI 영상 생성은 혁신적인 역량이며, 법적 프레임워크도 이를 수용하도록 발전할 것입니다. 지금 책임감 있게 구축하는 개발자가 규칙이 확립되었을 때 유리한 위치에 서게 됩니다.",[11,17315,17316],{},"이 가이드는 상황이 진전됨에 따라 업데이트할 예정입니다. 북마크해두시고, 새로운 동향이 있을 때 다시 확인하세요.",[14377,17318,17319,17324,17327],{"style":14379},[11,17320,17321],{},[23,17322,17323],{},"다양한 AI 영상 모델로 자신 있게 개발하세요",[11,17325,17326],{},"EvoLink은 Seedance 2.0, Kling, Veo, Sora 등을 위한 하나의 API를 제공합니다. 무료로 시작하세요 -- 언제든 모델을 전환할 수 있으며, 종속(lock-in)이 없습니다.",[11,17328,17329],{},[37,17330,16483],{"href":16482},[11,17332,17333],{},[2621,17334,17335],{},"최종 업데이트: 2026년 2월 23일. 이 기사는 Seedance 2.0 저작권 상황이 진전됨에 따라 업데이트됩니다.",[11222,17337,17338],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}",{"title":142,"searchDepth":167,"depth":167,"links":17340},[17341,17346,17352,17357,17362,17370,17376,17383],{"id":13515,"depth":167,"text":13516,"children":17342},[17343,17344,17345],{"id":13525,"depth":179,"text":13526},{"id":13574,"depth":179,"text":13575},{"id":13682,"depth":179,"text":13683},{"id":13734,"depth":167,"text":13735,"children":17347},[17348,17349,17350,17351],{"id":13741,"depth":179,"text":13742},{"id":13759,"depth":179,"text":13760},{"id":13803,"depth":179,"text":13804},{"id":13939,"depth":179,"text":13940},{"id":13955,"depth":167,"text":13956,"children":17353},[17354,17355,17356],{"id":13962,"depth":179,"text":13963},{"id":14007,"depth":179,"text":14008},{"id":14041,"depth":179,"text":14042},{"id":14109,"depth":167,"text":14110,"children":17358},[17359,17360,17361],{"id":14122,"depth":179,"text":14123},{"id":14171,"depth":179,"text":14172},{"id":14275,"depth":179,"text":14276},{"id":14396,"depth":167,"text":14397,"children":17363},[17364,17365,17366,17367,17368,17369],{"id":14409,"depth":179,"text":14410},{"id":14520,"depth":179,"text":14521},{"id":14597,"depth":179,"text":14598},{"id":14650,"depth":179,"text":14651},{"id":15313,"depth":179,"text":15314},{"id":15458,"depth":179,"text":15459},{"id":16127,"depth":167,"text":16128,"children":17371},[17372,17373,17374,17375],{"id":16151,"depth":179,"text":16152},{"id":16287,"depth":179,"text":16288},{"id":16486,"depth":179,"text":16487},{"id":16697,"depth":179,"text":16698},{"id":9066,"depth":167,"text":9067,"children":17377},[17378,17379,17380,17381,17382],{"id":17137,"depth":179,"text":17138},{"id":9201,"depth":179,"text":9202},{"id":17163,"depth":179,"text":17164},{"id":17170,"depth":179,"text":17171},{"id":17181,"depth":179,"text":17182},{"id":17274,"depth":167,"text":17275},"MPA 경고장, API 출시 연기, 그리고 프로젝트에 미치는 영향. Seedance 2.0 API로 상업용 영상을 안전하게 제작하기 위한 완벽 가이드.",{"date":17386,"image":17387,"seoTitle":17388,"author":17389},"2026-02-23","/copyright-guide-hero.webp","Seedance 2.0 저작권 가이드 - API 개발자를 위한 필수 안내 (2026)","EvoLink Team","/ko/blog/seedance-2-copyright-api-guide",{"title":13504,"description":17384},"ko/blog/seedance-2-copyright-api-guide","4sE3r-HGW3wF7RWCxiLZmoRsBeQ49rm4QK242xEpj-8",{"id":17395,"title":17396,"body":17397,"description":23100,"extension":11284,"meta":23101,"navigation":58,"path":23105,"seo":23106,"stem":23107,"__hash__":23108},"content/ko/blog/seedance-2-ecommerce-product-videos.md","Seedance 2.0 API로 이커머스 AI 상품 영상 제작하기",{"type":8,"value":17398,"toc":23049},[17399,17408,17412,17427,17430,17524,17527,17530,17533,17537,17540,17543,17547,17557,17560,17572,17575,17578,18119,18127,18133,18144,18151,18157,18161,18164,18169,18172,18285,18288,18300,18306,18312,18318,18322,18380,18383,18387,18390,18396,18402,18408,18414,18421,18424,18428,18431,18436,18553,18556,18560,18566,18572,18578,18584,18590,18596,18599,18603,18606,18632,18635,18642,18646,18649,18658,18788,18791,18796,18804,18813,18817,18900,18903,18907,18916,18919,18933,18942,18952,18956,18959,19086,19090,19093,19125,19129,19135,19141,19147,19153,19159,19165,19171,19177,19183,19187,19190,19317,19320,19324,19327,19333,19339,19345,19348,19354,19358,19361,19364,19368,19371,19397,19400,19403,19407,19410,19543,19547,19550,19994,19997,20000,20004,20007,20010,20014,20017,20049,20055,20059,20062,20065,20102,20107,21921,21924,21928,21937,22025,22028,22032,22077,22081,22084,22094,22103,22109,22115,22119,22125,22875,22882,22886,22889,22892,22918,22921,22923,22927,22936,22940,22943,22947,22953,22957,22960,22964,22967,22971,22974,22978,22991,22995,23004,23008,23011,23014,23017,23020,23023,23030,23032,23047],[11,17400,17401,17402,17407],{},"카탈로그의 모든 상품에는 영상이 필요합니다. 이제 상품 사진 한 장으로 3분 이내에 완성도 높은 영상 광고를 만들 수 있습니다. 촬영팀도, 스튜디오 대여도, 후반 작업 일정도 필요 없습니다. ",[37,17403,17406],{"href":17404,"rel":17405},"https://seed.bytedance.com/en/seedance2_0",[41],"Seedance 2.0"," — ByteDance의 최신 영상 생성 모델 — 은 간단한 API 호출 하나로 정적인 상품 이미지를 방송 품질의 클립으로 변환합니다. 이 가이드에서는 이커머스를 위한 5가지 영상 유형, 전체 카탈로그 대상 배치 파이프라인, 멀티 플랫폼 내보내기 전략을 안내합니다. 모든 코드 예제는 프로덕션 환경에서 바로 사용할 수 있는 Python입니다.",[48,17409,17411],{"id":17410},"상품-영상이-중요한-이유-그리고-스튜디오가-구식이-되는-이유","상품 영상이 중요한 이유 (그리고 스튜디오가 구식이 되는 이유)",[11,17413,17414,17415,17420,17421,17426],{},"영상이 포함된 상품 리스팅은 일관되게 영상이 없는 리스팅보다 높은 성과를 보입니다. ",[37,17416,17419],{"href":17417,"rel":17418},"https://www.shopify.com/blog/product-photography-tips",[41],"Shopify의 상품 미디어 모범 사례","에 따르면, 상품 페이지에 영상을 추가한 판매자는 참여도와 전환율이 측정 가능하게 높아졌습니다. Amazon 자체 ",[37,17422,17425],{"href":17423,"rel":17424},"https://sellercentral.amazon.com/help/hub/reference/G202124160",[41],"셀러 가이드라인","도 모든 리스팅에 영상을 적극 권장하고 있으며, A+ Content 프로그램에서는 영상이 포함된 페이지를 검색 결과에서 우선 표시합니다.",[11,17428,17429],{},"\"영상이 효과적이라는 것을 아는 것\"과 \"실제로 영상을 제작하는 것\" 사이의 격차는 역사적으로 매우 컸습니다. 스튜디오 시간, 조명, 장비, 촬영 기사, 기본 편집을 포함한 상품 영상 촬영 한 건의 비용은 일반적으로 SKU당 $500~$2,000입니다. 200개 상품이 있는 카탈로그라면 파일 하나 업로드하기도 전에 6자리 비용이 발생합니다.",[2035,17431,17432,17444],{},[2038,17433,17434],{},[2041,17435,17436,17438,17441],{},[2044,17437],{},[2044,17439,17440],{},"기존 스튜디오",[2044,17442,17443],{},"Seedance 2.0 API",[2051,17445,17446,17459,17472,17485,17498,17511],{},[2041,17447,17448,17453,17456],{},[2056,17449,17450],{},[23,17451,17452],{},"영상당 비용",[2056,17454,17455],{},"$500~$2,000",[2056,17457,17458],{},"$0.02~$0.15",[2041,17460,17461,17466,17469],{},[2056,17462,17463],{},[23,17464,17465],{},"소요 시간",[2056,17467,17468],{},"영업일 기준 3~10일",[2056,17470,17471],{},"60~180초",[2041,17473,17474,17479,17482],{},[2056,17475,17476],{},[23,17477,17478],{},"필요한 준비물",[2056,17480,17481],{},"스튜디오, 촬영팀, 장비",[2056,17483,17484],{},"상품 사진 한 장",[2041,17486,17487,17492,17495],{},[2056,17488,17489],{},[23,17490,17491],{},"500 SKU로 확장",[2056,17493,17494],{},"$250K~$1M+",[2056,17496,17497],{},"$75 미만",[2041,17499,17500,17505,17508],{},[2056,17501,17502],{},[23,17503,17504],{},"수정 속도",[2056,17506,17507],{},"재촬영 필요",[2056,17509,17510],{},"프롬프트 변경 후 재생성",[2041,17512,17513,17518,17521],{},[2056,17514,17515],{},[23,17516,17517],{},"화면 비율 변형",[2056,17519,17520],{},"포맷별 별도 편집",[2056,17522,17523],{},"파라미터 하나 변경",[11,17525,17526],{},"경제성은 비교 자체가 불가능합니다. AI 상품 영상 생성은 $50,000짜리 브랜드 필름을 대체하는 것이 아닙니다. 대부분의 이커머스 팀이 완전히 건너뛰거나 높은 비용으로 외주를 주는 반복적인 SKU별 영상 작업을 대체합니다.",[11,17528,17529],{},"300개 SKU를 보유한 중견 Shopify 스토어의 비용을 계산해 보겠습니다. 전체 카탈로그에 대한 기존 스튜디오 영상: $150K~$600K, 여기에 수개월의 스케줄링과 제작 기간이 추가됩니다. 동일한 카탈로그에 Seedance 2.0 API를 사용하면: 총 $50 미만, 오후 한나절이면 완료됩니다. 파이프라인 구축을 위한 개발자 시간을 감안하더라도, 투자 수익률은 몇 배나 더 높습니다.",[11,17531,17532],{},"이러한 변화는 10년 전 상품 사진 촬영에서 일어났던 것과 같은 패턴입니다. 스튜디오가 사라진 것은 아니지만, 일상적인 작업은 자동화된 솔루션으로 이동했습니다. 영상도 같은 궤적을 따르고 있으며, 속도만 더 빠릅니다.",[92,17534,17536],{"id":17535},"영상의-전환율-효과","영상의 전환율 효과",[11,17538,17539],{},"업계 보고서들은 일관되게 영상이 포함된 상품 페이지가 그렇지 않은 페이지보다 높은 성과를 보인다고 나타냅니다. Shopify 자체 연구에 따르면 영상은 페이지 체류 시간을 늘리고 구매자가 상품을 더 잘 이해하도록 도와 반품률을 줄입니다. Amazon은 영상이 포함된 리스팅이 검색 결과에서 더 높은 클릭률을 보인다고 보고합니다.",[11,17541,17542],{},"구체적인 수치는 카테고리와 시장에 따라 다르지만, 방향성은 명확합니다: 영상은 더 많은 상품을 판매합니다. 영상이 효과적인지에 대한 의문은 없었습니다. 문제는 항상 ROI가 제작 비용을 정당화하는지 여부였습니다. API 가격에서 그 계산은 이미 결론이 났습니다.",[48,17544,17546],{"id":17545},"설정-api-키와-기본-코드","설정: API 키와 기본 코드",[11,17548,17549,17552,17553,1260],{},[37,17550,214],{"href":212,"rel":17551},[41]," 계정과 API 키가 필요합니다. EvoLink는 간단한 REST API를 통해 Seedance 2.0에 대한 액세스를 제공합니다. 아직 계정을 설정하지 않았다면 ",[37,17554,17556],{"href":17555},"/docs/getting-started","시작 가이드",[11,17558,17559],{},"유일한 종속성을 설치합니다:",[137,17561,17562],{"className":139,"code":318,"language":141,"meta":142,"style":142},[28,17563,17564],{"__ignoreMap":142},[146,17565,17566,17568,17570],{"class":148,"line":149},[146,17567,191],{"class":152},[146,17569,194],{"class":160},[146,17571,329],{"class":160},[11,17573,17574],{},"GPU가 필요 없습니다. 모델 다운로드도 없습니다. 관리할 인프라도 없습니다. API가 모든 계산을 서버 측에서 처리합니다. 로컬 머신은 HTTP 요청을 보내고 영상 URL을 받기만 하면 됩니다.",[11,17576,17577],{},"다음은 완전한 기본 코드입니다. 이 가이드의 모든 예제는 이 기반 위에 구축됩니다:",[137,17579,17581],{"className":338,"code":17580,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\ndef generate_video(payload: dict) -> dict:\n    \"\"\"Submit a video generation request and return the task response.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=headers,\n        json=payload\n    )\n    response.raise_for_status()\n    return response.json()\n\n\ndef wait_for_video(task_id: str, poll_interval: int = 5, timeout: int = 300) -> dict:\n    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n        status = task.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"✅ Video ready: {task['output']['video_url']}\")\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"⏳ Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} did not complete within {timeout}s\")\n\n\ndef create_and_wait(payload: dict) -> dict:\n    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n    task = generate_video(payload)\n    task_id = task[\"task_id\"]\n    print(f\"🎬 Task created: {task_id}\")\n    return wait_for_video(task_id)\n",[28,17582,17583,17589,17595,17599,17608,17616,17620,17629,17645,17653,17657,17661,17665,17682,17687,17695,17707,17716,17724,17728,17732,17738,17742,17746,17784,17789,17797,17807,17842,17846,17854,17866,17870,17882,17912,17918,17930,17961,17965,17994,17998,18006,18010,18041,18045,18049,18066,18071,18079,18091,18112],{"__ignoreMap":142},[146,17584,17585,17587],{"class":148,"line":149},[146,17586,347],{"class":259},[146,17588,329],{"class":263},[146,17590,17591,17593],{"class":148,"line":167},[146,17592,347],{"class":259},[146,17594,356],{"class":263},[146,17596,17597],{"class":148,"line":179},[146,17598,376],{"emptyLinePlaceholder":58},[146,17600,17601,17603,17605],{"class":148,"line":188},[146,17602,388],{"class":156},[146,17604,391],{"class":259},[146,17606,17607],{"class":160}," \"YOUR_API_KEY\"\n",[146,17609,17610,17612,17614],{"class":148,"line":373},[146,17611,412],{"class":156},[146,17613,391],{"class":259},[146,17615,417],{"class":160},[146,17617,17618],{"class":148,"line":379},[146,17619,376],{"emptyLinePlaceholder":58},[146,17621,17622,17625,17627],{"class":148,"line":385},[146,17623,17624],{"class":263},"headers ",[146,17626,267],{"class":259},[146,17628,428],{"class":263},[146,17630,17631,17633,17635,17637,17639,17641,17643],{"class":148,"line":409},[146,17632,434],{"class":160},[146,17634,437],{"class":263},[146,17636,440],{"class":259},[146,17638,443],{"class":160},[146,17640,446],{"class":156},[146,17642,449],{"class":160},[146,17644,452],{"class":263},[146,17646,17647,17649,17651],{"class":148,"line":420},[146,17648,458],{"class":160},[146,17650,437],{"class":263},[146,17652,463],{"class":160},[146,17654,17655],{"class":148,"line":431},[146,17656,469],{"class":263},[146,17658,17659],{"class":148,"line":455},[146,17660,376],{"emptyLinePlaceholder":58},[146,17662,17663],{"class":148,"line":466},[146,17664,376],{"emptyLinePlaceholder":58},[146,17666,17667,17669,17671,17674,17676,17678,17680],{"class":148,"line":600},[146,17668,526],{"class":259},[146,17670,14742],{"class":152},[146,17672,17673],{"class":263},"(payload: ",[146,17675,8799],{"class":156},[146,17677,15849],{"class":263},[146,17679,8799],{"class":156},[146,17681,860],{"class":263},[146,17683,17684],{"class":148,"line":605},[146,17685,17686],{"class":160},"    \"\"\"Submit a video generation request and return the task response.\"\"\"\n",[146,17688,17689,17691,17693],{"class":148,"line":611},[146,17690,1427],{"class":263},[146,17692,267],{"class":259},[146,17694,1432],{"class":263},[146,17696,17697,17699,17701,17703,17705],{"class":148,"line":617},[146,17698,1437],{"class":259},[146,17700,449],{"class":160},[146,17702,679],{"class":156},[146,17704,1444],{"class":160},[146,17706,452],{"class":263},[146,17708,17709,17711,17713],{"class":148,"line":623},[146,17710,1455],{"class":701},[146,17712,267],{"class":259},[146,17714,17715],{"class":263},"headers,\n",[146,17717,17718,17720,17722],{"class":148,"line":628},[146,17719,1470],{"class":701},[146,17721,267],{"class":259},[146,17723,2790],{"class":263},[146,17725,17726],{"class":148,"line":639},[146,17727,1483],{"class":263},[146,17729,17730],{"class":148,"line":654},[146,17731,2799],{"class":263},[146,17733,17734,17736],{"class":148,"line":660},[146,17735,1703],{"class":259},[146,17737,736],{"class":263},[146,17739,17740],{"class":148,"line":671},[146,17741,376],{"emptyLinePlaceholder":58},[146,17743,17744],{"class":148,"line":698},[146,17745,376],{"emptyLinePlaceholder":58},[146,17747,17748,17750,17752,17755,17757,17760,17763,17765,17768,17771,17773,17775,17778,17780,17782],{"class":148,"line":710},[146,17749,526],{"class":259},[146,17751,529],{"class":152},[146,17753,17754],{"class":263},"(task_id: ",[146,17756,8674],{"class":156},[146,17758,17759],{"class":263},", poll_interval: ",[146,17761,17762],{"class":156},"int",[146,17764,391],{"class":259},[146,17766,17767],{"class":156}," 5",[146,17769,17770],{"class":263},", timeout: ",[146,17772,17762],{"class":156},[146,17774,391],{"class":259},[146,17776,17777],{"class":156}," 300",[146,17779,15849],{"class":263},[146,17781,8799],{"class":156},[146,17783,860],{"class":263},[146,17785,17786],{"class":148,"line":716},[146,17787,17788],{"class":160},"    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n",[146,17790,17791,17793,17795],{"class":148,"line":722},[146,17792,631],{"class":263},[146,17794,267],{"class":259},[146,17796,636],{"class":156},[146,17798,17799,17801,17803,17805],{"class":148,"line":728},[146,17800,642],{"class":259},[146,17802,645],{"class":263},[146,17804,648],{"class":259},[146,17806,651],{"class":263},[146,17808,17809,17811,17813,17816,17818,17820,17822,17824,17826,17828,17830,17832,17834,17837,17839],{"class":148,"line":739},[146,17810,6932],{"class":263},[146,17812,267],{"class":259},[146,17814,17815],{"class":263}," requests.get(",[146,17817,440],{"class":259},[146,17819,449],{"class":160},[146,17821,679],{"class":156},[146,17823,682],{"class":160},[146,17825,685],{"class":156},[146,17827,688],{"class":263},[146,17829,691],{"class":156},[146,17831,449],{"class":160},[146,17833,400],{"class":263},[146,17835,17836],{"class":701},"headers",[146,17838,267],{"class":259},[146,17840,17841],{"class":263},"headers)\n",[146,17843,17844],{"class":148,"line":744},[146,17845,6959],{"class":263},[146,17847,17848,17850,17852],{"class":148,"line":750},[146,17849,731],{"class":263},[146,17851,267],{"class":259},[146,17853,11777],{"class":263},[146,17855,17856,17858,17860,17862,17864],{"class":148,"line":767},[146,17857,753],{"class":263},[146,17859,267],{"class":259},[146,17861,775],{"class":263},[146,17863,761],{"class":160},[146,17865,406],{"class":263},[146,17867,17868],{"class":148,"line":788},[146,17869,376],{"emptyLinePlaceholder":58},[146,17871,17872,17874,17876,17878,17880],{"class":148,"line":834},[146,17873,848],{"class":259},[146,17875,851],{"class":263},[146,17877,854],{"class":259},[146,17879,857],{"class":160},[146,17881,860],{"class":263},[146,17883,17884,17886,17888,17890,17892,17894,17896,17899,17901,17904,17906,17908,17910],{"class":148,"line":839},[146,17885,5580],{"class":156},[146,17887,794],{"class":263},[146,17889,440],{"class":259},[146,17891,14972],{"class":160},[146,17893,685],{"class":156},[146,17895,1529],{"class":263},[146,17897,17898],{"class":160},"'output'",[146,17900,1562],{"class":263},[146,17902,17903],{"class":160},"'video_url'",[146,17905,1535],{"class":263},[146,17907,691],{"class":156},[146,17909,449],{"class":160},[146,17911,406],{"class":263},[146,17913,17914,17916],{"class":148,"line":845},[146,17915,866],{"class":259},[146,17917,869],{"class":263},[146,17919,17920,17922,17924,17926,17928],{"class":148,"line":863},[146,17921,875],{"class":259},[146,17923,851],{"class":263},[146,17925,854],{"class":259},[146,17927,882],{"class":160},[146,17929,860],{"class":263},[146,17931,17932,17934,17936,17938,17940,17942,17944,17947,17949,17951,17953,17955,17957,17959],{"class":148,"line":872},[146,17933,906],{"class":259},[146,17935,909],{"class":156},[146,17937,794],{"class":263},[146,17939,440],{"class":259},[146,17941,15017],{"class":160},[146,17943,685],{"class":156},[146,17945,17946],{"class":263},"task.get(",[146,17948,11874],{"class":160},[146,17950,400],{"class":263},[146,17952,943],{"class":160},[146,17954,118],{"class":263},[146,17956,691],{"class":156},[146,17958,449],{"class":160},[146,17960,406],{"class":263},[146,17962,17963],{"class":148,"line":887},[146,17964,376],{"emptyLinePlaceholder":58},[146,17966,17967,17969,17971,17973,17976,17978,17980,17982,17984,17986,17988,17990,17992],{"class":148,"line":903},[146,17968,791],{"class":156},[146,17970,794],{"class":263},[146,17972,440],{"class":259},[146,17974,17975],{"class":160},"\"⏳ Status: ",[146,17977,685],{"class":156},[146,17979,814],{"class":263},[146,17981,691],{"class":156},[146,17983,104],{"class":160},[146,17985,685],{"class":156},[146,17987,804],{"class":263},[146,17989,691],{"class":156},[146,17991,11920],{"class":160},[146,17993,406],{"class":263},[146,17995,17996],{"class":148,"line":915},[146,17997,973],{"class":263},[146,17999,18000,18002,18004],{"class":148,"line":953},[146,18001,979],{"class":263},[146,18003,982],{"class":259},[146,18005,985],{"class":263},[146,18007,18008],{"class":148,"line":959},[146,18009,376],{"emptyLinePlaceholder":58},[146,18011,18012,18014,18016,18018,18020,18022,18024,18026,18028,18031,18033,18035,18037,18039],{"class":148,"line":964},[146,18013,996],{"class":259},[146,18015,999],{"class":156},[146,18017,794],{"class":263},[146,18019,440],{"class":259},[146,18021,921],{"class":160},[146,18023,685],{"class":156},[146,18025,688],{"class":263},[146,18027,691],{"class":156},[146,18029,18030],{"class":160}," did not complete within ",[146,18032,685],{"class":156},[146,18034,1019],{"class":263},[146,18036,691],{"class":156},[146,18038,1024],{"class":160},[146,18040,406],{"class":263},[146,18042,18043],{"class":148,"line":970},[146,18044,376],{"emptyLinePlaceholder":58},[146,18046,18047],{"class":148,"line":976},[146,18048,376],{"emptyLinePlaceholder":58},[146,18050,18051,18053,18056,18058,18060,18062,18064],{"class":148,"line":988},[146,18052,526],{"class":259},[146,18054,18055],{"class":152}," create_and_wait",[146,18057,17673],{"class":263},[146,18059,8799],{"class":156},[146,18061,15849],{"class":263},[146,18063,8799],{"class":156},[146,18065,860],{"class":263},[146,18067,18068],{"class":148,"line":993},[146,18069,18070],{"class":160},"    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n",[146,18072,18073,18075,18077],{"class":148,"line":5534},[146,18074,1496],{"class":263},[146,18076,267],{"class":259},[146,18078,16913],{"class":263},[146,18080,18081,18083,18085,18087,18089],{"class":148,"line":5543},[146,18082,7221],{"class":263},[146,18084,267],{"class":259},[146,18086,758],{"class":263},[146,18088,7696],{"class":160},[146,18090,764],{"class":263},[146,18092,18093,18095,18097,18099,18102,18104,18106,18108,18110],{"class":148,"line":5549},[146,18094,1102],{"class":156},[146,18096,794],{"class":263},[146,18098,440],{"class":259},[146,18100,18101],{"class":160},"\"🎬 Task created: ",[146,18103,685],{"class":156},[146,18105,688],{"class":263},[146,18107,691],{"class":156},[146,18109,449],{"class":160},[146,18111,406],{"class":263},[146,18113,18114,18116],{"class":148,"line":5577},[146,18115,1703],{"class":259},[146,18117,18118],{"class":263}," wait_for_video(task_id)\n",[18,18120,18121],{},[11,18122,18123,18126],{},[23,18124,18125],{},"이후의 모든 코드 예제는 이 동일한 설정을 사용합니다."," 각 영상 유형에 고유한 payload만 표시합니다.",[11,18128,18129,18132],{},[28,18130,18131],{},"create_and_wait"," 함수는 전체 라이프사이클을 처리합니다: 작업 제출, 완료까지 폴링, 영상 URL 반환. 영상 URL은 24시간 후 만료되므로 즉시 다운로드하거나 자산 관리 시스템으로 직접 파이프하세요.",[11,18134,18135,18136,18138,18139,18143],{},"폴링 방식은 인터랙티브 스크립트와 소규모 배치에 적합합니다. 수백 개의 상품을 처리하는 프로덕션 파이프라인에서는 ",[28,18137,3603],{}," 파라미터(",[37,18140,18142],{"href":18141},"#batch-pipeline-csv-catalog-to-video-library","배치 파이프라인 섹션","에서 다룸)를 사용하면 폴링 오버헤드를 완전히 제거할 수 있습니다.",[11,18145,18146,18147,18150],{},"아래의 모든 코드 예제는 서로 다른 payload 딕셔너리로 ",[28,18148,18149],{},"create_and_wait(payload)","를 호출합니다. 위의 설정 코드가 필요한 유일한 보일러플레이트입니다.",[11,18152,18153],{},[37,18154,18156],{"href":212,"rel":18155},[41],"무료 EvoLink API 키 받기 →",[48,18158,18160],{"id":18159},"영상-유형-1-360-상품-회전","영상 유형 1: 360° 상품 회전",[11,18162,18163],{},"턴테이블 회전은 이커머스 영상의 핵심입니다. 흰색 배경의 상품 사진 한 장이 부드럽게 회전하는 쇼케이스 영상이 됩니다 — 이전에는 모터 구동 턴테이블과 세심한 조명이 필요했던 종류의 클립입니다. 이 포맷은 어디서나 작동합니다: Amazon 리스팅, Shopify 상품 페이지, 소셜 광고.",[56,18165,60,18166],{"controls":58,"playsInline":58,"style":59},[62,18167],{"src":18168,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%89%8B%E8%A1%A8%E5%B9%BF%E5%91%8A.mp4",[11,18170,18171],{},"다음은 럭셔리 시계 회전을 위한 payload입니다:",[137,18173,18175],{"className":338,"code":18174,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/watch-front.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n        \"Premium advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18176,18177,18185,18195,18201,18206,18210,18216,18221,18226,18231,18236,18240,18250,18260,18268,18272,18276],{"__ignoreMap":142},[146,18178,18179,18181,18183],{"class":148,"line":149},[146,18180,3665],{"class":263},[146,18182,267],{"class":259},[146,18184,428],{"class":263},[146,18186,18187,18189,18191,18193],{"class":148,"line":167},[146,18188,3674],{"class":160},[146,18190,437],{"class":263},[146,18192,1308],{"class":160},[146,18194,452],{"class":263},[146,18196,18197,18199],{"class":148,"line":179},[146,18198,15392],{"class":160},[146,18200,2693],{"class":263},[146,18202,18203],{"class":148,"line":188},[146,18204,18205],{"class":160},"        \"https://your-cdn.com/products/watch-front.jpg\"\n",[146,18207,18208],{"class":148,"line":373},[146,18209,16375],{"class":263},[146,18211,18212,18214],{"class":148,"line":379},[146,18213,3685],{"class":160},[146,18215,1322],{"class":263},[146,18217,18218],{"class":148,"line":385},[146,18219,18220],{"class":160},"        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n",[146,18222,18223],{"class":148,"line":409},[146,18224,18225],{"class":160},"        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n",[146,18227,18228],{"class":148,"line":420},[146,18229,18230],{"class":160},"        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n",[146,18232,18233],{"class":148,"line":431},[146,18234,18235],{"class":160},"        \"Premium advertisement quality.\"\n",[146,18237,18238],{"class":148,"line":455},[146,18239,3808],{"class":263},[146,18241,18242,18244,18246,18248],{"class":148,"line":466},[146,18243,3697],{"class":160},[146,18245,437],{"class":263},[146,18247,3702],{"class":156},[146,18249,452],{"class":263},[146,18251,18252,18254,18256,18258],{"class":148,"line":600},[146,18253,3709],{"class":160},[146,18255,437],{"class":263},[146,18257,3714],{"class":160},[146,18259,452],{"class":263},[146,18261,18262,18264,18266],{"class":148,"line":605},[146,18263,3721],{"class":160},[146,18265,437],{"class":263},[146,18267,2732],{"class":160},[146,18269,18270],{"class":148,"line":611},[146,18271,469],{"class":263},[146,18273,18274],{"class":148,"line":617},[146,18275,376],{"emptyLinePlaceholder":58},[146,18277,18278,18280,18282],{"class":148,"line":623},[146,18279,12238],{"class":263},[146,18281,267],{"class":259},[146,18283,18284],{"class":263}," create_and_wait(payload)\n",[11,18286,18287],{},"프롬프트 구조가 중요합니다. 어떤 상품에서든 일관된 결과를 얻으려면 레이어별로 나누세요:",[11,18289,18290,2424,18293,18296,18297,1260],{},[23,18291,18292],{},"레이어 1 — 피사체 식별.",[28,18294,18295],{},"@Image1 is a [product].","로 시작하세요. 이것은 모델을 소스 이미지에 고정시킵니다. Seedance 2.0이 이미지 참조를 해석하는 방법에 대한 자세한 내용은 ",[37,18298,18299],{"href":2969},"@tags 가이드",[11,18301,18302,18305],{},[23,18303,18304],{},"레이어 2 — 동작 설명."," \"Rotates slowly\"가 \"spins\"보다 좋습니다 — 일정한 속도를 암��합니다. \"smooth turntable rotation\" 또는 \"360-degree rotation\"을 추가하여 동작 패턴을 강화하세요.",[11,18307,18308,18311],{},[23,18309,18310],{},"레이어 3 — 조명과 환경."," 모델이 잘 반응하는 스튜디오 조명 용어: \"dramatic studio lighting,\" \"soft diffused light,\" \"rim lighting,\" \"three-point lighting setup.\" 배경 선택 — 어두운 반사면, 흰색 사이클로라마, 그라데이션 배경 — 이 전체적인 톤을 결정합니다.",[11,18313,18314,18317],{},[23,18315,18316],{},"레이어 4 — 품질 수식어."," 품질 신호로 마무리하세요: \"premium advertisement quality,\" \"commercial-grade,\" 또는 \"4K product showcase.\" 이러한 용어들은 모델이 더 깔끔하고 세련된 결과물을 출력하도록 유도합니다.",[92,18319,18321],{"id":18320},"회전-팁","회전 팁",[2035,18323,18324,18335],{},[2038,18325,18326],{},[2041,18327,18328,18330,18333],{},[2044,18329,3403],{},[2044,18331,18332],{},"권장 값",[2044,18334,8274],{},[2051,18336,18337,18348,18359,18369],{},[2041,18338,18339,18342,18345],{},[2056,18340,18341],{},"Duration",[2056,18343,18344],{},"6~10초",[2056,18346,18347],{},"전체 회전에 최소 6초가 필요하며, 그렇지 않으면 급하게 보임",[2041,18349,18350,18353,18356],{},[2056,18351,18352],{},"Aspect ratio",[2056,18354,18355],{},"16:9 또는 1:1",[2056,18357,18358],{},"16:9는 웹/Amazon용, 1:1은 소셜 피드용",[2041,18360,18361,18364,18366],{},[2056,18362,18363],{},"Quality",[2056,18365,1794],{},[2056,18367,18368],{},"상품 콘텐츠에는 항상 1080p",[2041,18370,18371,18374,18377],{},[2056,18372,18373],{},"프롬프트 내 배경",[2056,18375,18376],{},"어두운 반사면 또는 흰색",[2056,18378,18379],{},"브랜드의 상품 페이지 미학에 맞추기",[11,18381,18382],{},"복잡한 디테일이 있는 상품 — 주얼리, 시계, 전자기기 — 의 경우 duration을 10초로 늘리세요. 추가 프레임이 모델에게 모션 블러 아티팩트 없이 회전 중 표면 디테일을 렌더링할 여유를 줍니다.",[92,18384,18386],{"id":18385},"회전-영상을-위한-배경-전략","회전 영상을 위한 배경 전략",[11,18388,18389],{},"소스 이미지의 배경은 출력에 크게 영향을 미칩니다. 일반적인 시나리오를 처리하는 방법은 다음과 같습니다:",[11,18391,18392,18395],{},[23,18393,18394],{},"흰색 배경 (이상적)."," 흰색 배경의 표준 이커머스 상품 사진이 완벽하게 작동합니다. 모델이 상품을 보존하고 깨끗한 회전 동작을 생성합니다. 흰색 배경을 유지하거나 프롬프트에서 다른 배경을 설명할 수 있습니다.",[11,18397,18398,18401],{},[23,18399,18400],{},"투명 배경 (PNG)."," 역시 훌륭합니다. 모델이 프롬프트 설명에 따라 배경을 채우므로 최종 결과물을 완전히 제어할 수 있습니다.",[11,18403,18404,18407],{},[23,18405,18406],{},"복잡하거나 라이프스타일 배경."," 작동하지만 예측 가능성이 낮습니다. 모델이 원치 않는 배경 요소를 회전에 포함시킬 수 있습니다. 최상의 결과를 위해 원하는 배경을 명시적으로 설명하세요: \"on a clean white surface\" 또는 \"on a dark gradient background.\"",[11,18409,18410,18413],{},[23,18411,18412],{},"제어된 배경의 스튜디오 촬영."," 좋은 시작점입니다. 기존 사진에 이미 전문적인 조명이 있다면, 모델이 그 조명 품질을 영상으로 확장합니다.",[11,18415,18416,18417,18420],{},"소스 사진의 배경이 복잡하다면 프롬프트에서 원하는 배경을 명시적으로 설명하세요. Seedance 2.0은 상품을 깨끗한 표면 위로 재배치할 수 있습니다. 최상의 결과를 위해 흰색 배경 또는 투명 배경의 상품 사진으로 시작하세요. 소스 이미지 모범 사례에 대해서는 ",[37,18418,18419],{"href":3384},"이미지-투-비디오 기본 사항","을 참조하세요.",[11,18422,18423],{},"직접 상품 사진으로 시도해 보세요 — 3분 이내에 결과를 확인할 수 있습니다.",[48,18425,18427],{"id":18426},"영상-유형-2-히어로-샷-상품-런칭-트레일러","영상 유형 2: 히어로 샷 (상품 런칭 트레일러)",[11,18429,18430],{},"런칭 트레일러는 기대감을 만듭니다. 연기, 빛줄기, 극적인 앵글 — 몇 초로 압축된 시네마틱 공개 순간입니다. 이 포맷은 첫인상이 클릭률을 좌우하는 소셜 광고와 랜딩 페이지 히어로 섹션에서 주도적입니다.",[56,18432,60,18433],{"controls":58,"playsInline":58,"style":59},[62,18434],{"src":18435,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%80%B3%E6%9C%BA%E5%B9%BF%E5%91%8A%E5%9B%9B%E4%B8%AA%E9%A2%9C%E8%89%B2.mp4",[137,18437,18439],{"className":338,"code":18438,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four colors. \"\n        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n        \"Brand text fades in. Commercial-grade lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18440,18441,18449,18459,18465,18470,18474,18480,18485,18490,18495,18500,18505,18509,18519,18529,18537,18541,18545],{"__ignoreMap":142},[146,18442,18443,18445,18447],{"class":148,"line":149},[146,18444,3665],{"class":263},[146,18446,267],{"class":259},[146,18448,428],{"class":263},[146,18450,18451,18453,18455,18457],{"class":148,"line":167},[146,18452,3674],{"class":160},[146,18454,437],{"class":263},[146,18456,1308],{"class":160},[146,18458,452],{"class":263},[146,18460,18461,18463],{"class":148,"line":179},[146,18462,15392],{"class":160},[146,18464,2693],{"class":263},[146,18466,18467],{"class":148,"line":188},[146,18468,18469],{"class":160},"        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n",[146,18471,18472],{"class":148,"line":373},[146,18473,16375],{"class":263},[146,18475,18476,18478],{"class":148,"line":379},[146,18477,3685],{"class":160},[146,18479,1322],{"class":263},[146,18481,18482],{"class":148,"line":385},[146,18483,18484],{"class":160},"        \"@Image1 shows premium over-ear headphones in four colors. \"\n",[146,18486,18487],{"class":148,"line":409},[146,18488,18489],{"class":160},"        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n",[146,18491,18492],{"class":148,"line":420},[146,18493,18494],{"class":160},"        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n",[146,18496,18497],{"class":148,"line":431},[146,18498,18499],{"class":160},"        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n",[146,18501,18502],{"class":148,"line":455},[146,18503,18504],{"class":160},"        \"Brand text fades in. Commercial-grade lighting.\"\n",[146,18506,18507],{"class":148,"line":466},[146,18508,3808],{"class":263},[146,18510,18511,18513,18515,18517],{"class":148,"line":600},[146,18512,3697],{"class":160},[146,18514,437],{"class":263},[146,18516,537],{"class":156},[146,18518,452],{"class":263},[146,18520,18521,18523,18525,18527],{"class":148,"line":605},[146,18522,3709],{"class":160},[146,18524,437],{"class":263},[146,18526,3714],{"class":160},[146,18528,452],{"class":263},[146,18530,18531,18533,18535],{"class":148,"line":611},[146,18532,3721],{"class":160},[146,18534,437],{"class":263},[146,18536,2732],{"class":160},[146,18538,18539],{"class":148,"line":617},[146,18540,469],{"class":263},[146,18542,18543],{"class":148,"line":623},[146,18544,376],{"emptyLinePlaceholder":58},[146,18546,18547,18549,18551],{"class":148,"line":628},[146,18548,12238],{"class":263},[146,18550,267],{"class":259},[146,18552,18284],{"class":263},[11,18554,18555],{},"히어로 샷 프롬프트는 회전과 다른 어휘를 사용합니다. 여기서는 단일 연속 동작이 아닌 시퀀스를 연출합니다. 각 문장을 스토리보드의 한 장면으로 생각하세요.",[92,18557,18559],{"id":18558},"히어로-샷-프롬프트-패턴","히어로 샷 프롬프트 패턴",[11,18561,18562,18565],{},[23,18563,18564],{},"등장(The Emergence):"," 상품이 연기, 안개 또는 파티클에서 솟아오릅니다. 테크 제품, 향수, 프리미엄 상품에 적합합니다.",[137,18567,18570],{"className":18568,"code":18569,"language":2183},[2181],"@Image1 is [product]. It emerges from dense volumetric fog,\nbacklit by a single golden spotlight. Particles drift upward.\nSlow reveal. Cinematic depth of field. Premium commercial aesthetic.\n",[28,18571,18569],{"__ignoreMap":142},[11,18573,18574,18577],{},[23,18575,18576],{},"임팩트 랜딩(The Impact Landing):"," 상품이 에너지와 함께 프레임에 착지합니다 — 스플래시, 산산조각, 폭발.",[137,18579,18582],{"className":18580,"code":18581,"language":2183},[2181],"@Image1 is [product]. It lands on a glossy black surface with a\nsubtle shockwave ripple. Dust particles scatter on impact.\nCamera pushes in slowly. Dramatic rim lighting. High-end advertisement.\n",[28,18583,18581],{"__ignoreMap":142},[11,18585,18586,18589],{},[23,18587,18588],{},"조립(The Assembly):"," 부품들이 날아와 완성된 상품을 형성합니다. 테크 및 모듈형 제품에 적합합니다.",[137,18591,18594],{"className":18592,"code":18593,"language":2183},[2181],"@Image1 is [product]. Individual components float in space, then\nsmoothly assemble into the final product. Each piece locks into\nplace with a satisfying precision. Clean white environment.\nStudio lighting. Commercial quality.\n",[28,18595,18593],{"__ignoreMap":142},[11,18597,18598],{},"히어로 샷 포맷은 더 긴 duration이 유리합니다 — 8~12초가 모델에게 긴장감을 쌓고 공개를 완성할 여유를 줍니다. 짧은 클립은 급작스럽게 느껴지고, 너무 긴 클립은 시청자의 주의를 잃을 수 있습니다.",[92,18600,18602],{"id":18601},"히어로-샷을-사용할-때","히어로 샷을 사용할 때",[11,18604,18605],{},"히어로 샷이 가장 효과적인 경우:",[97,18607,18608,18614,18620,18626],{},[73,18609,18610,18613],{},[23,18611,18612],{},"상품 런칭."," 소셜 미디어와 랜딩 페이지에서의 신상품 발표. 극적인 공개가 기대감을 쌓고 프리미엄 포지셔닝을 전달합니다.",[73,18615,18616,18619],{},[23,18617,18618],{},"시즌 캠페인."," 명절 세일, 블랙 프라이데이, 새 컬렉션 출시. 시네마틱 품질이 캠페인을 표준 프로모션 콘텐츠 위로 격상시킵니다.",[73,18621,18622,18625],{},[23,18623,18624],{},"광고 크리에이티브."," Facebook, Instagram, TikTok 광고는 극적인 상품 공개의 중단력(stopping power)에서 이점을 얻습니다. 이 클립들은 스크롤이 많은 피드에서 주의를 끕니다.",[73,18627,18628,18631],{},[23,18629,18630],{},"웹사이트 히어로 섹션."," 자동 재생되는 히어로 샷이 스크롤 위에서 즉시 브랜드 품질을 전달합니다. 성능 문제를 피하려면 히어로 배너에서 duration을 6초 이하로 유지하세요.",[11,18633,18634],{},"히어로 샷은 고객이 정보성 콘텐츠를 원하는 상품 상세 페이지에는 적합하지 않습니다. 극적인 연출은 퍼널 상단 마케팅에 남겨두고, 상품 페이지 자체에는 회전 영상과 매크로 영상을 사용하세요.",[11,18636,18637,18638,18641],{},"이커머스 외의 ",[37,18639,18640],{"href":1766},"프롬프트 엔지니어링 팁","과 Seedance 2.0이 시네마틱 용어를 해석하는 방법에 대해서는 전용 프롬프트 가이드를 확인하세요.",[48,18643,18645],{"id":18644},"영상-유형-3-라이프스타일-컨텍스트","영상 유형 3: 라이프스타일 컨텍스트",[11,18647,18648],{},"흰색 배경의 정적 상품 사진도 전환을 이끌어냅니다. 하지만 라이프스타일 이미지 — 맥락 속의 상품, 사용 중인 모습, 실제 환경 — 는 감정적 연결을 만듭니다. 라이프스타일 영상은 고객이 \"저 물건이 갖고 싶다\"가 아니라 \"저런 삶을 살고 싶다\"고 생각하게 만드는 포맷입니다.",[11,18650,18651,18652,18654,18655,18657],{},"Seedance 2.0은 멀티 이미지 입력을 지���합니다. ",[28,18653,2911],{},"은 상품에, ",[28,18656,2920],{},"는 상품을 배치하고 싶은 환경이나 장면에 사용합니다. 모델이 자연스러운 조명과 원근감으로 상품을 장면에 합성합니다.",[137,18659,18661],{"className":338,"code":18660,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/ceramic-mug.jpg\",\n        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n        \"café table by a window on a rainy morning. The mug sits on the \"\n        \"table, steam rising gently from fresh coffee. Soft natural light \"\n        \"from the window. Shallow depth of field. A hand reaches in and \"\n        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n        \"advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,18662,18663,18671,18681,18687,18694,18699,18703,18709,18714,18719,18724,18729,18734,18739,18743,18753,18763,18772,18776,18780],{"__ignoreMap":142},[146,18664,18665,18667,18669],{"class":148,"line":149},[146,18666,3665],{"class":263},[146,18668,267],{"class":259},[146,18670,428],{"class":263},[146,18672,18673,18675,18677,18679],{"class":148,"line":167},[146,18674,3674],{"class":160},[146,18676,437],{"class":263},[146,18678,1308],{"class":160},[146,18680,452],{"class":263},[146,18682,18683,18685],{"class":148,"line":179},[146,18684,15392],{"class":160},[146,18686,2693],{"class":263},[146,18688,18689,18692],{"class":148,"line":188},[146,18690,18691],{"class":160},"        \"https://your-cdn.com/products/ceramic-mug.jpg\"",[146,18693,452],{"class":263},[146,18695,18696],{"class":148,"line":373},[146,18697,18698],{"class":160},"        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n",[146,18700,18701],{"class":148,"line":379},[146,18702,16375],{"class":263},[146,18704,18705,18707],{"class":148,"line":385},[146,18706,3685],{"class":160},[146,18708,1322],{"class":263},[146,18710,18711],{"class":148,"line":409},[146,18712,18713],{"class":160},"        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n",[146,18715,18716],{"class":148,"line":420},[146,18717,18718],{"class":160},"        \"café table by a window on a rainy morning. The mug sits on the \"\n",[146,18720,18721],{"class":148,"line":431},[146,18722,18723],{"class":160},"        \"table, steam rising gently from fresh coffee. Soft natural light \"\n",[146,18725,18726],{"class":148,"line":455},[146,18727,18728],{"class":160},"        \"from the window. Shallow depth of field. A hand reaches in and \"\n",[146,18730,18731],{"class":148,"line":466},[146,18732,18733],{"class":160},"        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n",[146,18735,18736],{"class":148,"line":600},[146,18737,18738],{"class":160},"        \"advertisement quality.\"\n",[146,18740,18741],{"class":148,"line":605},[146,18742,3808],{"class":263},[146,18744,18745,18747,18749,18751],{"class":148,"line":611},[146,18746,3697],{"class":160},[146,18748,437],{"class":263},[146,18750,3702],{"class":156},[146,18752,452],{"class":263},[146,18754,18755,18757,18759,18761],{"class":148,"line":617},[146,18756,3709],{"class":160},[146,18758,437],{"class":263},[146,18760,3714],{"class":160},[146,18762,452],{"class":263},[146,18764,18765,18767,18769],{"class":148,"line":623},[146,18766,3721],{"class":160},[146,18768,437],{"class":263},[146,18770,18771],{"class":160},"\"9:16\"\n",[146,18773,18774],{"class":148,"line":628},[146,18775,469],{"class":263},[146,18777,18778],{"class":148,"line":639},[146,18779,376],{"emptyLinePlaceholder":58},[146,18781,18782,18784,18786],{"class":148,"line":654},[146,18783,12238],{"class":263},[146,18785,267],{"class":259},[146,18787,18284],{"class":263},[11,18789,18790],{},"다음은 실제 적용 사례입니다 — 그림 속 캐릭터가 프레임 앞에 놓인 상품(커피 컵)을 향해 손을 뻗는 장면:",[56,18792,60,18793],{"controls":58,"playsInline":58,"style":59},[62,18794],{"src":18795,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%94%BB%E4%B8%AD%E5%A5%B3%E4%BA%BA%E5%81%B7%E5%96%9D%E5%92%96%E5%95%A1.mp4",[11,18797,18798],{},[2621,18799,18800,18801,18803],{},"이 데모는 ",[28,18802,2911],{},"(캐릭터/상품 참조)이 시각적으로 일관되게 유지되면서 모델이 소품 및 환경과의 자연스러운 상호작용을 생성하는 방식을 보여줍니다. 동일한 원리가 모든 상품-인-컨텍스트 영상에 적용됩니다.",[11,18805,18806,18808,18809,18812],{},[28,18807,2920],{}," 참조는 텍스트 설명만으로 환경을 생성하는 대신 모델에게 구체적인 환경을 제공합니다. 이를 통해 더 사실적이고 일관된 결과를 얻을 수 있습니다. ",[37,18810,18811],{"href":2969},"@tags 시스템","은 최대 9개의 이미지를 지원하므로 복잡한 장면에 여러 참조 이미지를 레이어할 수 있습니다.",[92,18814,18816],{"id":18815},"카테고리별-라이프스타일-장면-제안","카테고리별 라이프스타일 장면 제안",[2035,18818,18819,18832],{},[2038,18820,18821],{},[2041,18822,18823,18826,18829],{},[2044,18824,18825],{},"상품 카테고리",[2044,18827,18828],{},"장면",[2044,18830,18831],{},"프롬프트 키워드",[2051,18833,18834,18845,18856,18867,18878,18889],{},[2041,18835,18836,18839,18842],{},[2056,18837,18838],{},"음료 용기",[2056,18840,18841],{},"카페 테이블, 주방 카운터, 야외 파티오",[2056,18843,18844],{},"steam rising, morning light, cozy atmosphere",[2041,18846,18847,18850,18853],{},[2056,18848,18849],{},"시계",[2056,18851,18852],{},"핸들 위의 손목, 노트북이 있는 책상, 야외 모험",[2056,18854,18855],{},"natural wrist movement, lifestyle context, candid feel",[2041,18857,18858,18861,18864],{},[2056,18859,18860],{},"헤드폰",[2056,18862,18863],{},"기차의 통근자, 공원의 러너, 책상의 학생",[2056,18865,18866],{},"wearing naturally, ambient environment, in-use",[2041,18868,18869,18872,18875],{},[2056,18870,18871],{},"스킨케어",[2056,18873,18874],{},"욕실 세면대, 스파 세팅, 침실 협탁",[2056,18876,18877],{},"soft lighting, clean aesthetic, self-care moment",[2041,18879,18880,18883,18886],{},[2056,18881,18882],{},"가구",[2056,18884,18885],{},"햇빛이 드는 거실, 스타일링된 아파트",[2056,18887,18888],{},"room context, natural scale, interior design",[2041,18890,18891,18894,18897],{},[2056,18892,18893],{},"가방",[2056,18895,18896],{},"스트리트 스타일, 공항 터미널, 사무실 입구",[2056,18898,18899],{},"walking motion, casual carry, urban setting",[11,18901,18902],{},"라이프스타일 영상의 핵심은 구체성입니다. \"A person using the product\"는 일반적인 결과를 생성합니다. \"A hand reaches in and wraps around the mug\"는 의도가 담긴 순간을 만듭니다. 거시적 개념이 아닌 미시적 행동을 설명하세요.",[92,18904,18906],{"id":18905},"단일-이미지-vs-듀얼-이미지-라이프스타일","단일 이미지 vs. 듀얼 이미지 라이프스타일",[11,18908,18909,18910,18912,18913,18915],{},"상품 이미지 하나만으로도 라이프스타일 영상을 생성할 수 있습니다 — 프롬프트에서 장면을 완전히 설명하면 됩니다. 듀얼 이미지 모드(",[28,18911,2911],{}," + ",[28,18914,2920],{},")는 모델이 텍스트 설명이 아닌 장면의 시각적 참조를 갖기 때문에 더 일관된 환경을 생성합니다.",[11,18917,18918],{},"각 접근 방식을 사용할 때:",[97,18920,18921,18927],{},[73,18922,18923,18926],{},[23,18924,18925],{},"단일 이미지 + 설명적 프롬프트:"," 빠르고 간편합니다. 장면이 일반적일 때(예: \"on a desk,\" \"in a kitchen\") 적합합니다. 두 번째 참조 이미지를 소싱할 필요가 없습니다.",[73,18928,18929,18932],{},[23,18930,18931],{},"듀얼 이미지 (상품 + 장면 참조):"," 더 높은 품질의 합성. 특정 환경이 중요할 때 사용합니다 — 특정 카페 미학, 브랜드 리테일 공간, 브랜드 가이드라인에 맞는 큐레이팅된 라이프스타일 세팅.",[11,18934,18935,18936,18938,18939,18941],{},"듀얼 이미지 모드에서 장면 참조는 자체 사진일 필요가 없습니다. 스톡 사진도 환경 참조로 잘 작동합니다. 모델이 ",[28,18937,2920],{},"에서 조명, 색상 팔레트, 공간 레이아웃을 추출하여 ",[28,18940,2911],{},"을 맥락화하는 데 사용합니다.",[11,18943,18944,18945,18947,18948,18420],{},"화면 비율 변경에 주목하세요: Instagram Reels와 TikTok용 라이프스타일 콘텐츠는 ",[28,18946,1810],{},"을 사용합니다. 영상이 게시될 플랫폼에 맞게 화면 비율을 조정하세요. 이에 대한 자세한 내용은 아래의 ",[37,18949,18951],{"href":18950},"#multi-platform-export-aspect-ratios-for-every-channel","멀티 플랫폼 내보내기 섹션",[48,18953,18955],{"id":18954},"영상-유형-4-소재-클로즈업-매크로-디테일","영상 유형 4: 소재 클로즈업 (매크로 디테일)",[11,18957,18958],{},"텍스처가 프리미엄 상품을 판매합니다. 가죽의 결, 알루미늄의 브러시 마감, 캐시미어 스웨터의 직조 — 이러한 디테일은 와이드 샷으로는 전달할 수 없는 방식으로 품질을 전달합니다. 표면 디테일을 천천히 드러내는 매크로 클로즈업 영상은 럭셔리 및 수제 상품에서 가장 높은 전환율을 보이는 포맷 중 하나입니다.",[137,18960,18962],{"className":338,"code":18961,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/leather-wallet.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n        \"close-up. The camera slowly glides across the leather surface, \"\n        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n        \"of field with creamy bokeh. Warm directional lighting rakes \"\n        \"across the surface, emphasizing every pore and fiber. The camera \"\n        \"pulls back gradually to reveal the full wallet. Luxury product \"\n        \"photography in motion.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18963,18964,18972,18982,18988,18993,18997,19003,19008,19013,19018,19023,19028,19033,19038,19042,19052,19062,19070,19074,19078],{"__ignoreMap":142},[146,18965,18966,18968,18970],{"class":148,"line":149},[146,18967,3665],{"class":263},[146,18969,267],{"class":259},[146,18971,428],{"class":263},[146,18973,18974,18976,18978,18980],{"class":148,"line":167},[146,18975,3674],{"class":160},[146,18977,437],{"class":263},[146,18979,1308],{"class":160},[146,18981,452],{"class":263},[146,18983,18984,18986],{"class":148,"line":179},[146,18985,15392],{"class":160},[146,18987,2693],{"class":263},[146,18989,18990],{"class":148,"line":188},[146,18991,18992],{"class":160},"        \"https://your-cdn.com/products/leather-wallet.jpg\"\n",[146,18994,18995],{"class":148,"line":373},[146,18996,16375],{"class":263},[146,18998,18999,19001],{"class":148,"line":379},[146,19000,3685],{"class":160},[146,19002,1322],{"class":263},[146,19004,19005],{"class":148,"line":385},[146,19006,19007],{"class":160},"        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n",[146,19009,19010],{"class":148,"line":409},[146,19011,19012],{"class":160},"        \"close-up. The camera slowly glides across the leather surface, \"\n",[146,19014,19015],{"class":148,"line":420},[146,19016,19017],{"class":160},"        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n",[146,19019,19020],{"class":148,"line":431},[146,19021,19022],{"class":160},"        \"of field with creamy bokeh. Warm directional lighting rakes \"\n",[146,19024,19025],{"class":148,"line":455},[146,19026,19027],{"class":160},"        \"across the surface, emphasizing every pore and fiber. The camera \"\n",[146,19029,19030],{"class":148,"line":466},[146,19031,19032],{"class":160},"        \"pulls back gradually to reveal the full wallet. Luxury product \"\n",[146,19034,19035],{"class":148,"line":600},[146,19036,19037],{"class":160},"        \"photography in motion.\"\n",[146,19039,19040],{"class":148,"line":605},[146,19041,3808],{"class":263},[146,19043,19044,19046,19048,19050],{"class":148,"line":611},[146,19045,3697],{"class":160},[146,19047,437],{"class":263},[146,19049,3702],{"class":156},[146,19051,452],{"class":263},[146,19053,19054,19056,19058,19060],{"class":148,"line":617},[146,19055,3709],{"class":160},[146,19057,437],{"class":263},[146,19059,3714],{"class":160},[146,19061,452],{"class":263},[146,19063,19064,19066,19068],{"class":148,"line":623},[146,19065,3721],{"class":160},[146,19067,437],{"class":263},[146,19069,2732],{"class":160},[146,19071,19072],{"class":148,"line":628},[146,19073,469],{"class":263},[146,19075,19076],{"class":148,"line":639},[146,19077,376],{"emptyLinePlaceholder":58},[146,19079,19080,19082,19084],{"class":148,"line":654},[146,19081,12238],{"class":263},[146,19083,267],{"class":259},[146,19085,18284],{"class":263},[92,19087,19089],{"id":19088},"매크로-프롬프트-어휘","매크로 프롬프트 어휘",[11,19091,19092],{},"모델은 특정 촬영 기법 용어에 강하게 반응합니다. 다음 용어로 매크로 효과를 제어하세요:",[97,19094,19095,19101,19107,19113,19119],{},[73,19096,19097,19100],{},[23,19098,19099],{},"\"Extreme macro close-up\""," — 표면 디테일에 타이트한 프레이밍 트리거",[73,19102,19103,19106],{},[23,19104,19105],{},"\"Shallow depth of field\" / \"creamy bokeh\""," — 배경을 흐리게 하여 디테일을 분리",[73,19108,19109,19112],{},[23,19110,19111],{},"\"Raking light\" / \"directional lighting\""," — 그림자를 통해 표면 텍스처를 강조",[73,19114,19115,19118],{},[23,19116,19117],{},"\"Camera glides across\""," — 부드러운 횡방향 동작으로 텍스처를 점진적으로 공개",[73,19120,19121,19124],{},[23,19122,19123],{},"\"Surface texture reveal\""," — 소재 품질에 초점을 맞추라는 명시적 지시",[92,19126,19128],{"id":19127},"소재별-프롬프트","소재별 프롬프트",[11,19130,19131,19134],{},[23,19132,19133],{},"가죽:"," 결, 스티칭, 파티나에 집중합니다. 따뜻한 조명을 사용합니다.",[137,19136,19139],{"className":19137,"code":19138,"language":2183},[2181],"Extreme macro on full-grain leather surface. Raking warm light reveals\nnatural grain variation and hand-stitched seam detail. Camera drifts\nslowly across the material. Shallow depth of field.\n",[28,19140,19138],{"__ignoreMap":142},[11,19142,19143,19146],{},[23,19144,19145],{},"금속 (브러시/폴리시):"," 반사, 가공 자국, 정밀도에 집중합니다.",[137,19148,19151],{"className":19149,"code":19150,"language":2183},[2181],"Extreme close-up of brushed stainless steel surface. Cool directional\nlight creates long specular highlights across machined grooves. Camera\ntracks along the edge. Mirror-like reflections shift with the angle.\n",[28,19152,19150],{"__ignoreMap":142},[11,19154,19155,19158],{},[23,19156,19157],{},"직물/텍스타일:"," 직조 패턴, 섬유 디테일, 드레이프에 집중합니다.",[137,19160,19163],{"className":19161,"code":19162,"language":2183},[2181],"Macro view of cashmere knit fabric. Soft diffused light reveals\nindividual fiber structure and weave pattern. Camera slowly pans\nacross the textile. Gentle motion shows natural drape and softness.\n",[28,19164,19162],{"__ignoreMap":142},[11,19166,19167,19170],{},[23,19168,19169],{},"목재 결:"," 나이테, 마감, 자연적 변화에 집중합니다.",[137,19172,19175],{"className":19173,"code":19174,"language":2183},[2181],"Extreme macro of walnut wood surface with oil finish. Warm side\nlighting reveals growth rings and natural color variation. Camera\nglides along the grain direction. Rich, organic texture detail.\n",[28,19176,19174],{"__ignoreMap":142},[11,19178,19179,19180,1260],{},"이러한 소재 클로즈업은 상품 리스팅에서 두 번째 또는 세 번째 영상으로 특히 강력합니다. 고객이 전체 상품(회전 또는 히어로 샷)을 본 후, 매크로 디테일 영상이 품질 인식을 강화합니다. 이러한 공개를 향상시키는 카메라 움직임 기법에 대해서는 ",[37,19181,19182],{"href":3860},"카메라 움직임 가이드",[48,19184,19186],{"id":19185},"영상-유형-5-언박싱-공개","영상 유형 5: 언박싱 공개",[11,19188,19189],{},"언박싱 영상이 YouTube와 소셜 플랫폼을 지배하는 데는 이유가 있습니다: 구매 경험을 시뮬레이션하기 때문입니다. 포장을 여는 기대감, 상품을 처음 보는 순간, 잘 설계된 언박싱의 만족감 — 이 포맷은 구매의 감정적 절정을 자극합니다.",[137,19191,19193],{"className":338,"code":19192,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a premium smartwatch in its retail packaging. \"\n        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n        \"Soft overhead lighting. The watch face catches the light as \"\n        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n        \"video. Premium commercial quality.\"\n    ),\n    \"duration\": 12,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,19194,19195,19203,19213,19219,19224,19228,19234,19239,19244,19249,19254,19259,19264,19269,19273,19283,19293,19301,19305,19309],{"__ignoreMap":142},[146,19196,19197,19199,19201],{"class":148,"line":149},[146,19198,3665],{"class":263},[146,19200,267],{"class":259},[146,19202,428],{"class":263},[146,19204,19205,19207,19209,19211],{"class":148,"line":167},[146,19206,3674],{"class":160},[146,19208,437],{"class":263},[146,19210,1308],{"class":160},[146,19212,452],{"class":263},[146,19214,19215,19217],{"class":148,"line":179},[146,19216,15392],{"class":160},[146,19218,2693],{"class":263},[146,19220,19221],{"class":148,"line":188},[146,19222,19223],{"class":160},"        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n",[146,19225,19226],{"class":148,"line":373},[146,19227,16375],{"class":263},[146,19229,19230,19232],{"class":148,"line":379},[146,19231,3685],{"class":160},[146,19233,1322],{"class":263},[146,19235,19236],{"class":148,"line":385},[146,19237,19238],{"class":160},"        \"@Image1 is a premium smartwatch in its retail packaging. \"\n",[146,19240,19241],{"class":148,"line":409},[146,19242,19243],{"class":160},"        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n",[146,19245,19246],{"class":148,"line":420},[146,19247,19248],{"class":160},"        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n",[146,19250,19251],{"class":148,"line":431},[146,19252,19253],{"class":160},"        \"Soft overhead lighting. The watch face catches the light as \"\n",[146,19255,19256],{"class":148,"line":455},[146,19257,19258],{"class":160},"        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n",[146,19260,19261],{"class":148,"line":466},[146,19262,19263],{"class":160},"        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n",[146,19265,19266],{"class":148,"line":600},[146,19267,19268],{"class":160},"        \"video. Premium commercial quality.\"\n",[146,19270,19271],{"class":148,"line":605},[146,19272,3808],{"class":263},[146,19274,19275,19277,19279,19281],{"class":148,"line":611},[146,19276,3697],{"class":160},[146,19278,437],{"class":263},[146,19280,16416],{"class":156},[146,19282,452],{"class":263},[146,19284,19285,19287,19289,19291],{"class":148,"line":617},[146,19286,3709],{"class":160},[146,19288,437],{"class":263},[146,19290,3714],{"class":160},[146,19292,452],{"class":263},[146,19294,19295,19297,19299],{"class":148,"line":623},[146,19296,3721],{"class":160},[146,19298,437],{"class":263},[146,19300,18771],{"class":160},[146,19302,19303],{"class":148,"line":628},[146,19304,469],{"class":263},[146,19306,19307],{"class":148,"line":639},[146,19308,376],{"emptyLinePlaceholder":58},[146,19310,19311,19313,19315],{"class":148,"line":654},[146,19312,12238],{"class":263},[146,19314,267],{"class":259},[146,19316,18284],{"class":263},[11,19318,19319],{},"언박싱 포맷은 더 긴 duration에서 가장 효과적입니다 — 10~15초 — 시작(밀봉된 박스), 중간(공개), 끝(사용 또는 전시 중인 상품)이 있는 스토리를 전달하기 때문입니다. 짧은 클립은 서사적 흐름을 단절시키고 감정적 보상을 잃게 합니다.",[92,19321,19323],{"id":19322},"언박싱-프롬프트-구조","언박싱 프롬프트 구조",[11,19325,19326],{},"효과적인 언박싱 프롬프트는 3막 구조를 따릅니다:",[11,19328,19329,19332],{},[23,19330,19331],{},"1막 — 패키지 (2~3초)."," 포장을 확립합니다. 밀봉된 박스와 상호작용하는 손, 포장 재질, 브랜드 요소를 설명합니다.",[11,19334,19335,19338],{},[23,19336,19337],{},"2막 — 공개 (4~6초)."," 뚜껑이 열립니다. 티슈페이퍼, 폼 인서트, 보호 레이어가 갈라집니다. 상품이 처음으로 보입니다. 이것이 감정의 절정입니다 — 감각적 디테일로 설명하세요.",[11,19340,19341,19344],{},[23,19342,19343],{},"3막 — 상품 (3~5초)."," 상품이 들어 올려지거나, 전시되거나, 사용됩니다. 시계가 손목에 채워집니다. 이어버드가 귀에 들어갑니다. 폰 화면이 켜집니다. 이것이 구매 환상을 완성합니다.",[11,19346,19347],{},"독특하거나 프리미엄 포장이 있는 상품의 경우, 박스가 보이는 사진을 입력 이미지로 사용하세요. 흰색 배경 위 상품 사진만 있다면, 프롬프트에서 포장을 설명하고 모델이 생성하도록 하세요. 실제 포장의 참조 이미지를 제공할 때 결과가 더 일관적입니다.",[11,19349,19350,19351,19353],{},"9:16 세로 포맷이 여기서 지배적인 이유는 언박싱 콘텐츠가 주로 Instagram Reels, TikTok, YouTube Shorts에서 소비되기 때문입니다. 상품 페이지에서는 더 타이트한 프레이밍의 16:9 편집을 고려하세요. ",[37,19352,19182],{"href":3860},"에서는 언박싱 시퀀스를 향상시키는 극적인 공개와 탑다운 앵글 설명 방법을 다룹니다.",[92,19355,19357],{"id":19356},"마케팅-자산으로서의-패키징","마케팅 자산으로서의 패키징",[11,19359,19360],{},"프리미엄 브랜드는 패키징 디자인에 많은 투자를 합니다 — 그리고 언박싱 영상은 그 투자가 카메라 앞에서 효과를 발휘하는 곳입니다. 독특한 포장(커스텀 박스, 자석 잠금, 엠보싱 로고, 브랜딩된 티슈페이퍼)이 있는 상품이라면, 입력 이미지가 상품 자체만이 아닌 포장된 상태를 캡처하도록 하세요.",[11,19362,19363],{},"럭셔리 포장이 없는 상품 — 표준 갈색 박스, 폴리 메일러, 최소한의 리테일 포장 — 에서도 영감을 주는 언박싱 경험을 만들 수 있습니다. 평범한 포장의 상품도 매력적인 언박싱 영상을 만들 수 있습니다. 프롬프트를 공개 순간에 집중하세요 — 닫힌 박스와 내부 상품 사이의 대비. 포장이 표준적이더라도 서사적 흐름이 영상을 이끌어갑니다.",[92,19365,19367],{"id":19366},"완전한-리스팅을-위한-영상-유형-조합","완전한 리스팅을 위한 영상 유형 조합",[11,19369,19370],{},"가장 효과적인 상품 리스팅은 여러 영상 유형을 함께 사용합니다. 상품 페이지에 강력한 조합:",[70,19372,19373,19379,19385,19391],{},[73,19374,19375,19378],{},[23,19376,19377],{},"히어로 샷"," (첫 번째 영상) — 주의를 끌고 프리미엄 포지셔닝을 확립",[73,19380,19381,19384],{},[23,19382,19383],{},"360° 회전"," (두 번째 영상) — 모든 각도에서 상품을 보여줌",[73,19386,19387,19390],{},[23,19388,19389],{},"매크로 클로즈업"," (세 번째 영상) — 소재 디테일을 통해 품질을 증명",[73,19392,19393,19396],{},[23,19394,19395],{},"라이프스타일 컨텍스트"," (네 번째 영상) — 고객이 소유를 시각화하도록 도움",[11,19398,19399],{},"동일 상품의 소셜 미디어 프로모션에서는 히어로 샷 또는 언박싱 공개(둘 다 피드에서 엄지를 멈추도록 최적화)로 시작한 후, 라이프스타일과 회전 콘텐츠로 리타겟팅하세요.",[11,19401,19402],{},"한 장의 상품 사진으로 5가지 유형 모두를 한 번의 파이프라인 실행으로 생성할 수 있습니다. 다음 섹션의 배치 시스템이 이를 자동으로 처리합니다.",[48,19404,19406],{"id":19405},"멀티-플랫폼-내보내기-모든-채널을-위한-화면-비율","멀티 플랫폼 내보내기: 모든 채널을 위한 화면 비율",[11,19408,19409],{},"하나의 상품 영상은 유용합니다. 채널이 필요로 하는 모든 포맷의 동일한 영상은 시스템입니다. 각 플랫폼은 서로 다른 화면 비율 선호도, 자동 재생 동작, 최적 duration을 가집니다. 단일 영상을 생성하고 잘라서 맞추면 구도가 파괴됩니다. 각 비율로 네이티브하게 생성하면 모든 화면에 맞게 올바르게 프레이밍된 영상을 얻습니다.",[2035,19411,19412,19427],{},[2038,19413,19414],{},[2041,19415,19416,19418,19421,19424],{},[2044,19417,13816],{},[2044,19419,19420],{},"화면 비율",[2044,19422,19423],{},"권장 Duration",[2044,19425,19426],{},"참고",[2051,19428,19429,19442,19454,19467,19480,19492,19506,19519,19531],{},[2041,19430,19431,19434,19436,19439],{},[2056,19432,19433],{},"Amazon 상품 페이지",[2056,19435,1806],{},[2056,19437,19438],{},"6~8초",[2056,19440,19441],{},"깔끔하고 정보적. 리스팅 내 자동 재생.",[2041,19443,19444,19447,19449,19451],{},[2056,19445,19446],{},"Shopify 상품 페이지",[2056,19448,1806],{},[2056,19450,18344],{},[2056,19452,19453],{},"히어로 자동 재생 또는 갤러리 임베드.",[2041,19455,19456,19459,19461,19464],{},[2056,19457,19458],{},"Instagram Reels",[2056,19460,1810],{},[2056,19462,19463],{},"8~10초",[2056,19465,19466],{},"시선을 끄는, 빠른 페이싱 선호.",[2041,19468,19469,19472,19474,19477],{},[2056,19470,19471],{},"TikTok",[2056,19473,1810],{},[2056,19475,19476],{},"8~15초",[2056,19478,19479],{},"트렌딩 스타일, 다이나믹 전환.",[2041,19481,19482,19485,19487,19489],{},[2056,19483,19484],{},"Facebook 피드",[2056,19486,1814],{},[2056,19488,19438],{},[2056,19490,19491],{},"피드 면적 최대화를 위한 정사각형.",[2041,19493,19494,19497,19500,19503],{},[2056,19495,19496],{},"Pinterest 비디오 핀",[2056,19498,19499],{},"1:1 또는 9:16",[2056,19501,19502],{},"6~15초",[2056,19504,19505],{},"모바일에서 세로형이 가장 좋은 성과.",[2041,19507,19508,19511,19513,19516],{},[2056,19509,19510],{},"웹사이트 히어로 배너",[2056,19512,1806],{},[2056,19514,19515],{},"4~6초",[2056,19517,19518],{},"짧은 루프, 자동 재생, 오디오 없음.",[2041,19520,19521,19524,19526,19528],{},[2056,19522,19523],{},"YouTube Shorts",[2056,19525,1810],{},[2056,19527,19476],{},[2056,19529,19530],{},"TikTok 포맷과 유사.",[2041,19532,19533,19536,19538,19540],{},[2056,19534,19535],{},"이메일 캠페인",[2056,19537,1806],{},[2056,19539,19515],{},[2056,19541,19542],{},"GIF 폴백, 파일 크기 작게 유지.",[92,19544,19546],{"id":19545},"한-번에-모든-비율-생성","한 번에 모든 비율 생성",[11,19548,19549],{},"간단한 루프를 사용하여 채널이 필요로 하는 모든 비율로 동일한 상품 영상을 생성하세요:",[137,19551,19553],{"className":338,"code":19552,"language":340,"meta":142,"style":142},"platform_configs = [\n    {\"name\": \"amazon\",    \"aspect_ratio\": \"16:9\", \"duration\": 8},\n    {\"name\": \"instagram\", \"aspect_ratio\": \"9:16\", \"duration\": 10},\n    {\"name\": \"facebook\",  \"aspect_ratio\": \"1:1\",  \"duration\": 8},\n    {\"name\": \"website\",   \"aspect_ratio\": \"16:9\", \"duration\": 5},\n]\n\nbase_prompt = (\n    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n    \"aesthetic. Commercial product video quality.\"\n)\n\ntasks = []\nfor config in platform_configs:\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://your-cdn.com/products/speaker.jpg\"],\n        \"prompt\": base_prompt,\n        \"duration\": config[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": config[\"aspect_ratio\"]\n    }\n    task = generate_video(payload)\n    tasks.append({\"platform\": config[\"name\"], \"task_id\": task[\"task_id\"]})\n    print(f\"📐 {config['name']} ({config['aspect_ratio']}): {task['task_id']}\")\n    time.sleep(1)  # Rate limiting\n\n# Collect results\nfor t in tasks:\n    result = wait_for_video(t[\"task_id\"])\n    print(f\"✅ {t['platform']}: {result['output']['video_url']}\")\n",[28,19554,19555,19564,19597,19626,19655,19685,19689,19693,19703,19708,19713,19718,19722,19726,19735,19747,19755,19765,19776,19783,19794,19804,19814,19818,19826,19850,19904,19917,19921,19926,19938,19951],{"__ignoreMap":142},[146,19556,19557,19560,19562],{"class":148,"line":149},[146,19558,19559],{"class":263},"platform_configs ",[146,19561,267],{"class":259},[146,19563,8868],{"class":263},[146,19565,19566,19569,19572,19574,19577,19580,19582,19584,19586,19588,19590,19592,19594],{"class":148,"line":167},[146,19567,19568],{"class":263},"    {",[146,19570,19571],{"class":160},"\"name\"",[146,19573,437],{"class":263},[146,19575,19576],{"class":160},"\"amazon\"",[146,19578,19579],{"class":263},",    ",[146,19581,6171],{"class":160},[146,19583,437],{"class":263},[146,19585,1384],{"class":160},[146,19587,400],{"class":263},[146,19589,5969],{"class":160},[146,19591,437],{"class":263},[146,19593,3702],{"class":156},[146,19595,19596],{"class":263},"},\n",[146,19598,19599,19601,19603,19605,19608,19610,19612,19614,19616,19618,19620,19622,19624],{"class":148,"line":179},[146,19600,19568],{"class":263},[146,19602,19571],{"class":160},[146,19604,437],{"class":263},[146,19606,19607],{"class":160},"\"instagram\"",[146,19609,400],{"class":263},[146,19611,6171],{"class":160},[146,19613,437],{"class":263},[146,19615,3726],{"class":160},[146,19617,400],{"class":263},[146,19619,5969],{"class":160},[146,19621,437],{"class":263},[146,19623,537],{"class":156},[146,19625,19596],{"class":263},[146,19627,19628,19630,19632,19634,19637,19639,19641,19643,19645,19647,19649,19651,19653],{"class":148,"line":188},[146,19629,19568],{"class":263},[146,19631,19571],{"class":160},[146,19633,437],{"class":263},[146,19635,19636],{"class":160},"\"facebook\"",[146,19638,1447],{"class":263},[146,19640,6171],{"class":160},[146,19642,437],{"class":263},[146,19644,6143],{"class":160},[146,19646,1447],{"class":263},[146,19648,5969],{"class":160},[146,19650,437],{"class":263},[146,19652,3702],{"class":156},[146,19654,19596],{"class":263},[146,19656,19657,19659,19661,19663,19666,19669,19671,19673,19675,19677,19679,19681,19683],{"class":148,"line":373},[146,19658,19568],{"class":263},[146,19660,19571],{"class":160},[146,19662,437],{"class":263},[146,19664,19665],{"class":160},"\"website\"",[146,19667,19668],{"class":263},",   ",[146,19670,6171],{"class":160},[146,19672,437],{"class":263},[146,19674,1384],{"class":160},[146,19676,400],{"class":263},[146,19678,5969],{"class":160},[146,19680,437],{"class":263},[146,19682,1352],{"class":156},[146,19684,19596],{"class":263},[146,19686,19687],{"class":148,"line":379},[146,19688,764],{"class":263},[146,19690,19691],{"class":148,"line":385},[146,19692,376],{"emptyLinePlaceholder":58},[146,19694,19695,19698,19700],{"class":148,"line":409},[146,19696,19697],{"class":263},"base_prompt ",[146,19699,267],{"class":259},[146,19701,19702],{"class":263}," (\n",[146,19704,19705],{"class":148,"line":420},[146,19706,19707],{"class":160},"    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n",[146,19709,19710],{"class":148,"line":431},[146,19711,19712],{"class":160},"    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n",[146,19714,19715],{"class":148,"line":455},[146,19716,19717],{"class":160},"    \"aesthetic. Commercial product video quality.\"\n",[146,19719,19720],{"class":148,"line":466},[146,19721,406],{"class":263},[146,19723,19724],{"class":148,"line":600},[146,19725,376],{"emptyLinePlaceholder":58},[146,19727,19728,19731,19733],{"class":148,"line":605},[146,19729,19730],{"class":263},"tasks ",[146,19732,267],{"class":259},[146,19734,5879],{"class":263},[146,19736,19737,19739,19742,19744],{"class":148,"line":611},[146,19738,8231],{"class":259},[146,19740,19741],{"class":263}," config ",[146,19743,1180],{"class":259},[146,19745,19746],{"class":263}," platform_configs:\n",[146,19748,19749,19751,19753],{"class":148,"line":617},[146,19750,1294],{"class":263},[146,19752,267],{"class":259},[146,19754,428],{"class":263},[146,19756,19757,19759,19761,19763],{"class":148,"line":623},[146,19758,1303],{"class":160},[146,19760,437],{"class":263},[146,19762,1308],{"class":160},[146,19764,452],{"class":263},[146,19766,19767,19769,19771,19774],{"class":148,"line":628},[146,19768,2690],{"class":160},[146,19770,10846],{"class":263},[146,19772,19773],{"class":160},"\"https://your-cdn.com/products/speaker.jpg\"",[146,19775,10852],{"class":263},[146,19777,19778,19780],{"class":148,"line":639},[146,19779,1319],{"class":160},[146,19781,19782],{"class":263},": base_prompt,\n",[146,19784,19785,19787,19790,19792],{"class":148,"line":654},[146,19786,1347],{"class":160},[146,19788,19789],{"class":263},": config[",[146,19791,5969],{"class":160},[146,19793,10852],{"class":263},[146,19795,19796,19798,19800,19802],{"class":148,"line":660},[146,19797,1363],{"class":160},[146,19799,437],{"class":263},[146,19801,3714],{"class":160},[146,19803,452],{"class":263},[146,19805,19806,19808,19810,19812],{"class":148,"line":671},[146,19807,1379],{"class":160},[146,19809,19789],{"class":263},[146,19811,6171],{"class":160},[146,19813,764],{"class":263},[146,19815,19816],{"class":148,"line":698},[146,19817,1407],{"class":263},[146,19819,19820,19822,19824],{"class":148,"line":710},[146,19821,1496],{"class":263},[146,19823,267],{"class":259},[146,19825,16913],{"class":263},[146,19827,19828,19831,19834,19836,19838,19840,19842,19845,19847],{"class":148,"line":716},[146,19829,19830],{"class":263},"    tasks.append({",[146,19832,19833],{"class":160},"\"platform\"",[146,19835,19789],{"class":263},[146,19837,19571],{"class":160},[146,19839,10760],{"class":263},[146,19841,7696],{"class":160},[146,19843,19844],{"class":263},": task[",[146,19846,7696],{"class":160},[146,19848,19849],{"class":263},"]})\n",[146,19851,19852,19854,19856,19858,19861,19863,19866,19869,19871,19873,19875,19877,19879,19882,19884,19886,19889,19891,19893,19896,19898,19900,19902],{"class":148,"line":722},[146,19853,1102],{"class":156},[146,19855,794],{"class":263},[146,19857,440],{"class":259},[146,19859,19860],{"class":160},"\"📐 ",[146,19862,685],{"class":156},[146,19864,19865],{"class":263},"config[",[146,19867,19868],{"class":160},"'name'",[146,19870,1535],{"class":263},[146,19872,691],{"class":156},[146,19874,104],{"class":160},[146,19876,685],{"class":156},[146,19878,19865],{"class":263},[146,19880,19881],{"class":160},"'aspect_ratio'",[146,19883,1535],{"class":263},[146,19885,691],{"class":156},[146,19887,19888],{"class":160},"): ",[146,19890,685],{"class":156},[146,19892,1529],{"class":263},[146,19894,19895],{"class":160},"'task_id'",[146,19897,1535],{"class":263},[146,19899,691],{"class":156},[146,19901,449],{"class":160},[146,19903,406],{"class":263},[146,19905,19906,19909,19911,19914],{"class":148,"line":728},[146,19907,19908],{"class":263},"    time.sleep(",[146,19910,5440],{"class":156},[146,19912,19913],{"class":263},")  ",[146,19915,19916],{"class":175},"# Rate limiting\n",[146,19918,19919],{"class":148,"line":739},[146,19920,376],{"emptyLinePlaceholder":58},[146,19922,19923],{"class":148,"line":744},[146,19924,19925],{"class":175},"# Collect results\n",[146,19927,19928,19930,19933,19935],{"class":148,"line":750},[146,19929,8231],{"class":259},[146,19931,19932],{"class":263}," t ",[146,19934,1180],{"class":259},[146,19936,19937],{"class":263}," tasks:\n",[146,19939,19940,19942,19944,19947,19949],{"class":148,"line":767},[146,19941,1618],{"class":263},[146,19943,267],{"class":259},[146,19945,19946],{"class":263}," wait_for_video(t[",[146,19948,7696],{"class":160},[146,19950,1629],{"class":263},[146,19952,19953,19955,19957,19959,19962,19964,19967,19970,19972,19974,19976,19978,19980,19982,19984,19986,19988,19990,19992],{"class":148,"line":788},[146,19954,1102],{"class":156},[146,19956,794],{"class":263},[146,19958,440],{"class":259},[146,19960,19961],{"class":160},"\"✅ ",[146,19963,685],{"class":156},[146,19965,19966],{"class":263},"t[",[146,19968,19969],{"class":160},"'platform'",[146,19971,1535],{"class":263},[146,19973,691],{"class":156},[146,19975,437],{"class":160},[146,19977,685],{"class":156},[146,19979,11822],{"class":263},[146,19981,17898],{"class":160},[146,19983,1562],{"class":263},[146,19985,17903],{"class":160},[146,19987,1535],{"class":263},[146,19989,691],{"class":156},[146,19991,449],{"class":160},[146,19993,406],{"class":263},[11,19995,19996],{},"이것은 모든 변형을 병렬로 제출(요청 간 1초 일시 정지로 속도 제한)한 후 완료되는 대로 결과를 수집합니다. 100개 상품 x 4개 플랫폼이면 400개 영상 — TV 에피소드를 보는 시간 동안 생성됩니다.",[11,19998,19999],{},"이 패턴은 4개 변형을 모두 제출한 후 완료되는 대로 결과를 수집합니다. 총 생성 시간은 단일 영상과 거의 동일합니다 — 4개 모두 서버 측에서 병렬 처리됩니다.",[92,20001,20003],{"id":20002},"네이티브-비율이-크롭보다-나은-이유","네이티브 비율이 크롭보다 나은 이유",[11,20005,20006],{},"프롬프트는 비율 간에 동일하게 유지됩니다. Seedance 2.0은 크롭이 아닌 각 화면 비율에 맞게 장면을 네이티브하게 재구성하여 프레이밍과 공간 레이아웃을 조정합니다. 회전 영상의 9:16 세로 버전은 상품을 더 많은 상단 여백으로 중앙에 배치하고, 1:1 정사각형 버전은 피드에서 최대 상품 가시성을 위해 프레이밍을 타이트하게 합니다.",[11,20008,20009],{},"기존 영상 편집에서는 16:9 마스터 파일을 크롭하여 멀티 플랫폼에 대응합니다. 9:16으로 센터 크롭하면 프레임 양쪽이 손실됩니다. 1:1로 크롭하면 컨텍스트가 손실됩니다. Seedance 2.0에서는 각 비율이 처음부터 생성됩니다 — 모델이 각 형태에 맞게 장면을 적절히 구성합니다. 상품 회전의 세로 9:16 버전은 더 많은 세로 여유 공간으로 상품을 배치합니다. 정사각형 1:1 버전은 소셜 피드에서 최대 상품 가시성을 위해 프레이밍을 타이트하게 합니다. 상품이 항상 프레임에서 적절한 비율을 차지합니다.",[92,20011,20013],{"id":20012},"플랫폼별-프롬프트-조정","플랫폼별 프롬프트 조정",[11,20015,20016],{},"동일한 기본 프롬프트가 비율 간에 작동하지만, 각 플랫폼의 콘텐츠 스타일에 맞게 최적화할 수 있습니다:",[97,20018,20019,20025,20031,20037,20043],{},[73,20020,20021,20024],{},[23,20022,20023],{},"Amazon/Shopify (16:9):"," 깔끔하고 정보적으로 유지합니다. 화려한 전환을 피합니다. 상품을 명확하게 보여주는 데 집중합니다.",[73,20026,20027,20030],{},[23,20028,20029],{},"Instagram Reels (9:16):"," 빠른 페이싱이 효과적입니다. 더 많은 시각적 동작을 위해 프롬프트에 \"dynamic\" 또는 \"energetic\"을 추가합니다.",[73,20032,20033,20036],{},[23,20034,20035],{},"TikTok (9:16):"," 더욱 다이나믹하게. \"Quick cuts,\" \"trend-style transitions,\" \"bold camera movements\"가 TikTok의 시각적 언어에 맞습니다.",[73,20038,20039,20042],{},[23,20040,20041],{},"Facebook 피드 (1:1):"," 정사각형 포맷은 강한 중앙 구도가 필요합니다. 상품을 중앙에 설명합니다: \"product centered in frame.\"",[73,20044,20045,20048],{},[23,20046,20047],{},"웹사이트 히어로 (16:9):"," 절제가 승리합니다. \"Slow, hypnotic motion\"과 \"seamless loop\"이 핵심 용어입니다. 이 영상들은 소리 없이 자동 재생되므로 내러티브보다 시각적 품질이 더 중요합니다.",[11,20050,20051,20052,1260],{},"지원되는 모든 비율을 포함한 전체 API 파라미터 문서는 ",[37,20053,20054],{"href":14392},"영상 생성 API 문서",[48,20056,20058],{"id":20057},"배치-파이프라인-csv-카탈로그에서-영상-라이브러리로","배치 파이프라인: CSV 카탈로그에서 영상 라이브러리로",[11,20060,20061],{},"개별 API 호출은 테스트에 적합합니다. 프로덕션 이커머스에는 파이프라인이 필요합니다: 상품 카탈로그를 읽고, 모든 SKU에 대해 영상을 생성하고, 실패를 처리하고, 출력을 정리합니다. 이 섹션에서 그 파이프라인을 구축합니다.",[11,20063,20064],{},"상품 카탈로그가 포함된 CSV 파일로 시작합니다:",[137,20066,20070],{"className":20067,"code":20068,"language":20069,"meta":142,"style":142},"language-csv shiki shiki-themes github-dark","name,image_url,category,style\nLeather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\nWireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\nCeramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\nMerino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\nSmart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n","csv",[28,20071,20072,20077,20082,20087,20092,20097],{"__ignoreMap":142},[146,20073,20074],{"class":148,"line":149},[146,20075,20076],{},"name,image_url,category,style\n",[146,20078,20079],{"class":148,"line":167},[146,20080,20081],{},"Leather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\n",[146,20083,20084],{"class":148,"line":179},[146,20085,20086],{},"Wireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\n",[146,20088,20089],{"class":148,"line":188},[146,20090,20091],{},"Ceramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\n",[146,20093,20094],{"class":148,"line":373},[146,20095,20096],{},"Merino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\n",[146,20098,20099],{"class":148,"line":379},[146,20100,20101],{},"Smart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n",[11,20103,20104,20106],{},[28,20105,11222],{}," 열은 이 가이드에서 다룬 5가지 영상 유형에 매핑됩니다. 전체 파이프라인은 다음과 같습니다:",[137,20108,20110],{"className":338,"code":20109,"language":340,"meta":142,"style":142},"import csv\nimport os\nimport time\nimport requests\nfrom pathlib import Path\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nOUTPUT_DIR = Path(\"./product_videos\")\nOUTPUT_DIR.mkdir(exist_ok=True)\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n# Prompt templates keyed by style\nSTYLE_PROMPTS = {\n    \"rotation\": (\n        \"@Image1 is a {name}. The product rotates slowly on a clean surface \"\n        \"under professional studio lighting. Smooth 360-degree turntable \"\n        \"rotation. Commercial product showcase quality.\"\n    ),\n    \"hero\": (\n        \"@Image1 is a {name}. The product emerges dramatically from soft \"\n        \"volumetric fog with a golden backlight. Particles drift upward. \"\n        \"Cinematic slow reveal. Premium advertisement quality.\"\n    ),\n    \"lifestyle\": (\n        \"@Image1 is a {name}. The product is shown in a natural lifestyle \"\n        \"setting, being used in an everyday context. Warm natural lighting. \"\n        \"Shallow depth of field. Authentic lifestyle commercial.\"\n    ),\n    \"macro\": (\n        \"@Image1 is a {name}. Extreme macro close-up. The camera glides \"\n        \"across the surface, revealing material texture and craftsmanship \"\n        \"details. Shallow depth of field. Raking directional light. \"\n        \"Luxury product detail shot.\"\n    ),\n    \"unboxing\": (\n        \"@Image1 is a {name} in retail packaging. Hands lift the lid to \"\n        \"reveal the product inside. Tissue paper parts. The product is \"\n        \"lifted out and displayed. Soft overhead lighting. Premium \"\n        \"unboxing experience video.\"\n    ),\n}\n\nSTYLE_DEFAULTS = {\n    \"rotation\":  {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"hero\":      {\"duration\": 10, \"aspect_ratio\": \"16:9\"},\n    \"lifestyle\": {\"duration\": 8,  \"aspect_ratio\": \"9:16\"},\n    \"macro\":     {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"unboxing\":  {\"duration\": 12, \"aspect_ratio\": \"9:16\"},\n}\n\n\ndef submit_video_task(name: str, image_url: str, style: str) -> str:\n    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n    prompt_template = STYLE_PROMPTS.get(style, STYLE_PROMPTS[\"rotation\"])\n    defaults = STYLE_DEFAULTS.get(style, STYLE_DEFAULTS[\"rotation\"])\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": prompt_template.format(name=name),\n        \"duration\": defaults[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": defaults[\"aspect_ratio\"],\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\", headers=headers, json=payload\n    )\n    resp.raise_for_status()\n    return resp.json()[\"task_id\"]\n\n\ndef poll_task(task_id: str, timeout: int = 300) -> dict:\n    \"\"\"Poll until task completes or fails.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n\n        if task[\"status\"] == \"completed\":\n            return task\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task.get('error')}\")\n\n        time.sleep(5)\n        elapsed += 5\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url: str, filepath: Path):\n    \"\"\"Download a video file from a URL.\"\"\"\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filepath, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"💾 Saved: {filepath}\")\n\n\ndef process_catalog(csv_path: str, max_retries: int = 2):\n    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n    # Phase 1: Submit all tasks\n    pending = []\n    with open(csv_path, \"r\") as f:\n        reader = csv.DictReader(f)\n        for row in reader:\n            name = row[\"name\"]\n            image_url = row[\"image_url\"]\n            style = row.get(\"style\", \"rotation\")\n\n            for attempt in range(max_retries + 1):\n                try:\n                    task_id = submit_video_task(name, image_url, style)\n                    pending.append({\n                        \"name\": name,\n                        \"task_id\": task_id,\n                        \"style\": style,\n                    })\n                    print(f\"🎬 Submitted: {name} ({style}) → {task_id}\")\n                    time.sleep(1)  # Rate limiting: 1 request per second\n                    break\n                except requests.exceptions.RequestException as e:\n                    if attempt \u003C max_retries:\n                        print(f\"⚠️  Retry {attempt + 1} for {name}: {e}\")\n                        time.sleep(3)\n                    else:\n                        print(f\"❌ Failed to submit {name}: {e}\")\n\n    # Phase 2: Collect results\n    results = []\n    for item in pending:\n        try:\n            task = poll_task(item[\"task_id\"])\n            video_url = task[\"output\"][\"video_url\"]\n\n            # Generate safe filename\n            safe_name = item[\"name\"].lower().replace(\" \", \"-\")\n            filename = f\"{safe_name}_{item['style']}.mp4\"\n            filepath = OUTPUT_DIR / filename\n\n            download_video(video_url, filepath)\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": str(filepath),\n                \"status\": \"success\"\n            })\n        except Exception as e:\n            print(f\"❌ Failed: {item['name']}: {e}\")\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": None,\n                \"status\": f\"error: {e}\"\n            })\n\n    # Summary\n    success = sum(1 for r in results if r[\"status\"] == \"success\")\n    print(f\"\\n📊 Complete: {success}/{len(results)} videos generated\")\n    return results\n\n\n# Run it\nresults = process_catalog(\"products.csv\")\n",[28,20111,20112,20119,20125,20131,20137,20149,20153,20161,20169,20183,20198,20202,20210,20226,20234,20238,20242,20247,20256,20263,20274,20279,20284,20288,20295,20304,20309,20314,20318,20325,20334,20339,20344,20348,20355,20364,20369,20374,20379,20383,20390,20399,20404,20409,20414,20418,20422,20426,20435,20458,20481,20504,20527,20549,20553,20557,20561,20589,20594,20616,20636,20640,20648,20658,20665,20680,20691,20701,20711,20715,20719,20727,20752,20756,20760,20771,20775,20779,20803,20808,20816,20826,20858,20862,20870,20874,20890,20896,20912,20946,20950,20958,20967,20971,21001,21005,21009,21023,21028,21044,21048,21065,21083,21087,21109,21113,21117,21141,21146,21151,21160,21178,21188,21200,21214,21228,21247,21251,21271,21278,21288,21293,21301,21309,21317,21322,21361,21373,21378,21390,21402,21443,21452,21459,21488,21492,21497,21505,21517,21523,21536,21553,21557,21562,21587,21623,21639,21643,21648,21653,21665,21676,21688,21698,21703,21713,21746,21750,21760,21770,21781,21800,21804,21808,21813,21851,21887,21893,21897,21901,21906],{"__ignoreMap":142},[146,20113,20114,20116],{"class":148,"line":149},[146,20115,347],{"class":259},[146,20117,20118],{"class":263}," csv\n",[146,20120,20121,20123],{"class":148,"line":167},[146,20122,347],{"class":259},[146,20124,363],{"class":263},[146,20126,20127,20129],{"class":148,"line":179},[146,20128,347],{"class":259},[146,20130,356],{"class":263},[146,20132,20133,20135],{"class":148,"line":188},[146,20134,347],{"class":259},[146,20136,329],{"class":263},[146,20138,20139,20141,20144,20146],{"class":148,"line":373},[146,20140,6731],{"class":259},[146,20142,20143],{"class":263}," pathlib ",[146,20145,347],{"class":259},[146,20147,20148],{"class":263}," Path\n",[146,20150,20151],{"class":148,"line":379},[146,20152,376],{"emptyLinePlaceholder":58},[146,20154,20155,20157,20159],{"class":148,"line":385},[146,20156,388],{"class":156},[146,20158,391],{"class":259},[146,20160,17607],{"class":160},[146,20162,20163,20165,20167],{"class":148,"line":409},[146,20164,412],{"class":156},[146,20166,391],{"class":259},[146,20168,417],{"class":160},[146,20170,20171,20173,20175,20178,20181],{"class":148,"line":420},[146,20172,6806],{"class":156},[146,20174,391],{"class":259},[146,20176,20177],{"class":263}," Path(",[146,20179,20180],{"class":160},"\"./product_videos\"",[146,20182,406],{"class":263},[146,20184,20185,20187,20190,20192,20194,20196],{"class":148,"line":431},[146,20186,6806],{"class":156},[146,20188,20189],{"class":263},".mkdir(",[146,20191,6832],{"class":701},[146,20193,267],{"class":259},[146,20195,1139],{"class":156},[146,20197,406],{"class":263},[146,20199,20200],{"class":148,"line":455},[146,20201,376],{"emptyLinePlaceholder":58},[146,20203,20204,20206,20208],{"class":148,"line":466},[146,20205,17624],{"class":263},[146,20207,267],{"class":259},[146,20209,428],{"class":263},[146,20211,20212,20214,20216,20218,20220,20222,20224],{"class":148,"line":600},[146,20213,434],{"class":160},[146,20215,437],{"class":263},[146,20217,440],{"class":259},[146,20219,443],{"class":160},[146,20221,446],{"class":156},[146,20223,449],{"class":160},[146,20225,452],{"class":263},[146,20227,20228,20230,20232],{"class":148,"line":605},[146,20229,458],{"class":160},[146,20231,437],{"class":263},[146,20233,463],{"class":160},[146,20235,20236],{"class":148,"line":611},[146,20237,469],{"class":263},[146,20239,20240],{"class":148,"line":617},[146,20241,376],{"emptyLinePlaceholder":58},[146,20243,20244],{"class":148,"line":623},[146,20245,20246],{"class":175},"# Prompt templates keyed by style\n",[146,20248,20249,20252,20254],{"class":148,"line":628},[146,20250,20251],{"class":156},"STYLE_PROMPTS",[146,20253,391],{"class":259},[146,20255,428],{"class":263},[146,20257,20258,20261],{"class":148,"line":639},[146,20259,20260],{"class":160},"    \"rotation\"",[146,20262,1322],{"class":263},[146,20264,20265,20268,20271],{"class":148,"line":654},[146,20266,20267],{"class":160},"        \"@Image1 is a ",[146,20269,20270],{"class":156},"{name}",[146,20272,20273],{"class":160},". The product rotates slowly on a clean surface \"\n",[146,20275,20276],{"class":148,"line":660},[146,20277,20278],{"class":160},"        \"under professional studio lighting. Smooth 360-degree turntable \"\n",[146,20280,20281],{"class":148,"line":671},[146,20282,20283],{"class":160},"        \"rotation. Commercial product showcase quality.\"\n",[146,20285,20286],{"class":148,"line":698},[146,20287,3808],{"class":263},[146,20289,20290,20293],{"class":148,"line":710},[146,20291,20292],{"class":160},"    \"hero\"",[146,20294,1322],{"class":263},[146,20296,20297,20299,20301],{"class":148,"line":716},[146,20298,20267],{"class":160},[146,20300,20270],{"class":156},[146,20302,20303],{"class":160},". The product emerges dramatically from soft \"\n",[146,20305,20306],{"class":148,"line":722},[146,20307,20308],{"class":160},"        \"volumetric fog with a golden backlight. Particles drift upward. \"\n",[146,20310,20311],{"class":148,"line":728},[146,20312,20313],{"class":160},"        \"Cinematic slow reveal. Premium advertisement quality.\"\n",[146,20315,20316],{"class":148,"line":739},[146,20317,3808],{"class":263},[146,20319,20320,20323],{"class":148,"line":744},[146,20321,20322],{"class":160},"    \"lifestyle\"",[146,20324,1322],{"class":263},[146,20326,20327,20329,20331],{"class":148,"line":750},[146,20328,20267],{"class":160},[146,20330,20270],{"class":156},[146,20332,20333],{"class":160},". The product is shown in a natural lifestyle \"\n",[146,20335,20336],{"class":148,"line":767},[146,20337,20338],{"class":160},"        \"setting, being used in an everyday context. Warm natural lighting. \"\n",[146,20340,20341],{"class":148,"line":788},[146,20342,20343],{"class":160},"        \"Shallow depth of field. Authentic lifestyle commercial.\"\n",[146,20345,20346],{"class":148,"line":834},[146,20347,3808],{"class":263},[146,20349,20350,20353],{"class":148,"line":839},[146,20351,20352],{"class":160},"    \"macro\"",[146,20354,1322],{"class":263},[146,20356,20357,20359,20361],{"class":148,"line":845},[146,20358,20267],{"class":160},[146,20360,20270],{"class":156},[146,20362,20363],{"class":160},". Extreme macro close-up. The camera glides \"\n",[146,20365,20366],{"class":148,"line":863},[146,20367,20368],{"class":160},"        \"across the surface, revealing material texture and craftsmanship \"\n",[146,20370,20371],{"class":148,"line":872},[146,20372,20373],{"class":160},"        \"details. Shallow depth of field. Raking directional light. \"\n",[146,20375,20376],{"class":148,"line":887},[146,20377,20378],{"class":160},"        \"Luxury product detail shot.\"\n",[146,20380,20381],{"class":148,"line":903},[146,20382,3808],{"class":263},[146,20384,20385,20388],{"class":148,"line":915},[146,20386,20387],{"class":160},"    \"unboxing\"",[146,20389,1322],{"class":263},[146,20391,20392,20394,20396],{"class":148,"line":953},[146,20393,20267],{"class":160},[146,20395,20270],{"class":156},[146,20397,20398],{"class":160}," in retail packaging. Hands lift the lid to \"\n",[146,20400,20401],{"class":148,"line":959},[146,20402,20403],{"class":160},"        \"reveal the product inside. Tissue paper parts. The product is \"\n",[146,20405,20406],{"class":148,"line":964},[146,20407,20408],{"class":160},"        \"lifted out and displayed. Soft overhead lighting. Premium \"\n",[146,20410,20411],{"class":148,"line":970},[146,20412,20413],{"class":160},"        \"unboxing experience video.\"\n",[146,20415,20416],{"class":148,"line":976},[146,20417,3808],{"class":263},[146,20419,20420],{"class":148,"line":988},[146,20421,469],{"class":263},[146,20423,20424],{"class":148,"line":993},[146,20425,376],{"emptyLinePlaceholder":58},[146,20427,20428,20431,20433],{"class":148,"line":5534},[146,20429,20430],{"class":156},"STYLE_DEFAULTS",[146,20432,391],{"class":259},[146,20434,428],{"class":263},[146,20436,20437,20439,20442,20444,20446,20448,20450,20452,20454,20456],{"class":148,"line":5543},[146,20438,20260],{"class":160},[146,20440,20441],{"class":263},":  {",[146,20443,5969],{"class":160},[146,20445,437],{"class":263},[146,20447,3702],{"class":156},[146,20449,1447],{"class":263},[146,20451,6171],{"class":160},[146,20453,437],{"class":263},[146,20455,1384],{"class":160},[146,20457,19596],{"class":263},[146,20459,20460,20462,20465,20467,20469,20471,20473,20475,20477,20479],{"class":148,"line":5549},[146,20461,20292],{"class":160},[146,20463,20464],{"class":263},":      {",[146,20466,5969],{"class":160},[146,20468,437],{"class":263},[146,20470,537],{"class":156},[146,20472,400],{"class":263},[146,20474,6171],{"class":160},[146,20476,437],{"class":263},[146,20478,1384],{"class":160},[146,20480,19596],{"class":263},[146,20482,20483,20485,20488,20490,20492,20494,20496,20498,20500,20502],{"class":148,"line":5577},[146,20484,20322],{"class":160},[146,20486,20487],{"class":263},": {",[146,20489,5969],{"class":160},[146,20491,437],{"class":263},[146,20493,3702],{"class":156},[146,20495,1447],{"class":263},[146,20497,6171],{"class":160},[146,20499,437],{"class":263},[146,20501,3726],{"class":160},[146,20503,19596],{"class":263},[146,20505,20506,20508,20511,20513,20515,20517,20519,20521,20523,20525],{"class":148,"line":5608},[146,20507,20352],{"class":160},[146,20509,20510],{"class":263},":     {",[146,20512,5969],{"class":160},[146,20514,437],{"class":263},[146,20516,3702],{"class":156},[146,20518,1447],{"class":263},[146,20520,6171],{"class":160},[146,20522,437],{"class":263},[146,20524,1384],{"class":160},[146,20526,19596],{"class":263},[146,20528,20529,20531,20533,20535,20537,20539,20541,20543,20545,20547],{"class":148,"line":5628},[146,20530,20387],{"class":160},[146,20532,20441],{"class":263},[146,20534,5969],{"class":160},[146,20536,437],{"class":263},[146,20538,16416],{"class":156},[146,20540,400],{"class":263},[146,20542,6171],{"class":160},[146,20544,437],{"class":263},[146,20546,3726],{"class":160},[146,20548,19596],{"class":263},[146,20550,20551],{"class":148,"line":5634},[146,20552,469],{"class":263},[146,20554,20555],{"class":148,"line":5640},[146,20556,376],{"emptyLinePlaceholder":58},[146,20558,20559],{"class":148,"line":5645},[146,20560,376],{"emptyLinePlaceholder":58},[146,20562,20563,20565,20568,20571,20573,20576,20578,20581,20583,20585,20587],{"class":148,"line":5658},[146,20564,526],{"class":259},[146,20566,20567],{"class":152}," submit_video_task",[146,20569,20570],{"class":263},"(name: ",[146,20572,8674],{"class":156},[146,20574,20575],{"class":263},", image_url: ",[146,20577,8674],{"class":156},[146,20579,20580],{"class":263},", style: ",[146,20582,8674],{"class":156},[146,20584,15849],{"class":263},[146,20586,8674],{"class":156},[146,20588,860],{"class":263},[146,20590,20591],{"class":148,"line":5664},[146,20592,20593],{"class":160},"    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n",[146,20595,20596,20599,20601,20604,20607,20609,20611,20614],{"class":148,"line":5691},[146,20597,20598],{"class":263},"    prompt_template ",[146,20600,267],{"class":259},[146,20602,20603],{"class":156}," STYLE_PROMPTS",[146,20605,20606],{"class":263},".get(style, ",[146,20608,20251],{"class":156},[146,20610,7127],{"class":263},[146,20612,20613],{"class":160},"\"rotation\"",[146,20615,1629],{"class":263},[146,20617,20618,20621,20623,20626,20628,20630,20632,20634],{"class":148,"line":5731},[146,20619,20620],{"class":263},"    defaults ",[146,20622,267],{"class":259},[146,20624,20625],{"class":156}," STYLE_DEFAULTS",[146,20627,20606],{"class":263},[146,20629,20430],{"class":156},[146,20631,7127],{"class":263},[146,20633,20613],{"class":160},[146,20635,1629],{"class":263},[146,20637,20638],{"class":148,"line":5750},[146,20639,376],{"emptyLinePlaceholder":58},[146,20641,20642,20644,20646],{"class":148,"line":5755},[146,20643,1294],{"class":263},[146,20645,267],{"class":259},[146,20647,428],{"class":263},[146,20649,20650,20652,20654,20656],{"class":148,"line":5760},[146,20651,1303],{"class":160},[146,20653,437],{"class":263},[146,20655,1308],{"class":160},[146,20657,452],{"class":263},[146,20659,20660,20662],{"class":148,"line":5765},[146,20661,2690],{"class":160},[146,20663,20664],{"class":263},": [image_url],\n",[146,20666,20667,20669,20672,20675,20677],{"class":148,"line":7445},[146,20668,1319],{"class":160},[146,20670,20671],{"class":263},": prompt_template.format(",[146,20673,20674],{"class":701},"name",[146,20676,267],{"class":259},[146,20678,20679],{"class":263},"name),\n",[146,20681,20682,20684,20687,20689],{"class":148,"line":7451},[146,20683,1347],{"class":160},[146,20685,20686],{"class":263},": defaults[",[146,20688,5969],{"class":160},[146,20690,10852],{"class":263},[146,20692,20693,20695,20697,20699],{"class":148,"line":7462},[146,20694,1363],{"class":160},[146,20696,437],{"class":263},[146,20698,3714],{"class":160},[146,20700,452],{"class":263},[146,20702,20703,20705,20707,20709],{"class":148,"line":7473},[146,20704,1379],{"class":160},[146,20706,20686],{"class":263},[146,20708,6171],{"class":160},[146,20710,10852],{"class":263},[146,20712,20713],{"class":148,"line":7484},[146,20714,1407],{"class":263},[146,20716,20717],{"class":148,"line":7489},[146,20718,376],{"emptyLinePlaceholder":58},[146,20720,20721,20723,20725],{"class":148,"line":7495},[146,20722,1126],{"class":263},[146,20724,267],{"class":259},[146,20726,1432],{"class":263},[146,20728,20729,20731,20733,20735,20737,20739,20741,20743,20746,20748,20750],{"class":148,"line":7503},[146,20730,1437],{"class":259},[146,20732,449],{"class":160},[146,20734,679],{"class":156},[146,20736,1444],{"class":160},[146,20738,400],{"class":263},[146,20740,17836],{"class":701},[146,20742,267],{"class":259},[146,20744,20745],{"class":263},"headers, ",[146,20747,1857],{"class":701},[146,20749,267],{"class":259},[146,20751,2790],{"class":263},[146,20753,20754],{"class":148,"line":7517},[146,20755,1483],{"class":263},[146,20757,20758],{"class":148,"line":7522},[146,20759,1146],{"class":263},[146,20761,20762,20764,20767,20769],{"class":148,"line":7536},[146,20763,1703],{"class":259},[146,20765,20766],{"class":263}," resp.json()[",[146,20768,7696],{"class":160},[146,20770,764],{"class":263},[146,20772,20773],{"class":148,"line":7550},[146,20774,376],{"emptyLinePlaceholder":58},[146,20776,20777],{"class":148,"line":7582},[146,20778,376],{"emptyLinePlaceholder":58},[146,20780,20781,20783,20785,20787,20789,20791,20793,20795,20797,20799,20801],{"class":148,"line":7594},[146,20782,526],{"class":259},[146,20784,11693],{"class":152},[146,20786,17754],{"class":263},[146,20788,8674],{"class":156},[146,20790,17770],{"class":263},[146,20792,17762],{"class":156},[146,20794,391],{"class":259},[146,20796,17777],{"class":156},[146,20798,15849],{"class":263},[146,20800,8799],{"class":156},[146,20802,860],{"class":263},[146,20804,20805],{"class":148,"line":7604},[146,20806,20807],{"class":160},"    \"\"\"Poll until task completes or fails.\"\"\"\n",[146,20809,20810,20812,20814],{"class":148,"line":7609},[146,20811,631],{"class":263},[146,20813,267],{"class":259},[146,20815,636],{"class":156},[146,20817,20818,20820,20822,20824],{"class":148,"line":7616},[146,20819,642],{"class":259},[146,20821,645],{"class":263},[146,20823,648],{"class":259},[146,20825,651],{"class":263},[146,20827,20828,20830,20832,20834,20836,20838,20840,20842,20844,20846,20848,20850,20852,20854,20856],{"class":148,"line":7638},[146,20829,6932],{"class":263},[146,20831,267],{"class":259},[146,20833,17815],{"class":263},[146,20835,440],{"class":259},[146,20837,449],{"class":160},[146,20839,679],{"class":156},[146,20841,682],{"class":160},[146,20843,685],{"class":156},[146,20845,688],{"class":263},[146,20847,691],{"class":156},[146,20849,449],{"class":160},[146,20851,400],{"class":263},[146,20853,17836],{"class":701},[146,20855,267],{"class":259},[146,20857,17841],{"class":263},[146,20859,20860],{"class":148,"line":7669},[146,20861,6959],{"class":263},[146,20863,20864,20866,20868],{"class":148,"line":7674},[146,20865,731],{"class":263},[146,20867,267],{"class":259},[146,20869,11777],{"class":263},[146,20871,20872],{"class":148,"line":7680},[146,20873,376],{"emptyLinePlaceholder":58},[146,20875,20876,20878,20880,20882,20884,20886,20888],{"class":148,"line":7705},[146,20877,848],{"class":259},[146,20879,758],{"class":263},[146,20881,761],{"class":160},[146,20883,14937],{"class":263},[146,20885,854],{"class":259},[146,20887,857],{"class":160},[146,20889,860],{"class":263},[146,20891,20892,20894],{"class":148,"line":7710},[146,20893,866],{"class":259},[146,20895,869],{"class":263},[146,20897,20898,20900,20902,20904,20906,20908,20910],{"class":148,"line":7715},[146,20899,875],{"class":259},[146,20901,758],{"class":263},[146,20903,761],{"class":160},[146,20905,14937],{"class":263},[146,20907,854],{"class":259},[146,20909,882],{"class":160},[146,20911,860],{"class":263},[146,20913,20914,20916,20918,20920,20922,20924,20926,20928,20930,20932,20934,20936,20938,20940,20942,20944],{"class":148,"line":7738},[146,20915,906],{"class":259},[146,20917,909],{"class":156},[146,20919,794],{"class":263},[146,20921,440],{"class":259},[146,20923,921],{"class":160},[146,20925,685],{"class":156},[146,20927,688],{"class":263},[146,20929,691],{"class":156},[146,20931,930],{"class":160},[146,20933,685],{"class":156},[146,20935,17946],{"class":263},[146,20937,11874],{"class":160},[146,20939,118],{"class":263},[146,20941,691],{"class":156},[146,20943,449],{"class":160},[146,20945,406],{"class":263},[146,20947,20948],{"class":148,"line":7748},[146,20949,376],{"emptyLinePlaceholder":58},[146,20951,20952,20954,20956],{"class":148,"line":7754},[146,20953,15074],{"class":263},[146,20955,1352],{"class":156},[146,20957,406],{"class":263},[146,20959,20960,20962,20964],{"class":148,"line":7772},[146,20961,979],{"class":263},[146,20963,982],{"class":259},[146,20965,20966],{"class":156}," 5\n",[146,20968,20969],{"class":148,"line":7777},[146,20970,376],{"emptyLinePlaceholder":58},[146,20972,20973,20975,20977,20979,20981,20983,20985,20987,20989,20991,20993,20995,20997,20999],{"class":148,"line":7782},[146,20974,996],{"class":259},[146,20976,999],{"class":156},[146,20978,794],{"class":263},[146,20980,440],{"class":259},[146,20982,921],{"class":160},[146,20984,685],{"class":156},[146,20986,688],{"class":263},[146,20988,691],{"class":156},[146,20990,1014],{"class":160},[146,20992,685],{"class":156},[146,20994,1019],{"class":263},[146,20996,691],{"class":156},[146,20998,1024],{"class":160},[146,21000,406],{"class":263},[146,21002,21003],{"class":148,"line":7795},[146,21004,376],{"emptyLinePlaceholder":58},[146,21006,21007],{"class":148,"line":7809},[146,21008,376],{"emptyLinePlaceholder":58},[146,21010,21011,21013,21015,21018,21020],{"class":148,"line":7836},[146,21012,526],{"class":259},[146,21014,1082],{"class":152},[146,21016,21017],{"class":263},"(url: ",[146,21019,8674],{"class":156},[146,21021,21022],{"class":263},", filepath: Path):\n",[146,21024,21025],{"class":148,"line":7850},[146,21026,21027],{"class":160},"    \"\"\"Download a video file from a URL.\"\"\"\n",[146,21029,21030,21032,21034,21036,21038,21040,21042],{"class":148,"line":10372},[146,21031,1126],{"class":263},[146,21033,267],{"class":259},[146,21035,1131],{"class":263},[146,21037,1134],{"class":701},[146,21039,267],{"class":259},[146,21041,1139],{"class":156},[146,21043,406],{"class":263},[146,21045,21046],{"class":148,"line":10379},[146,21047,1146],{"class":263},[146,21049,21050,21052,21054,21057,21059,21061,21063],{"class":148,"line":10425},[146,21051,1151],{"class":259},[146,21053,1154],{"class":156},[146,21055,21056],{"class":263},"(filepath, ",[146,21058,1160],{"class":160},[146,21060,1163],{"class":263},[146,21062,1166],{"class":259},[146,21064,1169],{"class":263},[146,21066,21067,21069,21071,21073,21075,21077,21079,21081],{"class":148,"line":10430},[146,21068,1174],{"class":259},[146,21070,1177],{"class":263},[146,21072,1180],{"class":259},[146,21074,1183],{"class":263},[146,21076,1186],{"class":701},[146,21078,267],{"class":259},[146,21080,1191],{"class":156},[146,21082,548],{"class":263},[146,21084,21085],{"class":148,"line":10435},[146,21086,1198],{"class":263},[146,21088,21089,21091,21093,21095,21098,21100,21103,21105,21107],{"class":148,"line":10444},[146,21090,1102],{"class":156},[146,21092,794],{"class":263},[146,21094,440],{"class":259},[146,21096,21097],{"class":160},"\"💾 Saved: ",[146,21099,685],{"class":156},[146,21101,21102],{"class":263},"filepath",[146,21104,691],{"class":156},[146,21106,449],{"class":160},[146,21108,406],{"class":263},[146,21110,21111],{"class":148,"line":10450},[146,21112,376],{"emptyLinePlaceholder":58},[146,21114,21115],{"class":148,"line":10459},[146,21116,376],{"emptyLinePlaceholder":58},[146,21118,21119,21121,21124,21127,21129,21132,21134,21136,21139],{"class":148,"line":10480},[146,21120,526],{"class":259},[146,21122,21123],{"class":152}," process_catalog",[146,21125,21126],{"class":263},"(csv_path: ",[146,21128,8674],{"class":156},[146,21130,21131],{"class":263},", max_retries: ",[146,21133,17762],{"class":156},[146,21135,391],{"class":259},[146,21137,21138],{"class":156}," 2",[146,21140,548],{"class":263},[146,21142,21143],{"class":148,"line":10489},[146,21144,21145],{"class":160},"    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n",[146,21147,21148],{"class":148,"line":10494},[146,21149,21150],{"class":175},"    # Phase 1: Submit all tasks\n",[146,21152,21153,21156,21158],{"class":148,"line":10507},[146,21154,21155],{"class":263},"    pending ",[146,21157,267],{"class":259},[146,21159,5879],{"class":263},[146,21161,21162,21164,21166,21169,21172,21174,21176],{"class":148,"line":10529},[146,21163,1151],{"class":259},[146,21165,1154],{"class":156},[146,21167,21168],{"class":263},"(csv_path, ",[146,21170,21171],{"class":160},"\"r\"",[146,21173,1163],{"class":263},[146,21175,1166],{"class":259},[146,21177,1169],{"class":263},[146,21179,21180,21183,21185],{"class":148,"line":10536},[146,21181,21182],{"class":263},"        reader ",[146,21184,267],{"class":259},[146,21186,21187],{"class":263}," csv.DictReader(f)\n",[146,21189,21190,21192,21195,21197],{"class":148,"line":10557},[146,21191,1174],{"class":259},[146,21193,21194],{"class":263}," row ",[146,21196,1180],{"class":259},[146,21198,21199],{"class":263}," reader:\n",[146,21201,21202,21205,21207,21210,21212],{"class":148,"line":10562},[146,21203,21204],{"class":263},"            name ",[146,21206,267],{"class":259},[146,21208,21209],{"class":263}," row[",[146,21211,19571],{"class":160},[146,21213,764],{"class":263},[146,21215,21216,21219,21221,21223,21226],{"class":148,"line":10567},[146,21217,21218],{"class":263},"            image_url ",[146,21220,267],{"class":259},[146,21222,21209],{"class":263},[146,21224,21225],{"class":160},"\"image_url\"",[146,21227,764],{"class":263},[146,21229,21230,21233,21235,21238,21241,21243,21245],{"class":148,"line":10573},[146,21231,21232],{"class":263},"            style ",[146,21234,267],{"class":259},[146,21236,21237],{"class":263}," row.get(",[146,21239,21240],{"class":160},"\"style\"",[146,21242,400],{"class":263},[146,21244,20613],{"class":160},[146,21246,406],{"class":263},[146,21248,21249],{"class":148,"line":10582},[146,21250,376],{"emptyLinePlaceholder":58},[146,21252,21253,21255,21257,21259,21261,21264,21266,21269],{"class":148,"line":10591},[146,21254,6981],{"class":259},[146,21256,5125],{"class":263},[146,21258,1180],{"class":259},[146,21260,5130],{"class":156},[146,21262,21263],{"class":263},"(max_retries ",[146,21265,5430],{"class":259},[146,21267,21268],{"class":156}," 1",[146,21270,548],{"class":263},[146,21272,21273,21276],{"class":148,"line":10602},[146,21274,21275],{"class":259},"                try",[146,21277,860],{"class":263},[146,21279,21280,21283,21285],{"class":148,"line":10609},[146,21281,21282],{"class":263},"                    task_id ",[146,21284,267],{"class":259},[146,21286,21287],{"class":263}," submit_video_task(name, image_url, style)\n",[146,21289,21290],{"class":148,"line":10614},[146,21291,21292],{"class":263},"                    pending.append({\n",[146,21294,21295,21298],{"class":148,"line":10619},[146,21296,21297],{"class":160},"                        \"name\"",[146,21299,21300],{"class":263},": name,\n",[146,21302,21303,21306],{"class":148,"line":10624},[146,21304,21305],{"class":160},"                        \"task_id\"",[146,21307,21308],{"class":263},": task_id,\n",[146,21310,21311,21314],{"class":148,"line":10629},[146,21312,21313],{"class":160},"                        \"style\"",[146,21315,21316],{"class":263},": style,\n",[146,21318,21319],{"class":148,"line":10640},[146,21320,21321],{"class":263},"                    })\n",[146,21323,21324,21327,21329,21331,21334,21336,21338,21340,21342,21344,21346,21348,21351,21353,21355,21357,21359],{"class":148,"line":10651},[146,21325,21326],{"class":156},"                    print",[146,21328,794],{"class":263},[146,21330,440],{"class":259},[146,21332,21333],{"class":160},"\"🎬 Submitted: ",[146,21335,685],{"class":156},[146,21337,20674],{"class":263},[146,21339,691],{"class":156},[146,21341,104],{"class":160},[146,21343,685],{"class":156},[146,21345,11222],{"class":263},[146,21347,691],{"class":156},[146,21349,21350],{"class":160},") → ",[146,21352,685],{"class":156},[146,21354,688],{"class":263},[146,21356,691],{"class":156},[146,21358,449],{"class":160},[146,21360,406],{"class":263},[146,21362,21363,21366,21368,21370],{"class":148,"line":10662},[146,21364,21365],{"class":263},"                    time.sleep(",[146,21367,5440],{"class":156},[146,21369,19913],{"class":263},[146,21371,21372],{"class":175},"# Rate limiting: 1 request per second\n",[146,21374,21375],{"class":148,"line":10671},[146,21376,21377],{"class":259},"                    break\n",[146,21379,21380,21383,21386,21388],{"class":148,"line":10676},[146,21381,21382],{"class":259},"                except",[146,21384,21385],{"class":263}," requests.exceptions.RequestException ",[146,21387,1166],{"class":259},[146,21389,5655],{"class":263},[146,21391,21392,21395,21397,21399],{"class":148,"line":10682},[146,21393,21394],{"class":259},"                    if",[146,21396,5125],{"class":263},[146,21398,648],{"class":259},[146,21400,21401],{"class":263}," max_retries:\n",[146,21403,21404,21407,21409,21411,21414,21416,21418,21420,21422,21425,21427,21429,21431,21433,21435,21437,21439,21441],{"class":148,"line":10691},[146,21405,21406],{"class":156},"                        print",[146,21408,794],{"class":263},[146,21410,440],{"class":259},[146,21412,21413],{"class":160},"\"⚠️  Retry ",[146,21415,685],{"class":156},[146,21417,5459],{"class":263},[146,21419,5430],{"class":259},[146,21421,5464],{"class":156},[146,21423,21424],{"class":160}," for ",[146,21426,685],{"class":156},[146,21428,20674],{"class":263},[146,21430,691],{"class":156},[146,21432,437],{"class":160},[146,21434,685],{"class":156},[146,21436,5705],{"class":263},[146,21438,691],{"class":156},[146,21440,449],{"class":160},[146,21442,406],{"class":263},[146,21444,21445,21448,21450],{"class":148,"line":10735},[146,21446,21447],{"class":263},"                        time.sleep(",[146,21449,5059],{"class":156},[146,21451,406],{"class":263},[146,21453,21454,21457],{"class":148,"line":10748},[146,21455,21456],{"class":259},"                    else",[146,21458,860],{"class":263},[146,21460,21461,21463,21465,21467,21470,21472,21474,21476,21478,21480,21482,21484,21486],{"class":148,"line":10768},[146,21462,21406],{"class":156},[146,21464,794],{"class":263},[146,21466,440],{"class":259},[146,21468,21469],{"class":160},"\"❌ Failed to submit ",[146,21471,685],{"class":156},[146,21473,20674],{"class":263},[146,21475,691],{"class":156},[146,21477,437],{"class":160},[146,21479,685],{"class":156},[146,21481,5705],{"class":263},[146,21483,691],{"class":156},[146,21485,449],{"class":160},[146,21487,406],{"class":263},[146,21489,21490],{"class":148,"line":10773},[146,21491,376],{"emptyLinePlaceholder":58},[146,21493,21494],{"class":148,"line":10778},[146,21495,21496],{"class":175},"    # Phase 2: Collect results\n",[146,21498,21499,21501,21503],{"class":148,"line":10784},[146,21500,8440],{"class":263},[146,21502,267],{"class":259},[146,21504,5879],{"class":263},[146,21506,21507,21509,21512,21514],{"class":148,"line":10793},[146,21508,5122],{"class":259},[146,21510,21511],{"class":263}," item ",[146,21513,1180],{"class":259},[146,21515,21516],{"class":263}," pending:\n",[146,21518,21519,21521],{"class":148,"line":10802},[146,21520,5138],{"class":259},[146,21522,860],{"class":263},[146,21524,21525,21527,21529,21532,21534],{"class":148,"line":10813},[146,21526,8529],{"class":263},[146,21528,267],{"class":259},[146,21530,21531],{"class":263}," poll_task(item[",[146,21533,7696],{"class":160},[146,21535,1629],{"class":263},[146,21537,21538,21540,21542,21544,21547,21549,21551],{"class":148,"line":10820},[146,21539,7407],{"class":263},[146,21541,267],{"class":259},[146,21543,758],{"class":263},[146,21545,21546],{"class":160},"\"output\"",[146,21548,1562],{"class":263},[146,21550,14959],{"class":160},[146,21552,764],{"class":263},[146,21554,21555],{"class":148,"line":10825},[146,21556,376],{"emptyLinePlaceholder":58},[146,21558,21559],{"class":148,"line":10830},[146,21560,21561],{"class":175},"            # Generate safe filename\n",[146,21563,21564,21567,21569,21572,21574,21577,21580,21582,21585],{"class":148,"line":10836},[146,21565,21566],{"class":263},"            safe_name ",[146,21568,267],{"class":259},[146,21570,21571],{"class":263}," item[",[146,21573,19571],{"class":160},[146,21575,21576],{"class":263},"].lower().replace(",[146,21578,21579],{"class":160},"\" \"",[146,21581,400],{"class":263},[146,21583,21584],{"class":160},"\"-\"",[146,21586,406],{"class":263},[146,21588,21589,21592,21594,21596,21598,21600,21603,21605,21608,21610,21613,21616,21618,21620],{"class":148,"line":10841},[146,21590,21591],{"class":263},"            filename ",[146,21593,267],{"class":259},[146,21595,3361],{"class":259},[146,21597,449],{"class":160},[146,21599,685],{"class":156},[146,21601,21602],{"class":263},"safe_name",[146,21604,691],{"class":156},[146,21606,21607],{"class":160},"_",[146,21609,685],{"class":156},[146,21611,21612],{"class":263},"item[",[146,21614,21615],{"class":160},"'style'",[146,21617,1535],{"class":263},[146,21619,691],{"class":156},[146,21621,21622],{"class":160},".mp4\"\n",[146,21624,21625,21628,21630,21633,21636],{"class":148,"line":10855},[146,21626,21627],{"class":263},"            filepath ",[146,21629,267],{"class":259},[146,21631,21632],{"class":156}," OUTPUT_DIR",[146,21634,21635],{"class":259}," /",[146,21637,21638],{"class":263}," filename\n",[146,21640,21641],{"class":148,"line":10866},[146,21642,376],{"emptyLinePlaceholder":58},[146,21644,21645],{"class":148,"line":10875},[146,21646,21647],{"class":263},"            download_video(video_url, filepath)\n",[146,21649,21650],{"class":148,"line":10880},[146,21651,21652],{"class":263},"            results.append({\n",[146,21654,21655,21658,21661,21663],{"class":148,"line":10885},[146,21656,21657],{"class":160},"                \"name\"",[146,21659,21660],{"class":263},": item[",[146,21662,19571],{"class":160},[146,21664,10852],{"class":263},[146,21666,21667,21670,21672,21674],{"class":148,"line":10894},[146,21668,21669],{"class":160},"                \"style\"",[146,21671,21660],{"class":263},[146,21673,21240],{"class":160},[146,21675,10852],{"class":263},[146,21677,21678,21681,21683,21685],{"class":148,"line":10919},[146,21679,21680],{"class":160},"                \"file\"",[146,21682,437],{"class":263},[146,21684,8674],{"class":156},[146,21686,21687],{"class":263},"(filepath),\n",[146,21689,21690,21693,21695],{"class":148,"line":10932},[146,21691,21692],{"class":160},"                \"status\"",[146,21694,437],{"class":263},[146,21696,21697],{"class":160},"\"success\"\n",[146,21699,21700],{"class":148,"line":10950},[146,21701,21702],{"class":263},"            })\n",[146,21704,21705,21707,21709,21711],{"class":148,"line":10955},[146,21706,5537],{"class":259},[146,21708,7065],{"class":156},[146,21710,7068],{"class":259},[146,21712,5655],{"class":263},[146,21714,21715,21717,21719,21721,21724,21726,21728,21730,21732,21734,21736,21738,21740,21742,21744],{"class":148,"line":10960},[146,21716,5580],{"class":156},[146,21718,794],{"class":263},[146,21720,440],{"class":259},[146,21722,21723],{"class":160},"\"❌ Failed: ",[146,21725,685],{"class":156},[146,21727,21612],{"class":263},[146,21729,19868],{"class":160},[146,21731,1535],{"class":263},[146,21733,691],{"class":156},[146,21735,437],{"class":160},[146,21737,685],{"class":156},[146,21739,5705],{"class":263},[146,21741,691],{"class":156},[146,21743,449],{"class":160},[146,21745,406],{"class":263},[146,21747,21748],{"class":148,"line":10966},[146,21749,21652],{"class":263},[146,21751,21752,21754,21756,21758],{"class":148,"line":10976},[146,21753,21657],{"class":160},[146,21755,21660],{"class":263},[146,21757,19571],{"class":160},[146,21759,10852],{"class":263},[146,21761,21762,21764,21766,21768],{"class":148,"line":10985},[146,21763,21669],{"class":160},[146,21765,21660],{"class":263},[146,21767,21240],{"class":160},[146,21769,10852],{"class":263},[146,21771,21772,21774,21776,21779],{"class":148,"line":10996},[146,21773,21680],{"class":160},[146,21775,437],{"class":263},[146,21777,21778],{"class":156},"None",[146,21780,452],{"class":263},[146,21782,21783,21785,21787,21789,21792,21794,21796,21798],{"class":148,"line":11003},[146,21784,21692],{"class":160},[146,21786,437],{"class":263},[146,21788,440],{"class":259},[146,21790,21791],{"class":160},"\"error: ",[146,21793,685],{"class":156},[146,21795,5705],{"class":263},[146,21797,691],{"class":156},[146,21799,950],{"class":160},[146,21801,21802],{"class":148,"line":11009},[146,21803,21702],{"class":263},[146,21805,21806],{"class":148,"line":11015},[146,21807,376],{"emptyLinePlaceholder":58},[146,21809,21810],{"class":148,"line":11020},[146,21811,21812],{"class":175},"    # Summary\n",[146,21814,21815,21818,21820,21822,21824,21826,21828,21831,21833,21835,21837,21840,21842,21844,21846,21849],{"class":148,"line":11031},[146,21816,21817],{"class":263},"    success ",[146,21819,267],{"class":259},[146,21821,8774],{"class":156},[146,21823,794],{"class":263},[146,21825,5440],{"class":156},[146,21827,6397],{"class":259},[146,21829,21830],{"class":263}," r ",[146,21832,1180],{"class":259},[146,21834,8788],{"class":263},[146,21836,1719],{"class":259},[146,21838,21839],{"class":263}," r[",[146,21841,761],{"class":160},[146,21843,14937],{"class":263},[146,21845,854],{"class":259},[146,21847,21848],{"class":160}," \"success\"",[146,21850,406],{"class":263},[146,21852,21853,21855,21857,21859,21861,21863,21866,21868,21871,21873,21875,21877,21880,21882,21885],{"class":148,"line":11042},[146,21854,1102],{"class":156},[146,21856,794],{"class":263},[146,21858,440],{"class":259},[146,21860,449],{"class":160},[146,21862,1670],{"class":156},[146,21864,21865],{"class":160},"📊 Complete: ",[146,21867,685],{"class":156},[146,21869,21870],{"class":263},"success",[146,21872,691],{"class":156},[146,21874,1225],{"class":160},[146,21876,6273],{"class":156},[146,21878,21879],{"class":263},"(results)",[146,21881,691],{"class":156},[146,21883,21884],{"class":160}," videos generated\"",[146,21886,406],{"class":263},[146,21888,21889,21891],{"class":148,"line":11053},[146,21890,1703],{"class":259},[146,21892,8845],{"class":263},[146,21894,21895],{"class":148,"line":11062},[146,21896,376],{"emptyLinePlaceholder":58},[146,21898,21899],{"class":148,"line":11067},[146,21900,376],{"emptyLinePlaceholder":58},[146,21902,21903],{"class":148,"line":11072},[146,21904,21905],{"class":175},"# Run it\n",[146,21907,21908,21911,21913,21916,21919],{"class":148,"line":11081},[146,21909,21910],{"class":263},"results ",[146,21912,267],{"class":259},[146,21914,21915],{"class":263}," process_catalog(",[146,21917,21918],{"class":160},"\"products.csv\"",[146,21920,406],{"class":263},[11,21922,21923],{},"파이프라인은 2단계로 운영됩니다. 1단계에서 모든 작업을 빠르게 제출(속도 제한 포함)하고 task ID를 저장합니다. 2단계에서 각 작업을 폴링하고 결과를 다운로드합니다. 이를 통해 병렬성을 극대화합니다 — 모든 영상이 서버 측에서 동시에 생성됩니다.",[92,21925,21927],{"id":21926},"폴링-대신-콜백-사용","폴링 대신 콜백 사용",[11,21929,21930,21931,21933,21934,1260],{},"대규모 카탈로그(100개 이상 상품)에서는 폴링이 비효율적입니다. ",[28,21932,3603],{}," 파라미터를 사용하여 각 영상이 완료될 때 웹훅을 수신합니다. 전체 웹훅 페이로드 사양은 ",[37,21935,21936],{"href":14392},"API 문서의 콜백 파라미터",[137,21938,21940],{"className":338,"code":21939,"language":340,"meta":142,"style":142},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\"https://your-cdn.com/products/item.jpg\"],\n    \"prompt\": \"@Image1 is a product. Smooth rotation. Studio lighting.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"callback_url\": \"https://your-server.com/webhooks/video-ready\"\n}\n",[28,21941,21942,21950,21960,21971,21982,21992,22002,22012,22021],{"__ignoreMap":142},[146,21943,21944,21946,21948],{"class":148,"line":149},[146,21945,3665],{"class":263},[146,21947,267],{"class":259},[146,21949,428],{"class":263},[146,21951,21952,21954,21956,21958],{"class":148,"line":167},[146,21953,3674],{"class":160},[146,21955,437],{"class":263},[146,21957,1308],{"class":160},[146,21959,452],{"class":263},[146,21961,21962,21964,21966,21969],{"class":148,"line":179},[146,21963,15392],{"class":160},[146,21965,10846],{"class":263},[146,21967,21968],{"class":160},"\"https://your-cdn.com/products/item.jpg\"",[146,21970,10852],{"class":263},[146,21972,21973,21975,21977,21980],{"class":148,"line":188},[146,21974,3685],{"class":160},[146,21976,437],{"class":263},[146,21978,21979],{"class":160},"\"@Image1 is a product. Smooth rotation. Studio lighting.\"",[146,21981,452],{"class":263},[146,21983,21984,21986,21988,21990],{"class":148,"line":373},[146,21985,3697],{"class":160},[146,21987,437],{"class":263},[146,21989,3702],{"class":156},[146,21991,452],{"class":263},[146,21993,21994,21996,21998,22000],{"class":148,"line":379},[146,21995,3709],{"class":160},[146,21997,437],{"class":263},[146,21999,3714],{"class":160},[146,22001,452],{"class":263},[146,22003,22004,22006,22008,22010],{"class":148,"line":385},[146,22005,3721],{"class":160},[146,22007,437],{"class":263},[146,22009,1384],{"class":160},[146,22011,452],{"class":263},[146,22013,22014,22016,22018],{"class":148,"line":409},[146,22015,6514],{"class":160},[146,22017,437],{"class":263},[146,22019,22020],{"class":160},"\"https://your-server.com/webhooks/video-ready\"\n",[146,22022,22023],{"class":148,"line":420},[146,22024,469],{"class":263},[11,22026,22027],{},"웹훅 엔드포인트가 영상 URL을 포함한 완료된 작업 객체와 함께 POST를 수신합니다. 이를 통해 폴링을 완전히 제거하고 결과를 비동기적으로 처리할 수 있습니다 — 영상 다운로드, 상품 데이터베이스 업데이트, CDN으로 푸시를 단일 웹훅 핸들러에서 수행합니��.",[92,22029,22031],{"id":22030},"파이프라인-팁","파이프라인 팁",[97,22033,22034,22040,22046,22052,22061,22067],{},[73,22035,22036,22039],{},[23,22037,22038],{},"속도 제한:"," 요청을 초당 1개로 유지합니다. 버스트 제출은 스로틀링을 유발할 수 있습니다.",[73,22041,22042,22045],{},[23,22043,22044],{},"영상 URL 만료:"," 24시간 이내에 다운로드합니다. 위 파이프라인은 즉시 다운로드하지만, 콜백을 사용하는 경우 웹훅 핸들러가 즉시 다운로드하도록 보장하세요.",[73,22047,22048,22051],{},[23,22049,22050],{},"재시도 로직:"," 네트워크 오류는 발생합니다. 파이프라인은 실패한 제출을 3초 백오프로 최대 2회 재시도합니다.",[73,22053,22054,2424,22057,22060],{},[23,22055,22056],{},"출력 정리:",[28,22058,22059],{},"{product-name}_{style}.mp4"," 파일명 규칙이 영상 라이브러리를 탐색 가능하게 유지합니다. 상품당 여러 비율을 생성하는 경우 파일명에 화면 비율을 추가하세요.",[73,22062,22063,22066],{},[23,22064,22065],{},"멱등성:"," 이미 영상이 있는 상품을 추적합니다. 작업을 제출하기 전에 출력 파일이 이미 존재하는지 확인합니다. 이를 통해 부분 실패 후 파이프라인을 재실행할 때 중복 생성을 방지합니다.",[73,22068,22069,22072,22073,22076],{},[23,22070,22071],{},"비용 모니터링:"," 실행당 생성된 영상 수를 로깅합니다. 영상당 몇 센트의 비용으로 비용은 낮게 유지되지만, 무한 루프나 잘못 구성된 CSV가 의도치 않게 수천 건의 요청을 제출할 수 있습니다. 확인 프롬프트나 ",[28,22074,22075],{},"--dry-run"," 플래그를 추가하세요.",[92,22078,22080],{"id":22079},"기본을-넘어서는-확장","기본을 넘어서는 확장",[11,22082,22083],{},"1,000 SKU 이상의 카탈로그에서는 다음 개선 사항을 고려하세요:",[11,22085,22086,22089,22090,22093],{},[23,22087,22088],{},"동시 폴링."," 위 파이프라인은 작업을 순차적으로 폴링합니다. Python의 ",[28,22091,22092],{},"concurrent.futures.ThreadPoolExecutor","를 사용하여 여러 작업을 병렬로 폴링하면 총 실행 시간을 줄일 수 있습니다.",[11,22095,22096,22099,22100,22102],{},[23,22097,22098],{},"데이터베이스 추적."," 메모리 내 ",[28,22101,2258],{}," 리스트를 실행 간에 유지되는 SQLite 데이터베이스 또는 간단한 JSON 파일로 대체합니다. task ID, 완료 상태, 출력 파일 경로, 타임스탬프를 추적합니다. 이를 통해 중단 후 파이프라인을 재개할 수 있습니다.",[11,22104,22105,22108],{},[23,22106,22107],{},"CDN 업로드."," 다운로드 후 CDN(S3, CloudFront, Cloudflare R2)에 자동으로 업로드하고 공개 URL을 저장합니다. 이를 통해 호스팅 인프라로 파일을 전송하는 수동 단계를 제거합니다.",[11,22110,22111,22114],{},[23,22112,22113],{},"메타데이터 생성."," 영상과 함께 상품명, 영상 유형, 화면 비율, duration, CDN URL을 포함하는 JSON 매니페스트를 생성합니다. 이 매니페스트는 자동화된 리스팅 업데이트를 위해 CMS 또는 상품 정보 관리(PIM) 시스템에 직접 피드됩니다.",[48,22116,22118],{"id":22117},"이커머스용-프롬프트-템플릿-라이브러리","이커머스용 프롬프트 템플릿 라이브러리",[11,22120,22121,22122,22124],{},"가장 일반적인 이커머스 상품 카테고리를 위한 복사하여 붙여넣기 프롬프트입니다. 각 템플릿은 지정된 상품 유형에 맞게 설계되었으며 해당 카테고리의 모든 상품 사진에 직접 사용할 수 있습니다. ",[28,22123,20270],{}," 자리 표시자에 상품명을 넣으세요.",[137,22126,22128],{"className":338,"code":22127,"language":340,"meta":142,"style":142},"ECOMMERCE_PROMPTS = {\n    \"jewelry\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Extreme close-up on a black velvet surface. \"\n            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n            \"field. The camera pulls back to reveal the full piece. Luxury \"\n            \"jewelry advertisement quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"electronics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The device sits on a minimal desk setup. \"\n            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n            \"showing ports, buttons, and build quality from every angle. \"\n            \"Clean, modern aesthetic. Tech product showcase.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"apparel\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The garment is displayed on an invisible \"\n            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n            \"gentle airflow, showing drape and texture. Soft diffused \"\n            \"studio lighting. Clean white background. Fashion e-commerce \"\n            \"product video.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"food_beverage\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Steam rises gently. Camera pushes in slowly \"\n            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n            \"garnishes are visible in beautiful detail. Food photography \"\n            \"in motion.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"furniture\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Placed in a styled modern living room with \"\n            \"natural light streaming through large windows. Camera dollies \"\n            \"slowly around the piece, showing form and proportion in context. \"\n            \"Warm afternoon light. Interior design showcase quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"cosmetics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The product sits on a marble surface with \"\n            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n            \"the product, showing color and texture. Macro close-up of the \"\n            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"sports_gear\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Dynamic presentation against a dark \"\n            \"background with dramatic side lighting. The product rotates \"\n            \"with energy — quick cuts between angles showing key features. \"\n            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"home_decor\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Displayed in a curated shelf vignette with \"\n            \"complementary objects. Soft natural light. Camera slowly racks \"\n            \"focus from background to the product. Cozy, aspirational \"\n            \"interior styling. Lifestyle brand aesthetic.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n}\n\n\ndef generate_from_template(category: str, name: str, image_url: str) -> dict:\n    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n    template = ECOMMERCE_PROMPTS[category]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": template[\"prompt\"].format(name=name),\n        \"duration\": template[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": template[\"aspect_ratio\"],\n    }\n    return create_and_wait(payload)\n\n\n# Example usage\nresult = generate_from_template(\n    category=\"jewelry\",\n    name=\"18K gold pendant necklace with emerald\",\n    image_url=\"https://your-cdn.com/products/emerald-pendant.jpg\"\n)\n",[28,22129,22130,22139,22146,22152,22162,22167,22172,22177,22182,22186,22196,22206,22211,22218,22224,22233,22238,22243,22248,22252,22262,22272,22276,22283,22289,22298,22303,22308,22313,22318,22322,22332,22342,22346,22353,22359,22368,22373,22378,22383,22388,22392,22402,22412,22416,22423,22429,22438,22443,22448,22453,22457,22467,22477,22481,22488,22494,22503,22508,22513,22518,22522,22532,22542,22546,22553,22559,22568,22573,22578,22583,22587,22597,22607,22611,22618,22624,22633,22638,22643,22648,22652,22662,22672,22676,22680,22684,22688,22715,22720,22733,22741,22751,22757,22775,22785,22795,22805,22809,22815,22819,22823,22828,22837,22849,22861,22871],{"__ignoreMap":142},[146,22131,22132,22135,22137],{"class":148,"line":149},[146,22133,22134],{"class":156},"ECOMMERCE_PROMPTS",[146,22136,391],{"class":259},[146,22138,428],{"class":263},[146,22140,22141,22144],{"class":148,"line":167},[146,22142,22143],{"class":160},"    \"jewelry\"",[146,22145,1942],{"class":263},[146,22147,22148,22150],{"class":148,"line":179},[146,22149,1319],{"class":160},[146,22151,1322],{"class":263},[146,22153,22154,22157,22159],{"class":148,"line":188},[146,22155,22156],{"class":160},"            \"@Image1 is ",[146,22158,20270],{"class":156},[146,22160,22161],{"class":160},". Extreme close-up on a black velvet surface. \"\n",[146,22163,22164],{"class":148,"line":373},[146,22165,22166],{"class":160},"            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n",[146,22168,22169],{"class":148,"line":379},[146,22170,22171],{"class":160},"            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n",[146,22173,22174],{"class":148,"line":385},[146,22175,22176],{"class":160},"            \"field. The camera pulls back to reveal the full piece. Luxury \"\n",[146,22178,22179],{"class":148,"line":409},[146,22180,22181],{"class":160},"            \"jewelry advertisement quality.\"\n",[146,22183,22184],{"class":148,"line":420},[146,22185,1342],{"class":263},[146,22187,22188,22190,22192,22194],{"class":148,"line":431},[146,22189,1347],{"class":160},[146,22191,437],{"class":263},[146,22193,537],{"class":156},[146,22195,452],{"class":263},[146,22197,22198,22200,22202,22204],{"class":148,"line":455},[146,22199,1379],{"class":160},[146,22201,437],{"class":263},[146,22203,6143],{"class":160},[146,22205,452],{"class":263},[146,22207,22208],{"class":148,"line":466},[146,22209,22210],{"class":263},"    },\n",[146,22212,22213,22216],{"class":148,"line":600},[146,22214,22215],{"class":160},"    \"electronics\"",[146,22217,1942],{"class":263},[146,22219,22220,22222],{"class":148,"line":605},[146,22221,1319],{"class":160},[146,22223,1322],{"class":263},[146,22225,22226,22228,22230],{"class":148,"line":611},[146,22227,22156],{"class":160},[146,22229,20270],{"class":156},[146,22231,22232],{"class":160},". The device sits on a minimal desk setup. \"\n",[146,22234,22235],{"class":148,"line":617},[146,22236,22237],{"class":160},"            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n",[146,22239,22240],{"class":148,"line":623},[146,22241,22242],{"class":160},"            \"showing ports, buttons, and build quality from every angle. \"\n",[146,22244,22245],{"class":148,"line":628},[146,22246,22247],{"class":160},"            \"Clean, modern aesthetic. Tech product showcase.\"\n",[146,22249,22250],{"class":148,"line":639},[146,22251,1342],{"class":263},[146,22253,22254,22256,22258,22260],{"class":148,"line":654},[146,22255,1347],{"class":160},[146,22257,437],{"class":263},[146,22259,537],{"class":156},[146,22261,452],{"class":263},[146,22263,22264,22266,22268,22270],{"class":148,"line":660},[146,22265,1379],{"class":160},[146,22267,437],{"class":263},[146,22269,1384],{"class":160},[146,22271,452],{"class":263},[146,22273,22274],{"class":148,"line":671},[146,22275,22210],{"class":263},[146,22277,22278,22281],{"class":148,"line":698},[146,22279,22280],{"class":160},"    \"apparel\"",[146,22282,1942],{"class":263},[146,22284,22285,22287],{"class":148,"line":710},[146,22286,1319],{"class":160},[146,22288,1322],{"class":263},[146,22290,22291,22293,22295],{"class":148,"line":716},[146,22292,22156],{"class":160},[146,22294,20270],{"class":156},[146,22296,22297],{"class":160},". The garment is displayed on an invisible \"\n",[146,22299,22300],{"class":148,"line":722},[146,22301,22302],{"class":160},"            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n",[146,22304,22305],{"class":148,"line":728},[146,22306,22307],{"class":160},"            \"gentle airflow, showing drape and texture. Soft diffused \"\n",[146,22309,22310],{"class":148,"line":739},[146,22311,22312],{"class":160},"            \"studio lighting. Clean white background. Fashion e-commerce \"\n",[146,22314,22315],{"class":148,"line":744},[146,22316,22317],{"class":160},"            \"product video.\"\n",[146,22319,22320],{"class":148,"line":750},[146,22321,1342],{"class":263},[146,22323,22324,22326,22328,22330],{"class":148,"line":767},[146,22325,1347],{"class":160},[146,22327,437],{"class":263},[146,22329,3702],{"class":156},[146,22331,452],{"class":263},[146,22333,22334,22336,22338,22340],{"class":148,"line":788},[146,22335,1379],{"class":160},[146,22337,437],{"class":263},[146,22339,3726],{"class":160},[146,22341,452],{"class":263},[146,22343,22344],{"class":148,"line":834},[146,22345,22210],{"class":263},[146,22347,22348,22351],{"class":148,"line":839},[146,22349,22350],{"class":160},"    \"food_beverage\"",[146,22352,1942],{"class":263},[146,22354,22355,22357],{"class":148,"line":845},[146,22356,1319],{"class":160},[146,22358,1322],{"class":263},[146,22360,22361,22363,22365],{"class":148,"line":863},[146,22362,22156],{"class":160},[146,22364,20270],{"class":156},[146,22366,22367],{"class":160},". Steam rises gently. Camera pushes in slowly \"\n",[146,22369,22370],{"class":148,"line":872},[146,22371,22372],{"class":160},"            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n",[146,22374,22375],{"class":148,"line":887},[146,22376,22377],{"class":160},"            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n",[146,22379,22380],{"class":148,"line":903},[146,22381,22382],{"class":160},"            \"garnishes are visible in beautiful detail. Food photography \"\n",[146,22384,22385],{"class":148,"line":915},[146,22386,22387],{"class":160},"            \"in motion.\"\n",[146,22389,22390],{"class":148,"line":953},[146,22391,1342],{"class":263},[146,22393,22394,22396,22398,22400],{"class":148,"line":959},[146,22395,1347],{"class":160},[146,22397,437],{"class":263},[146,22399,3702],{"class":156},[146,22401,452],{"class":263},[146,22403,22404,22406,22408,22410],{"class":148,"line":964},[146,22405,1379],{"class":160},[146,22407,437],{"class":263},[146,22409,6143],{"class":160},[146,22411,452],{"class":263},[146,22413,22414],{"class":148,"line":970},[146,22415,22210],{"class":263},[146,22417,22418,22421],{"class":148,"line":976},[146,22419,22420],{"class":160},"    \"furniture\"",[146,22422,1942],{"class":263},[146,22424,22425,22427],{"class":148,"line":988},[146,22426,1319],{"class":160},[146,22428,1322],{"class":263},[146,22430,22431,22433,22435],{"class":148,"line":993},[146,22432,22156],{"class":160},[146,22434,20270],{"class":156},[146,22436,22437],{"class":160},". Placed in a styled modern living room with \"\n",[146,22439,22440],{"class":148,"line":5534},[146,22441,22442],{"class":160},"            \"natural light streaming through large windows. Camera dollies \"\n",[146,22444,22445],{"class":148,"line":5543},[146,22446,22447],{"class":160},"            \"slowly around the piece, showing form and proportion in context. \"\n",[146,22449,22450],{"class":148,"line":5549},[146,22451,22452],{"class":160},"            \"Warm afternoon light. Interior design showcase quality.\"\n",[146,22454,22455],{"class":148,"line":5577},[146,22456,1342],{"class":263},[146,22458,22459,22461,22463,22465],{"class":148,"line":5608},[146,22460,1347],{"class":160},[146,22462,437],{"class":263},[146,22464,537],{"class":156},[146,22466,452],{"class":263},[146,22468,22469,22471,22473,22475],{"class":148,"line":5628},[146,22470,1379],{"class":160},[146,22472,437],{"class":263},[146,22474,1384],{"class":160},[146,22476,452],{"class":263},[146,22478,22479],{"class":148,"line":5634},[146,22480,22210],{"class":263},[146,22482,22483,22486],{"class":148,"line":5640},[146,22484,22485],{"class":160},"    \"cosmetics\"",[146,22487,1942],{"class":263},[146,22489,22490,22492],{"class":148,"line":5645},[146,22491,1319],{"class":160},[146,22493,1322],{"class":263},[146,22495,22496,22498,22500],{"class":148,"line":5658},[146,22497,22156],{"class":160},[146,22499,20270],{"class":156},[146,22501,22502],{"class":160},". The product sits on a marble surface with \"\n",[146,22504,22505],{"class":148,"line":5664},[146,22506,22507],{"class":160},"            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n",[146,22509,22510],{"class":148,"line":5691},[146,22511,22512],{"class":160},"            \"the product, showing color and texture. Macro close-up of the \"\n",[146,22514,22515],{"class":148,"line":5731},[146,22516,22517],{"class":160},"            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n",[146,22519,22520],{"class":148,"line":5750},[146,22521,1342],{"class":263},[146,22523,22524,22526,22528,22530],{"class":148,"line":5755},[146,22525,1347],{"class":160},[146,22527,437],{"class":263},[146,22529,3702],{"class":156},[146,22531,452],{"class":263},[146,22533,22534,22536,22538,22540],{"class":148,"line":5760},[146,22535,1379],{"class":160},[146,22537,437],{"class":263},[146,22539,3726],{"class":160},[146,22541,452],{"class":263},[146,22543,22544],{"class":148,"line":5765},[146,22545,22210],{"class":263},[146,22547,22548,22551],{"class":148,"line":7445},[146,22549,22550],{"class":160},"    \"sports_gear\"",[146,22552,1942],{"class":263},[146,22554,22555,22557],{"class":148,"line":7451},[146,22556,1319],{"class":160},[146,22558,1322],{"class":263},[146,22560,22561,22563,22565],{"class":148,"line":7462},[146,22562,22156],{"class":160},[146,22564,20270],{"class":156},[146,22566,22567],{"class":160},". Dynamic presentation against a dark \"\n",[146,22569,22570],{"class":148,"line":7473},[146,22571,22572],{"class":160},"            \"background with dramatic side lighting. The product rotates \"\n",[146,22574,22575],{"class":148,"line":7484},[146,22576,22577],{"class":160},"            \"with energy — quick cuts between angles showing key features. \"\n",[146,22579,22580],{"class":148,"line":7489},[146,22581,22582],{"class":160},"            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n",[146,22584,22585],{"class":148,"line":7495},[146,22586,1342],{"class":263},[146,22588,22589,22591,22593,22595],{"class":148,"line":7503},[146,22590,1347],{"class":160},[146,22592,437],{"class":263},[146,22594,3702],{"class":156},[146,22596,452],{"class":263},[146,22598,22599,22601,22603,22605],{"class":148,"line":7517},[146,22600,1379],{"class":160},[146,22602,437],{"class":263},[146,22604,1384],{"class":160},[146,22606,452],{"class":263},[146,22608,22609],{"class":148,"line":7522},[146,22610,22210],{"class":263},[146,22612,22613,22616],{"class":148,"line":7536},[146,22614,22615],{"class":160},"    \"home_decor\"",[146,22617,1942],{"class":263},[146,22619,22620,22622],{"class":148,"line":7550},[146,22621,1319],{"class":160},[146,22623,1322],{"class":263},[146,22625,22626,22628,22630],{"class":148,"line":7582},[146,22627,22156],{"class":160},[146,22629,20270],{"class":156},[146,22631,22632],{"class":160},". Displayed in a curated shelf vignette with \"\n",[146,22634,22635],{"class":148,"line":7594},[146,22636,22637],{"class":160},"            \"complementary objects. Soft natural light. Camera slowly racks \"\n",[146,22639,22640],{"class":148,"line":7604},[146,22641,22642],{"class":160},"            \"focus from background to the product. Cozy, aspirational \"\n",[146,22644,22645],{"class":148,"line":7609},[146,22646,22647],{"class":160},"            \"interior styling. Lifestyle brand aesthetic.\"\n",[146,22649,22650],{"class":148,"line":7616},[146,22651,1342],{"class":263},[146,22653,22654,22656,22658,22660],{"class":148,"line":7638},[146,22655,1347],{"class":160},[146,22657,437],{"class":263},[146,22659,3702],{"class":156},[146,22661,452],{"class":263},[146,22663,22664,22666,22668,22670],{"class":148,"line":7669},[146,22665,1379],{"class":160},[146,22667,437],{"class":263},[146,22669,6143],{"class":160},[146,22671,452],{"class":263},[146,22673,22674],{"class":148,"line":7674},[146,22675,22210],{"class":263},[146,22677,22678],{"class":148,"line":7680},[146,22679,469],{"class":263},[146,22681,22682],{"class":148,"line":7705},[146,22683,376],{"emptyLinePlaceholder":58},[146,22685,22686],{"class":148,"line":7710},[146,22687,376],{"emptyLinePlaceholder":58},[146,22689,22690,22692,22695,22698,22700,22703,22705,22707,22709,22711,22713],{"class":148,"line":7715},[146,22691,526],{"class":259},[146,22693,22694],{"class":152}," generate_from_template",[146,22696,22697],{"class":263},"(category: ",[146,22699,8674],{"class":156},[146,22701,22702],{"class":263},", name: ",[146,22704,8674],{"class":156},[146,22706,20575],{"class":263},[146,22708,8674],{"class":156},[146,22710,15849],{"class":263},[146,22712,8799],{"class":156},[146,22714,860],{"class":263},[146,22716,22717],{"class":148,"line":7738},[146,22718,22719],{"class":160},"    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n",[146,22721,22722,22725,22727,22730],{"class":148,"line":7748},[146,22723,22724],{"class":263},"    template ",[146,22726,267],{"class":259},[146,22728,22729],{"class":156}," ECOMMERCE_PROMPTS",[146,22731,22732],{"class":263},"[category]\n",[146,22734,22735,22737,22739],{"class":148,"line":7754},[146,22736,1294],{"class":263},[146,22738,267],{"class":259},[146,22740,428],{"class":263},[146,22742,22743,22745,22747,22749],{"class":148,"line":7772},[146,22744,1303],{"class":160},[146,22746,437],{"class":263},[146,22748,1308],{"class":160},[146,22750,452],{"class":263},[146,22752,22753,22755],{"class":148,"line":7777},[146,22754,2690],{"class":160},[146,22756,20664],{"class":263},[146,22758,22759,22761,22764,22766,22769,22771,22773],{"class":148,"line":7782},[146,22760,1319],{"class":160},[146,22762,22763],{"class":263},": template[",[146,22765,5924],{"class":160},[146,22767,22768],{"class":263},"].format(",[146,22770,20674],{"class":701},[146,22772,267],{"class":259},[146,22774,20679],{"class":263},[146,22776,22777,22779,22781,22783],{"class":148,"line":7795},[146,22778,1347],{"class":160},[146,22780,22763],{"class":263},[146,22782,5969],{"class":160},[146,22784,10852],{"class":263},[146,22786,22787,22789,22791,22793],{"class":148,"line":7809},[146,22788,1363],{"class":160},[146,22790,437],{"class":263},[146,22792,3714],{"class":160},[146,22794,452],{"class":263},[146,22796,22797,22799,22801,22803],{"class":148,"line":7836},[146,22798,1379],{"class":160},[146,22800,22763],{"class":263},[146,22802,6171],{"class":160},[146,22804,10852],{"class":263},[146,22806,22807],{"class":148,"line":7850},[146,22808,1407],{"class":263},[146,22810,22811,22813],{"class":148,"line":10372},[146,22812,1703],{"class":259},[146,22814,18284],{"class":263},[146,22816,22817],{"class":148,"line":10379},[146,22818,376],{"emptyLinePlaceholder":58},[146,22820,22821],{"class":148,"line":10425},[146,22822,376],{"emptyLinePlaceholder":58},[146,22824,22825],{"class":148,"line":10430},[146,22826,22827],{"class":175},"# Example usage\n",[146,22829,22830,22832,22834],{"class":148,"line":10435},[146,22831,12238],{"class":263},[146,22833,267],{"class":259},[146,22835,22836],{"class":263}," generate_from_template(\n",[146,22838,22839,22842,22844,22847],{"class":148,"line":10444},[146,22840,22841],{"class":701},"    category",[146,22843,267],{"class":259},[146,22845,22846],{"class":160},"\"jewelry\"",[146,22848,452],{"class":263},[146,22850,22851,22854,22856,22859],{"class":148,"line":10450},[146,22852,22853],{"class":701},"    name",[146,22855,267],{"class":259},[146,22857,22858],{"class":160},"\"18K gold pendant necklace with emerald\"",[146,22860,452],{"class":263},[146,22862,22863,22866,22868],{"class":148,"line":10459},[146,22864,22865],{"class":701},"    image_url",[146,22867,267],{"class":259},[146,22869,22870],{"class":160},"\"https://your-cdn.com/products/emerald-pendant.jpg\"\n",[146,22872,22873],{"class":148,"line":10480},[146,22874,406],{"class":263},[11,22876,22877,22878,22881],{},"이 템플릿들은 시작점입니다. 브랜드의 비주얼 아이덴티티에 맞게 조명 설명과 카메라 움직임을 조정하세요. ",[37,22879,22880],{"href":1766},"전체 프롬프트 가이드","에서 Seedance 2.0 출력 미세 조정을 위한 고급 기법을 다룹니다.",[92,22883,22885],{"id":22884},"브랜드에-맞게-템플릿-커스터마이징","브랜드에 맞게 템플릿 커스터마이징",[11,22887,22888],{},"모든 브랜드에는 비주얼 언어가 있습니다. Apple은 정확하고 느린 카메라 움직임과 함께 깨끗한 흰색 환경을 사용합니다. Nike는 빠른 컷과 함께 다이나믹하고 고대비 조명을 사용합니다. 상품 영상은 브랜드의 확립된 미학을 반영해야 합니다.",[11,22890,22891],{},"다음 축을 따라 템플릿을 수정하세요:",[97,22893,22894,22900,22906,22912],{},[73,22895,22896,22899],{},[23,22897,22898],{},"조명 톤:"," 장인/럭셔리 브랜드에는 따뜻한(골드, 앰버). 테크에는 쿨한(블루, 실버). 미니멀리스트 브랜드에는 뉴트럴(화이트, 소프트).",[73,22901,22902,22905],{},[23,22903,22904],{},"카메라 속도:"," 프리미엄 포지셔닝에는 느리고 의도적인 움직임. 청년층 대상이나 스포츠 브랜드에는 더 빠르고 다이나믹한 움직임.",[73,22907,22908,22911],{},[23,22909,22910],{},"배경:"," 어두운 배경은 럭셔리를 신호합니다. 흰색 배경은 깔끔함/모던함을 신호합니다. 환경적 배경은 라이프스타일을 신호합니다.",[73,22913,22914,22917],{},[23,22915,22916],{},"페이싱 어휘:"," \"Slow, measured\" vs. \"dynamic, energetic\" vs. \"calm, meditative\" — 이 단어들이 모델의 출력 템포에 직접 영향을 미칩니다.",[11,22919,22920],{},"브랜드의 마스터 프롬프트 접두사 — 모든 상품 영상 프롬프트 앞에 붙는 용어 세트 — 를 구축하고 카탈로그 전체에 일관되게 적용하세요. 이를 통해 단일 스튜디오 설정에서 얻을 수 있는 일관성을 모방하여 수백 개의 상품 영상에 걸쳐 시각적 통일감을 만듭니다.",[48,22922,13302],{"id":13301},[92,22924,22926],{"id":22925},"상품-영상-생성-비용은-얼마인가요","상품 영상 생성 비용은 얼마인가요?",[11,22928,22929,22930,22935],{},"가격은 duration과 품질 설정에 따라 달라집니다. 표준 8초 1080p 품질 영상은 몇 센트입니다. 전체 카탈로그에 대해 500개의 상품 영상을 생성해도 대부분의 구성에서 $100 미만입니다. 현재 요금은 ",[37,22931,22934],{"href":22932,"rel":22933},"https://evolink.ai/pricing",[41],"EvoLink 가격","을 확인하세요. 스튜디오가 영상당 $500~$2,000을 청구하는 것과 비교하면, API 비용은 어떤 규모에서든 사실상 무시할 수 있는 수준입니다.",[92,22937,22939],{"id":22938},"실제-사람-모델-사진을-입력으로-사용할-수-있나요","실제 사람 모델 사진을 입력으로 사용할 수 있나요?",[11,22941,22942],{},"Seedance 2.0은 딥페이크 악용을 방지하기 위해 사실적인 인간 얼굴 생성에 제한이 있습니다. 상품 전용 사진은 제한 없이 작동합니다. 사람과 함께 상품을 보여줘야 하는 경우 — 모델 위의 의류, 손목 위의 시계 — 사실적인 초상화 대신 일러스트나 스타일화된 인간 참조를 사용하세요. 또는 프롬프트에서 인간 요소를 설명하고(예: \"a hand reaches into frame\") 얼굴 사진을 입력으로 제공하는 대신 모델이 생성하도록 하세요.",[92,22944,22946],{"id":22945},"영상-생성에-얼마나-걸리나요","영상 생성에 얼마나 걸리나요?",[11,22948,22949,22950,22952],{},"일반적인 생성 시간은 duration과 품질 설정에 따라 60~180초입니다. 720p에서 5초 영상은 약 1분 만에 완료됩니다. 1080p에서 15초 영상은 최대 3분이 걸릴 수 있습니다. 이 가이드의 배치 파이프라인은 폴링을 통해 타이밍을 자동으로 처리합니다. 프로덕션 시스템에서는 폴링 대신 완료 시 웹훅을 수신하는 ",[28,22951,3603],{}," 파라미터를 사용하세요.",[92,22954,22956],{"id":22955},"브랜드-로고나-텍스트-오버레이를-추가할-수-있나요","브랜드 로고나 텍스트 오버레이를 추가할 수 있나요?",[11,22958,22959],{},"두 가지 접근 방식이 있습니다. 첫째, 프롬프트에 텍스트 설명을 포함합니다 — \"Brand name fades in at the end\" 또는 \"Logo watermark in lower right corner.\" 모델이 텍스트와 유사한 요소를 생성할 수 있지만, 정확한 타이포그래피는 보장되지 않습니다. 둘째, 더 안정적으로, 텍스트 없이 영상을 생성하고 FFmpeg, After Effects 또는 원하는 영상 편집 도구를 사용하여 후반 작업에서 로고, 타이틀 또는 하단 자막을 합성합니다. 두 번째 접근 방식이 브랜드 에셋에 대한 정확한 제어를 제공합니다.",[92,22961,22963],{"id":22962},"영상-품질이-상업적-사용에-충분한가요","영상 품질이 상업적 사용에 충분한가요?",[11,22965,22966],{},"1080p 품질에서 출력물은 상품 리스팅, 소셜 미디어 광고, 웹사이트 히어로 섹션에 적합합니다. 시각적 품질은 대부분의 이커머스 팀이 기본 스튜디오 설정으로 제작하는 것과 동등하거나 그 이상입니다. 하이엔드 브랜드 캠페인이나 방송 TV의 경우, AI 생성 영상을 프리비즈(previz) 또는 시작점으로 사용한 후 기존 후반 작업으로 정제할 수 있습니다. 이커머스 사용 사례의 대다수 — Amazon, Shopify, 소셜 광고, 이메일 캠페인 — 에서 출력물은 프로덕션 준비가 완료된 상태입니다.",[92,22968,22970],{"id":22969},"입력에-가장-적합한-이미지-형식과-해상도는-무엇인가요","입력에 가장 적합한 이미지 형식과 해상도는 무엇인가요?",[11,22972,22973],{},"JPEG과 PNG 모두 작동합니다. 투명도가 있는 PNG는 깨끗한 배경 교체가 필요한 상품에 이상적입니다. 해상도는 가능한 가장 높은 품질의 소스 이미지를 제공하세요 — 최소 1024x1024 픽셀. 모델이 높은 해상도 입력에서 더 많은 디테일을 추출하며, 이는 매크로 클로즈업과 회전 영상에서 특히 눈에 띕니다. 눈에 보이는 아티팩트가 있는 심하게 압축된 JPEG은 생성된 영상에 그대로 전달되므로 피하세요.",[92,22975,22977],{"id":22976},"오디오나-음악이-포함된-영상을-생성할-수-있나요","오디오나 음악이 포함된 영상을 생성할 수 있나요?",[11,22979,22980,22981,22983,22984,22986,22987,1260],{},"Seedance 2.0은 영상에 맥락에 맞는 사운드 이펙트를 추가하는 ",[28,22982,1822],{}," 파라미터를 지원합니다. 상품 영상에서 앰비언트 스튜디오 사운드나 미묘한 스우시 효과가 프리미엄 느낌을 향상시킬 수 있습니다. 그러나 대부분의 이커머스 플랫폼은 소리 없이 영상을 자동 재생하므로, 시각적 품질이 훨씬 더 중요합니다. 특정 음악이나 보이스오버가 필요하면 후반 작업에서 추가하세요. API는 오디오 기반 생성을 위한 ",[28,22985,3587],{},"도 지원합니다 — 자세한 내용은 ",[37,22988,22990],{"href":22989},"/docs/multimodal-reference","멀티모달 참조 문서",[92,22992,22994],{"id":22993},"shopify나-amazon과-어떻게-통합하나요","Shopify나 Amazon과 어떻게 통합하나요?",[11,22996,22997,22998,23000,23001,23003],{},"워크플로우는 다음과 같습니다: 영상 생성 → MP4 다운로드 → 플랫폼에 업로드. Shopify의 경우 관리자 또는 Shopify API를 통해 영상을 상품 미디어에 직접 업로드합니다. Amazon의 경우 Seller Central의 \"동영상 관리\" 섹션 또는 SP-API를 통해 업로드합니다. 전체 루프를 자동화하려면 ",[28,22999,3603],{},"이 있는 배치 파이프라인을 사용하세요 — 웹훅 핸들러가 영상을 다운로드하고 자동으로 플랫폼 API로 푸시할 수 있습니다. ",[37,23002,22990],{"href":22989},"에서 통합 구축을 위한 전체 API 응답 형식을 다룹니다.",[48,23005,23007],{"id":23006},"스튜디오에서-api로-새로운-영상-파이프라인","스튜디오에서 API로: 새로운 영상 파이프라인",[11,23009,23010],{},"5가지 영상 유형이 이커머스 상품 영상의 전체 스펙트럼을 커버합니다: 상품 페이지용 360° 회전, 런칭용 히어로 샷, 감정적 연결을 위한 라이프스타일 컨텍스트, 품질 인식을 위한 매크로 클로즈업, 소셜 콘텐츠를 위한 언박싱 공개. 각 유형에는 상품 사진 한 장과 API 호출 한 번이 필요합니다.",[11,23012,23013],{},"배치 파이프라인은 CSV 카탈로그를 완전한 영상 라이브러리로 변환합니다. 멀티 플랫폼 내보내기는 채널이 필요로 하는 모든 화면 비율을 한 번에 생성합니다. 프롬프트 템플릿 라이브러리는 모든 상품 카테고리에 대한 복사하여 붙여넣기 시작점을 제공합니다.",[11,23015,23016],{},"전체 워크플로우 — 상품 사진에서 모든 판매 채널에 게시된 영상까지 — 가 수 주에서 수 시간으로 압축됩니다. 단일 개발자가 이전에 프로덕션 팀, 스튜디오, 후반 작업 편집자가 필요했던 영상 파이프라인을 운영할 수 있습니다.",[11,23018,23019],{},"이것은 기존 영상 제작 대비 점진적 개선이 아닙니다. 구조적 전환입니다. 이커머스 영상의 병목은 창의적 비전이 아니었습니다 — 비용과 물류였습니다. 단일 영상이 몇 센트에 불과하고 2분이면 만들어질 때, 질문은 \"어떤 상품이 영상을 가질 자격이 있는가?\"에서 \"왜 모든 상품에 영상이 없는가?\"로 바뀝니다.",[11,23021,23022],{},"한 개 상품으로 시작하세요. 회전 영상을 생성하세요. 3분 후 결과를 확인하세요. 그런 다음 전체 카탈로그로 확장하세요. API는 영상 한 개를 생성하든 만 개를 생성하든 동일합니다.",[11,23024,23025,23026],{},"영상 제작 파이프라인을 교체하세요. ",[37,23027,23029],{"href":212,"rel":23028},[41],"EvoLink 무료 가입 →",[45,23031],{},[11,23033,23034],{},[2621,23035,23036,23037,23039,23040,23039,23042,23039,23044],{},"이 시리즈의 이전 글: ",[37,23038,2209],{"href":1766}," · ",[37,23041,2970],{"href":2969},[37,23043,19182],{"href":3860},[37,23045,23046],{"href":3384},"이미지-투-비디오 튜토리얼",[11222,23048,13444],{},{"title":142,"searchDepth":167,"depth":167,"links":23050},[23051,23054,23055,23059,23063,23067,23071,23076,23081,23086,23089,23099],{"id":17410,"depth":167,"text":17411,"children":23052},[23053],{"id":17535,"depth":179,"text":17536},{"id":17545,"depth":167,"text":17546},{"id":18159,"depth":167,"text":18160,"children":23056},[23057,23058],{"id":18320,"depth":179,"text":18321},{"id":18385,"depth":179,"text":18386},{"id":18426,"depth":167,"text":18427,"children":23060},[23061,23062],{"id":18558,"depth":179,"text":18559},{"id":18601,"depth":179,"text":18602},{"id":18644,"depth":167,"text":18645,"children":23064},[23065,23066],{"id":18815,"depth":179,"text":18816},{"id":18905,"depth":179,"text":18906},{"id":18954,"depth":167,"text":18955,"children":23068},[23069,23070],{"id":19088,"depth":179,"text":19089},{"id":19127,"depth":179,"text":19128},{"id":19185,"depth":167,"text":19186,"children":23072},[23073,23074,23075],{"id":19322,"depth":179,"text":19323},{"id":19356,"depth":179,"text":19357},{"id":19366,"depth":179,"text":19367},{"id":19405,"depth":167,"text":19406,"children":23077},[23078,23079,23080],{"id":19545,"depth":179,"text":19546},{"id":20002,"depth":179,"text":20003},{"id":20012,"depth":179,"text":20013},{"id":20057,"depth":167,"text":20058,"children":23082},[23083,23084,23085],{"id":21926,"depth":179,"text":21927},{"id":22030,"depth":179,"text":22031},{"id":22079,"depth":179,"text":22080},{"id":22117,"depth":167,"text":22118,"children":23087},[23088],{"id":22884,"depth":179,"text":22885},{"id":13301,"depth":167,"text":13302,"children":23090},[23091,23092,23093,23094,23095,23096,23097,23098],{"id":22925,"depth":179,"text":22926},{"id":22938,"depth":179,"text":22939},{"id":22945,"depth":179,"text":22946},{"id":22955,"depth":179,"text":22956},{"id":22962,"depth":179,"text":22963},{"id":22969,"depth":179,"text":22970},{"id":22976,"depth":179,"text":22977},{"id":22993,"depth":179,"text":22994},{"id":23006,"depth":167,"text":23007},"Seedance 2.0 API를 사용하여 상품 사진에서 이커머스 영상을 생성하세요. 5가지 영상 유형, 배치 파이프라인, 멀티 플랫폼 내보내기. 완전한 Python 코드 포함.",{"date":23102,"image":23103,"seoTitle":23104},"2026-02-21","/s7-hero-ecommerce-product-videos.webp","Seedance 2.0 API로 이커머스 AI 상품 영상 제작 | 튜토리얼","/ko/blog/seedance-2-ecommerce-product-videos",{"title":17396,"description":23100},"ko/blog/seedance-2-ecommerce-product-videos","SP4FORHVIEqgeL4E_3YvAIhXBZgxYriF_cJABKGd59k",{"id":23110,"title":23111,"body":23112,"description":30406,"extension":11284,"meta":30407,"navigation":58,"path":30410,"seo":30411,"stem":30412,"__hash__":30413},"content/ko/blog/seedance-2-image-to-video-api.md","Seedance 2.0 이미지-투-비디오 API: 모든 이미지를 완벽하게 제어하며 애니메이션화",{"type":8,"value":23113,"toc":30335},[23114,23118,23121,23128,23130,23134,23137,23144,23148,23269,23274,23280,23285,23289,23292,23301,23304,23308,23315,23319,23322,23324,23328,23334,23338,23352,23361,23365,23377,23380,23384,23463,23470,23479,23483,23486,23772,23784,23790,23792,23796,23799,23801,23810,23836,23843,23847,24377,24387,24391,24395,24403,24409,24413,24418,24425,24428,24432,24435,24440,24446,24451,24457,24472,24475,24528,24537,24539,24543,24550,24553,24558,24572,24579,24583,24586,24618,24622,25138,25142,25147,25154,25157,25161,25167,25177,25183,25189,25233,25235,25239,25245,25249,25254,25260,25263,25269,25272,25276,25853,25857,25861,25868,25874,25878,25883,25978,25982,25987,25994,26000,26008,26010,26014,26024,26028,26034,26489,26493,26497,26504,26507,26511,26517,26525,26531,26540,26599,26608,26612,26615,27607,27616,27620,27623,27629,27635,27646,27648,27652,27659,27663,27666,27683,27686,27697,27701,27704,28233,28237,28241,28248,28251,28255,28261,28466,28470,28474,28481,28484,28488,28491,29078,29084,29088,29091,29250,29252,29256,29259,29263,29275,29281,29287,29350,29354,29359,29364,29369,29432,29436,29441,29446,29451,29497,29501,29506,29511,29528,29533,29571,29630,29634,29642,29650,29721,29725,29730,29735,29740,29888,29890,29894,29899,29904,29913,29966,29968,29972,29975,30178,30199,30201,30203,30207,30210,30214,30223,30227,30232,30236,30251,30255,30264,30268,30277,30281,30287,30289,30293,30300,30303,30309,30317,30319,30333],[23115,23116,23111],"h1",{"id":23117},"seedance-20-이미지-투-비디오-api-모든-이미지를-완벽하게-제어하며-애니메이션화",[11,23119,23120],{},"하드 드라이브에 저장된 제품 사진 한 장은 아무런 반응도 이끌어내지 못합니다. 하지만 그 제품이 스튜디오 조명 아래에서 회전하며 동기화된 사운드가 포함된 10초짜리 영상은 클릭, 공유, 그리고 매출을 만들어냅니다. Seedance 2.0의 이미지-투-비디오 API는 단일 POST 요청 하나로 정적 이미지를 완벽하게 제어 가능한 영상으로 변환합니다.",[11,23122,23123,23124,23127],{},"이 가이드에서는 세 가지 이미지-투-비디오 모드를 다룹니다: 단일 이미지 애니메이션, 첫-마지막 프레임 보간, 그리고 ",[28,23125,23126],{},"@tag"," 참조를 활용한 멀티 이미지 합성입니다. 각 섹션에는 완전히 실행 가능한 Python 코드, 실제 데모 출력, 그리고 해당 결과물을 생성한 정확한 프롬프트가 포함되어 있습니다.",[45,23129],{},[48,23131,23133],{"id":23132},"seedance-20의-이미지-투-비디오가-다른-점","Seedance 2.0의 이미지-투-비디오가 다른 점",[11,23135,23136],{},"모든 주요 AI 영상 플랫폼이 이제 어떤 형태로든 이미지-투-비디오 생성 기능을 제공합니다. Sora는 단일 이미지를 시작 프레임으로 받아들입니다. Kling은 기본적인 모션 제어와 함께 이미지 애니메이션을 제공합니다. Veo 2는 스타일 가이드를 위한 이미지 컨디셔닝을 지원합니다. 이들은 모두 같은 표면적 문제를 해결합니다: 그림을 움직이는 픽셀로 변환하는 것입니다.",[11,23138,23139,23140,23143],{},"Seedance 2.0은 근본적으로 다른 문제를 해결합니다. 단일 생성 요청 내에서 여러 이미지에 대한 ",[23,23141,23142],{},"구성적 제어","를 제공하며, 현재 다른 어떤 API도 따라오지 못하는 태깅 시스템을 통해 이를 실현합니다.",[92,23145,23147],{"id":23146},"핵심-차이점","핵심 차이점",[2035,23149,23150,23165],{},[2038,23151,23152],{},[2041,23153,23154,23157,23159,23161,23163],{},[2044,23155,23156],{},"기능",[2044,23158,17241],{},[2044,23160,13905],{},[2044,23162,17225],{},[2044,23164,17406],{},[2051,23166,23167,23180,23194,23208,23227,23241,23254],{},[2041,23168,23169,23172,23174,23176,23178],{},[2056,23170,23171],{},"단일 이미지 → 비디오",[2056,23173,13859],{},[2056,23175,13859],{},[2056,23177,13859],{},[2056,23179,13859],{},[2041,23181,23182,23185,23187,23190,23192],{},[2056,23183,23184],{},"첫-마지막 프레임 제어",[2056,23186,13842],{},[2056,23188,23189],{},"✅ (제한적)",[2056,23191,13842],{},[2056,23193,13859],{},[2041,23195,23196,23199,23201,23203,23205],{},[2056,23197,23198],{},"멀티 이미지 합성",[2056,23200,13842],{},[2056,23202,13842],{},[2056,23204,13842],{},[2056,23206,23207],{},"✅ (최대 9개 이미지)",[2041,23209,23210,23213,23215,23217,23219],{},[2056,23211,23212],{},"이미지별 역할 지정",[2056,23214,13842],{},[2056,23216,13842],{},[2056,23218,13842],{},[2056,23220,23221,23222,400,23224,23226],{},"✅ (",[28,23223,2911],{},[28,23225,2920],{},"…)",[2041,23228,23229,23232,23234,23236,23238],{},[2056,23230,23231],{},"혼합 미디어 (이미지 + 비디오 + 오디오)",[2056,23233,13842],{},[2056,23235,13842],{},[2056,23237,13842],{},[2056,23239,23240],{},"✅ (최대 12개 파일)",[2041,23242,23243,23246,23248,23250,23252],{},[2056,23244,23245],{},"네이티브 오디오 생성",[2056,23247,13842],{},[2056,23249,13842],{},[2056,23251,13842],{},[2056,23253,13859],{},[2041,23255,23256,23259,23262,23264,23267],{},[2056,23257,23258],{},"API 우선 접근",[2056,23260,23261],{},"대기자 명단",[2056,23263,13859],{},[2056,23265,23266],{},"제한적",[2056,23268,13859],{},[11,23270,23271,23273],{},[28,23272,23126],{}," 시스템이 바로 Seedance 2.0이 앞서가는 부분입니다. 세 장의 이미지를 업로드할 때 다음과 같은 프롬프트를 작성할 수 있습니다:",[137,23275,23278],{"className":23276,"code":23277,"language":2183},[2181],"@Image1 is the main character. @Image2 is the background environment.\n@Image3 is the art style reference. The character walks through the environment\nin the style of @Image3.\n",[28,23279,23277],{"__ignoreMap":142},[11,23281,23282,23283,1260],{},"각 이미지에 특정 의미적 역할이 부여됩니다. 모델이 어떤 이미지가 캐릭터이고 어떤 이미지가 배경인지 추측하지 않습니다 — 여러분이 명시적으로 지정합니다. 이 태깅 시스템에 대한 자세한 내용은 ",[37,23284,2970],{"href":2969},[92,23286,23288],{"id":23287},"개발자에게-tags가-중요한-이유","개발자에게 @Tags가 중요한 이유",[11,23290,23291],{},"다른 이미지-투-비디오 API를 사용해 본 적이 있다면 이런 답답함을 알고 계실 겁니다: 여러 이미지를 업로드하고 모델이 알아서 의도를 파악해주길 바라는 수밖에 없습니다. 때로는 배경 이미지를 캐릭터로 사용하기도 합니다. 때로는 모든 이미지를 일관성 없이 뒤섞기도 합니다. 모델이 각 입력을 어떻게 해석하는지 제어할 수 없기 때문에 디버깅할 방법도 없습니다.",[11,23293,23294,23296,23297,23300],{},[28,23295,23126],{}," 시스템은 이 불확실성을 제거합니다. 본질적으로 변수 바인딩 시스템입니다 — 각 입력에 이름을 지정하고 지시사항에서 명시적으로 참조합니다. 이를 통해 이미지-투-비디오 생성이 ",[23,23298,23299],{},"결정적이고 재현 가능","해집니다. 같은 입력, 같은 태그, 같은 프롬프트 → 매번 같은 의미적 해석이 이루어집니다.",[11,23302,23303],{},"프로덕션 파이프라인에서 이것은 \"실행해보고 결과를 확인하기\"와 \"설정하고 배포하기\" 사이의 차이입니다. 템플릿을 구축하고, 출력을 검증하며, 전체 구성이 예측 불가능하게 변하지 않으면서 특정 요소만 반복 수정할 수 있습니다.",[92,23305,23307],{"id":23306},"네이티브-오디오가-출력을-바꿉니다","네이티브 오디오가 출력을 바꿉니다",[11,23309,23310,23311,23314],{},"대부분의 AI 이미지-투-비디오 도구는 무음 클립을 생성합니다. 그런 다음 별도의 오디오 생성 단계, 별도의 API 호출, 그리고 이를 결합하기 위한 영상 편집 작업이 필요합니다. Seedance 2.0은 ",[28,23312,23313],{},"generate_audio: true"," 설정만으로 동일한 요청에서 동기화된 오디오를 생성합니다. 발소리는 걷는 동작과 일치합니다. 바람 소리는 야외 장면과 어울립니다. 이로써 전체 후반 작업 단계가 제거됩니다.",[92,23316,23318],{"id":23317},"지원하지-않는-것","지원하지 않는 것",[11,23320,23321],{},"Seedance 2.0은 이미지-투-비디오 생성에서 사실적인 인간 얼굴을 지원하지 않습니다. 입력 이미지에 사실적인 인간 얼굴이 포함되어 있으면 API가 자동으로 요청을 거부합니다. 일러스트 캐릭터, 스타일화된 얼굴, 애니메이션 캐릭터, 비사실적 초상화는 모두 정상적으로 작동합니다. 이것은 기술적 한계가 아닌 의도적인 안전 제약사항입니다.",[45,23323],{},[48,23325,23327],{"id":23326},"빠른-설정-api-키-및-환경","빠른 설정: API 키 및 환경",[11,23329,23330,23331,23333],{},"세 가지만 있으면 됩니다: EvoLink 계정, API 키, 그리고 ",[28,23332,113],{}," 라이브러리. 전체 설정은 1분 이내에 완료됩니다.",[92,23335,23337],{"id":23336},"_1단계-api-키-발급","1단계: API 키 발급",[70,23339,23340,23346,23349],{},[73,23341,23342,23345],{},[37,23343,11970],{"href":212,"rel":23344},[41],"에서 무료 계정을 생성합니다",[73,23347,23348],{},"대시보드에서 API Keys 섹션으로 이동합니다",[73,23350,23351],{},"새 키를 생성하고 복사합니다",[11,23353,23354,23355,23357,23358,4516],{},"키는 ",[28,23356,245],{},"로 시작하며 다음과 같은 형태입니다: ",[28,23359,23360],{},"sk-XpXn...Ms1N",[92,23362,23364],{"id":23363},"_2단계-의존성-설치","2단계: 의존성 설치",[137,23366,23367],{"className":139,"code":318,"language":141,"meta":142,"style":142},[28,23368,23369],{"__ignoreMap":142},[146,23370,23371,23373,23375],{"class":148,"line":149},[146,23372,191],{"class":152},[146,23374,194],{"class":160},[146,23376,329],{"class":160},[11,23378,23379],{},"이것으로 끝입니다. 별도의 SDK 설치도, 복잡한 인증 플로우도 필요 없습니다. API는 Bearer 토큰 인증과 함께 표준 REST를 사용합니다.",[92,23381,23383],{"id":23382},"_3단계-python-환경-설정","3단계: Python 환경 설정",[137,23385,23387],{"className":338,"code":23386,"language":340,"meta":142,"style":142},"import requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n",[28,23388,23389,23395,23401,23407,23411,23419,23427,23435,23451,23459],{"__ignoreMap":142},[146,23390,23391,23393],{"class":148,"line":149},[146,23392,347],{"class":259},[146,23394,329],{"class":263},[146,23396,23397,23399],{"class":148,"line":167},[146,23398,347],{"class":259},[146,23400,356],{"class":263},[146,23402,23403,23405],{"class":148,"line":179},[146,23404,347],{"class":259},[146,23406,370],{"class":263},[146,23408,23409],{"class":148,"line":188},[146,23410,376],{"emptyLinePlaceholder":58},[146,23412,23413,23415,23417],{"class":148,"line":373},[146,23414,388],{"class":156},[146,23416,391],{"class":259},[146,23418,17607],{"class":160},[146,23420,23421,23423,23425],{"class":148,"line":379},[146,23422,412],{"class":156},[146,23424,391],{"class":259},[146,23426,417],{"class":160},[146,23428,23429,23431,23433],{"class":148,"line":385},[146,23430,423],{"class":156},[146,23432,391],{"class":259},[146,23434,428],{"class":263},[146,23436,23437,23439,23441,23443,23445,23447,23449],{"class":148,"line":409},[146,23438,434],{"class":160},[146,23440,437],{"class":263},[146,23442,440],{"class":259},[146,23444,443],{"class":160},[146,23446,446],{"class":156},[146,23448,449],{"class":160},[146,23450,452],{"class":263},[146,23452,23453,23455,23457],{"class":148,"line":420},[146,23454,458],{"class":160},[146,23456,437],{"class":263},[146,23458,463],{"class":160},[146,23460,23461],{"class":148,"line":431},[146,23462,469],{"class":263},[11,23464,23465,23466,23469],{},"이 가이드의 모든 코드 예제는 이 세 가지 변수를 기반으로 합니다. ",[28,23467,23468],{},"YOUR_API_KEY","를 실제 키로 교체하면 생성을 시작할 준비가 됩니다.",[18,23471,23472],{},[11,23473,23474],{},[23,23475,23476],{},[37,23477,18156],{"href":212,"rel":23478},[41],[92,23480,23482],{"id":23481},"폴링-헬퍼","폴링 헬퍼",[11,23484,23485],{},"비디오 생성에는 60~180초가 소요되므로 완료를 확인하는 폴링 함수가 필요합니다. 이 헬퍼는 세 가지 이미지-투-비디오 모드 모두에서 작동합니다:",[137,23487,23489],{"className":338,"code":23488,"language":340,"meta":142,"style":142},"def wait_for_video(task_id, interval=5, max_wait=300):\n    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n\n        if status == \"completed\":\n            video_url = data[\"output\"][\"video_url\"]\n            print(f\"Video ready: {video_url}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Generation failed: {data.get('error', 'Unknown error')}\")\n            return data\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timed out waiting for video\")\n    return None\n",[28,23490,23491,23512,23517,23540,23548,23552,23563,23579,23588,23601,23605,23617,23633,23653,23660,23672,23701,23707,23711,23739,23743,23751,23755,23766],{"__ignoreMap":142},[146,23492,23493,23495,23497,23499,23501,23503,23506,23508,23510],{"class":148,"line":149},[146,23494,526],{"class":259},[146,23496,529],{"class":152},[146,23498,11696],{"class":263},[146,23500,267],{"class":259},[146,23502,1352],{"class":156},[146,23504,23505],{"class":263},", max_wait",[146,23507,267],{"class":259},[146,23509,11707],{"class":156},[146,23511,548],{"class":263},[146,23513,23514],{"class":148,"line":167},[146,23515,23516],{"class":160},"    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n",[146,23518,23519,23522,23524,23526,23528,23530,23532,23534,23536,23538],{"class":148,"line":179},[146,23520,23521],{"class":263},"    url ",[146,23523,267],{"class":259},[146,23525,3361],{"class":259},[146,23527,449],{"class":160},[146,23529,679],{"class":156},[146,23531,682],{"class":160},[146,23533,685],{"class":156},[146,23535,688],{"class":263},[146,23537,691],{"class":156},[146,23539,950],{"class":160},[146,23541,23542,23544,23546],{"class":148,"line":188},[146,23543,631],{"class":263},[146,23545,267],{"class":259},[146,23547,636],{"class":156},[146,23549,23550],{"class":148,"line":373},[146,23551,376],{"emptyLinePlaceholder":58},[146,23553,23554,23556,23558,23560],{"class":148,"line":379},[146,23555,642],{"class":259},[146,23557,645],{"class":263},[146,23559,648],{"class":259},[146,23561,23562],{"class":263}," max_wait:\n",[146,23564,23565,23567,23569,23571,23573,23575,23577],{"class":148,"line":385},[146,23566,6932],{"class":263},[146,23568,267],{"class":259},[146,23570,1131],{"class":263},[146,23572,17836],{"class":701},[146,23574,267],{"class":259},[146,23576,423],{"class":156},[146,23578,406],{"class":263},[146,23580,23581,23584,23586],{"class":148,"line":409},[146,23582,23583],{"class":263},"        data ",[146,23585,267],{"class":259},[146,23587,11777],{"class":263},[146,23589,23590,23592,23594,23597,23599],{"class":148,"line":420},[146,23591,753],{"class":263},[146,23593,267],{"class":259},[146,23595,23596],{"class":263}," data[",[146,23598,761],{"class":160},[146,23600,764],{"class":263},[146,23602,23603],{"class":148,"line":431},[146,23604,376],{"emptyLinePlaceholder":58},[146,23606,23607,23609,23611,23613,23615],{"class":148,"line":455},[146,23608,848],{"class":259},[146,23610,851],{"class":263},[146,23612,854],{"class":259},[146,23614,857],{"class":160},[146,23616,860],{"class":263},[146,23618,23619,23621,23623,23625,23627,23629,23631],{"class":148,"line":466},[146,23620,7407],{"class":263},[146,23622,267],{"class":259},[146,23624,23596],{"class":263},[146,23626,21546],{"class":160},[146,23628,1562],{"class":263},[146,23630,14959],{"class":160},[146,23632,764],{"class":263},[146,23634,23635,23637,23639,23641,23643,23645,23647,23649,23651],{"class":148,"line":600},[146,23636,5580],{"class":156},[146,23638,794],{"class":263},[146,23640,440],{"class":259},[146,23642,11817],{"class":160},[146,23644,685],{"class":156},[146,23646,1678],{"class":263},[146,23648,691],{"class":156},[146,23650,449],{"class":160},[146,23652,406],{"class":263},[146,23654,23655,23657],{"class":148,"line":605},[146,23656,866],{"class":259},[146,23658,23659],{"class":263}," data\n",[146,23661,23662,23664,23666,23668,23670],{"class":148,"line":611},[146,23663,875],{"class":259},[146,23665,851],{"class":263},[146,23667,854],{"class":259},[146,23669,882],{"class":160},[146,23671,860],{"class":263},[146,23673,23674,23676,23678,23680,23682,23684,23687,23689,23691,23693,23695,23697,23699],{"class":148,"line":617},[146,23675,5580],{"class":156},[146,23677,794],{"class":263},[146,23679,440],{"class":259},[146,23681,11866],{"class":160},[146,23683,685],{"class":156},[146,23685,23686],{"class":263},"data.get(",[146,23688,11874],{"class":160},[146,23690,400],{"class":263},[146,23692,943],{"class":160},[146,23694,118],{"class":263},[146,23696,691],{"class":156},[146,23698,449],{"class":160},[146,23700,406],{"class":263},[146,23702,23703,23705],{"class":148,"line":623},[146,23704,866],{"class":259},[146,23706,23659],{"class":263},[146,23708,23709],{"class":148,"line":628},[146,23710,376],{"emptyLinePlaceholder":58},[146,23712,23713,23715,23717,23719,23721,23723,23725,23727,23729,23731,23733,23735,23737],{"class":148,"line":639},[146,23714,791],{"class":156},[146,23716,794],{"class":263},[146,23718,440],{"class":259},[146,23720,11903],{"class":160},[146,23722,685],{"class":156},[146,23724,814],{"class":263},[146,23726,691],{"class":156},[146,23728,104],{"class":160},[146,23730,685],{"class":156},[146,23732,804],{"class":263},[146,23734,691],{"class":156},[146,23736,11920],{"class":160},[146,23738,406],{"class":263},[146,23740,23741],{"class":148,"line":654},[146,23742,11927],{"class":263},[146,23744,23745,23747,23749],{"class":148,"line":660},[146,23746,979],{"class":263},[146,23748,982],{"class":259},[146,23750,11936],{"class":263},[146,23752,23753],{"class":148,"line":671},[146,23754,376],{"emptyLinePlaceholder":58},[146,23756,23757,23759,23761,23764],{"class":148,"line":698},[146,23758,1102],{"class":156},[146,23760,794],{"class":263},[146,23762,23763],{"class":160},"\"Timed out waiting for video\"",[146,23765,406],{"class":263},[146,23767,23768,23770],{"class":148,"line":710},[146,23769,1703],{"class":259},[146,23771,11958],{"class":156},[11,23773,23774,23775,2251,23777,2251,23779,281,23781,23783],{},"작업 상태는 단순한 생명주기를 따릅니다: ",[28,23776,2074],{},[28,23778,2078],{},[28,23780,2082],{},[28,23782,2085],{},". 응답의 비디오 URL은 24시간 후 만료됩니다 — 그 전에 다운로드하거나 제공하세요.",[11,23785,23786,23787,1260],{},"API 기본 사항(텍스트-투-비디오, 파라미터, 오류 처리)에 대한 전체 가이드는 ",[37,23788,23789],{"href":17555},"시작하기 가이드",[45,23791],{},[48,23793,23795],{"id":23794},"모드-1-단일-이미지-애니메이션","모드 1: 단일 이미지 애니메이션",[11,23797,23798],{},"단일 이미지 애니메이션은 가장 일반적인 이미지-투-비디오 워크플로우입니다. 하나의 이미지와 원하는 동작을 설명하는 프롬프트를 제공하면, 모델이 이미지의 시각적 콘텐츠를 유지하면서 사실적인 움직임, 카메라 모션, 환경 효과를 추가합니다.",[92,23800,6444],{"id":6443},[11,23802,23803,23805,23806,23809],{},[28,23804,2898],{},"에 URL 하나만 전달하면 Seedance 2.0은 이를 ",[23,23807,23808],{},"기본 시각적 참조","로 처리합니다. 모델은 첫 번째 프레임을 이미지에 고정하고 프롬프트를 기반으로 순방향 모션을 생성합니다. 출력에서 보존되는 것:",[97,23811,23812,23818,23824,23830],{},[73,23813,23814,23815],{},"원본 이미지의 ",[23,23816,23817],{},"색상 팔레트",[73,23819,23820,23823],{},[23,23821,23822],{},"구도"," 및 프레이밍",[73,23825,23826,23829],{},[23,23827,23828],{},"피사체 정체성"," (의상, 형태, 특징)",[73,23831,23832,23835],{},[23,23833,23834],{},"아트 스타일"," (일러스트, 3D 렌더, 사진)",[11,23837,23838,23839,23842],{},"프롬프트는 ",[2621,23840,23841],{},"변화하는"," 것을 제어합니다: 움직임, 카메라 앵글, 조명 변화, 환경 역학.",[92,23844,23846],{"id":23845},"전체-코드-단일-이미지에서-비디오로","전체 코드: 단일 이미지에서 비디오로",[137,23848,23850],{"className":338,"code":23849,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Single Image Animation ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n        \"through a nearby window. Gentle steam rises from the cup. \"\n        \"Painterly brushstroke texture preserved throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/painting-woman.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\n# Poll until complete\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,23851,23852,23858,23864,23868,23876,23884,23892,23908,23916,23920,23924,23944,23966,23974,23984,24000,24008,24020,24032,24061,24067,24079,24108,24114,24142,24146,24154,24160,24164,24169,24177,24187,24193,24198,24203,24208,24213,24217,24223,24228,24232,24242,24252,24262,24270,24274,24278,24287,24299,24309,24317,24321,24329,24354,24358,24363],{"__ignoreMap":142},[146,23853,23854,23856],{"class":148,"line":149},[146,23855,347],{"class":259},[146,23857,329],{"class":263},[146,23859,23860,23862],{"class":148,"line":167},[146,23861,347],{"class":259},[146,23863,356],{"class":263},[146,23865,23866],{"class":148,"line":179},[146,23867,376],{"emptyLinePlaceholder":58},[146,23869,23870,23872,23874],{"class":148,"line":188},[146,23871,388],{"class":156},[146,23873,391],{"class":259},[146,23875,17607],{"class":160},[146,23877,23878,23880,23882],{"class":148,"line":373},[146,23879,412],{"class":156},[146,23881,391],{"class":259},[146,23883,417],{"class":160},[146,23885,23886,23888,23890],{"class":148,"line":379},[146,23887,423],{"class":156},[146,23889,391],{"class":259},[146,23891,428],{"class":263},[146,23893,23894,23896,23898,23900,23902,23904,23906],{"class":148,"line":385},[146,23895,434],{"class":160},[146,23897,437],{"class":263},[146,23899,440],{"class":259},[146,23901,443],{"class":160},[146,23903,446],{"class":156},[146,23905,449],{"class":160},[146,23907,452],{"class":263},[146,23909,23910,23912,23914],{"class":148,"line":409},[146,23911,458],{"class":160},[146,23913,437],{"class":263},[146,23915,463],{"class":160},[146,23917,23918],{"class":148,"line":420},[146,23919,469],{"class":263},[146,23921,23922],{"class":148,"line":431},[146,23923,376],{"emptyLinePlaceholder":58},[146,23925,23926,23928,23930,23932,23934,23936,23938,23940,23942],{"class":148,"line":455},[146,23927,526],{"class":259},[146,23929,529],{"class":152},[146,23931,11696],{"class":263},[146,23933,267],{"class":259},[146,23935,1352],{"class":156},[146,23937,23505],{"class":263},[146,23939,267],{"class":259},[146,23941,11707],{"class":156},[146,23943,548],{"class":263},[146,23945,23946,23948,23950,23952,23954,23956,23958,23960,23962,23964],{"class":148,"line":466},[146,23947,23521],{"class":263},[146,23949,267],{"class":259},[146,23951,3361],{"class":259},[146,23953,449],{"class":160},[146,23955,679],{"class":156},[146,23957,682],{"class":160},[146,23959,685],{"class":156},[146,23961,688],{"class":263},[146,23963,691],{"class":156},[146,23965,950],{"class":160},[146,23967,23968,23970,23972],{"class":148,"line":600},[146,23969,631],{"class":263},[146,23971,267],{"class":259},[146,23973,636],{"class":156},[146,23975,23976,23978,23980,23982],{"class":148,"line":605},[146,23977,642],{"class":259},[146,23979,645],{"class":263},[146,23981,648],{"class":259},[146,23983,23562],{"class":263},[146,23985,23986,23988,23990,23992,23994,23996,23998],{"class":148,"line":611},[146,23987,6932],{"class":263},[146,23989,267],{"class":259},[146,23991,1131],{"class":263},[146,23993,17836],{"class":701},[146,23995,267],{"class":259},[146,23997,423],{"class":156},[146,23999,406],{"class":263},[146,24001,24002,24004,24006],{"class":148,"line":617},[146,24003,23583],{"class":263},[146,24005,267],{"class":259},[146,24007,11777],{"class":263},[146,24009,24010,24012,24014,24016,24018],{"class":148,"line":623},[146,24011,753],{"class":263},[146,24013,267],{"class":259},[146,24015,23596],{"class":263},[146,24017,761],{"class":160},[146,24019,764],{"class":263},[146,24021,24022,24024,24026,24028,24030],{"class":148,"line":628},[146,24023,848],{"class":259},[146,24025,851],{"class":263},[146,24027,854],{"class":259},[146,24029,857],{"class":160},[146,24031,860],{"class":263},[146,24033,24034,24036,24038,24040,24042,24044,24047,24049,24051,24053,24055,24057,24059],{"class":148,"line":639},[146,24035,5580],{"class":156},[146,24037,794],{"class":263},[146,24039,440],{"class":259},[146,24041,11817],{"class":160},[146,24043,685],{"class":156},[146,24045,24046],{"class":263},"data[",[146,24048,17898],{"class":160},[146,24050,1562],{"class":263},[146,24052,17903],{"class":160},[146,24054,1535],{"class":263},[146,24056,691],{"class":156},[146,24058,449],{"class":160},[146,24060,406],{"class":263},[146,24062,24063,24065],{"class":148,"line":654},[146,24064,866],{"class":259},[146,24066,23659],{"class":263},[146,24068,24069,24071,24073,24075,24077],{"class":148,"line":660},[146,24070,875],{"class":259},[146,24072,851],{"class":263},[146,24074,854],{"class":259},[146,24076,882],{"class":160},[146,24078,860],{"class":263},[146,24080,24081,24083,24085,24087,24090,24092,24094,24096,24098,24100,24102,24104,24106],{"class":148,"line":671},[146,24082,5580],{"class":156},[146,24084,794],{"class":263},[146,24086,440],{"class":259},[146,24088,24089],{"class":160},"\"Failed: ",[146,24091,685],{"class":156},[146,24093,23686],{"class":263},[146,24095,11874],{"class":160},[146,24097,400],{"class":263},[146,24099,943],{"class":160},[146,24101,118],{"class":263},[146,24103,691],{"class":156},[146,24105,449],{"class":160},[146,24107,406],{"class":263},[146,24109,24110,24112],{"class":148,"line":698},[146,24111,866],{"class":259},[146,24113,23659],{"class":263},[146,24115,24116,24118,24120,24122,24124,24126,24128,24130,24132,24134,24136,24138,24140],{"class":148,"line":710},[146,24117,791],{"class":156},[146,24119,794],{"class":263},[146,24121,440],{"class":259},[146,24123,11903],{"class":160},[146,24125,685],{"class":156},[146,24127,814],{"class":263},[146,24129,691],{"class":156},[146,24131,104],{"class":160},[146,24133,685],{"class":156},[146,24135,804],{"class":263},[146,24137,691],{"class":156},[146,24139,10730],{"class":160},[146,24141,406],{"class":263},[146,24143,24144],{"class":148,"line":716},[146,24145,11927],{"class":263},[146,24147,24148,24150,24152],{"class":148,"line":722},[146,24149,979],{"class":263},[146,24151,982],{"class":259},[146,24153,11936],{"class":263},[146,24155,24156,24158],{"class":148,"line":728},[146,24157,1703],{"class":259},[146,24159,11958],{"class":156},[146,24161,24162],{"class":148,"line":739},[146,24163,376],{"emptyLinePlaceholder":58},[146,24165,24166],{"class":148,"line":744},[146,24167,24168],{"class":175},"# --- Single Image Animation ---\n",[146,24170,24171,24173,24175],{"class":148,"line":750},[146,24172,3665],{"class":263},[146,24174,267],{"class":259},[146,24176,428],{"class":263},[146,24178,24179,24181,24183,24185],{"class":148,"line":767},[146,24180,3674],{"class":160},[146,24182,437],{"class":263},[146,24184,1308],{"class":160},[146,24186,452],{"class":263},[146,24188,24189,24191],{"class":148,"line":788},[146,24190,3685],{"class":160},[146,24192,1322],{"class":263},[146,24194,24195],{"class":148,"line":834},[146,24196,24197],{"class":160},"        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n",[146,24199,24200],{"class":148,"line":839},[146,24201,24202],{"class":160},"        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n",[146,24204,24205],{"class":148,"line":845},[146,24206,24207],{"class":160},"        \"through a nearby window. Gentle steam rises from the cup. \"\n",[146,24209,24210],{"class":148,"line":863},[146,24211,24212],{"class":160},"        \"Painterly brushstroke texture preserved throughout.\"\n",[146,24214,24215],{"class":148,"line":872},[146,24216,3808],{"class":263},[146,24218,24219,24221],{"class":148,"line":887},[146,24220,15392],{"class":160},[146,24222,2693],{"class":263},[146,24224,24225],{"class":148,"line":903},[146,24226,24227],{"class":160},"        \"https://example.com/painting-woman.jpg\"\n",[146,24229,24230],{"class":148,"line":915},[146,24231,16375],{"class":263},[146,24233,24234,24236,24238,24240],{"class":148,"line":953},[146,24235,3697],{"class":160},[146,24237,437],{"class":263},[146,24239,3702],{"class":156},[146,24241,452],{"class":263},[146,24243,24244,24246,24248,24250],{"class":148,"line":959},[146,24245,3709],{"class":160},[146,24247,437],{"class":263},[146,24249,3714],{"class":160},[146,24251,452],{"class":263},[146,24253,24254,24256,24258,24260],{"class":148,"line":964},[146,24255,3721],{"class":160},[146,24257,437],{"class":263},[146,24259,1384],{"class":160},[146,24261,452],{"class":263},[146,24263,24264,24266,24268],{"class":148,"line":970},[146,24265,3737],{"class":160},[146,24267,437],{"class":263},[146,24269,3742],{"class":156},[146,24271,24272],{"class":148,"line":976},[146,24273,469],{"class":263},[146,24275,24276],{"class":148,"line":988},[146,24277,376],{"emptyLinePlaceholder":58},[146,24279,24280,24283,24285],{"class":148,"line":993},[146,24281,24282],{"class":263},"resp ",[146,24284,267],{"class":259},[146,24286,1432],{"class":263},[146,24288,24289,24291,24293,24295,24297],{"class":148,"line":5534},[146,24290,6541],{"class":259},[146,24292,449],{"class":160},[146,24294,679],{"class":156},[146,24296,1444],{"class":160},[146,24298,452],{"class":263},[146,24300,24301,24303,24305,24307],{"class":148,"line":5543},[146,24302,6554],{"class":701},[146,24304,267],{"class":259},[146,24306,423],{"class":156},[146,24308,452],{"class":263},[146,24310,24311,24313,24315],{"class":148,"line":5549},[146,24312,6565],{"class":701},[146,24314,267],{"class":259},[146,24316,2790],{"class":263},[146,24318,24319],{"class":148,"line":5577},[146,24320,406],{"class":263},[146,24322,24323,24325,24327],{"class":148,"line":5608},[146,24324,12238],{"class":263},[146,24326,267],{"class":259},[146,24328,11777],{"class":263},[146,24330,24331,24333,24335,24337,24340,24342,24344,24346,24348,24350,24352],{"class":148,"line":5628},[146,24332,6587],{"class":156},[146,24334,794],{"class":263},[146,24336,440],{"class":259},[146,24338,24339],{"class":160},"\"Task ID: ",[146,24341,685],{"class":156},[146,24343,11822],{"class":263},[146,24345,19895],{"class":160},[146,24347,1535],{"class":263},[146,24349,691],{"class":156},[146,24351,449],{"class":160},[146,24353,406],{"class":263},[146,24355,24356],{"class":148,"line":5634},[146,24357,376],{"emptyLinePlaceholder":58},[146,24359,24360],{"class":148,"line":5640},[146,24361,24362],{"class":175},"# Poll until complete\n",[146,24364,24365,24368,24370,24373,24375],{"class":148,"line":5645},[146,24366,24367],{"class":263},"video_data ",[146,24369,267],{"class":259},[146,24371,24372],{"class":263}," wait_for_video(result[",[146,24374,7696],{"class":160},[146,24376,1629],{"class":263},[18,24378,24379],{},[11,24380,24381,2424,24384,24386],{},[23,24382,24383],{},"자신의 API 키로 실행해 보세요.",[28,24385,2898],{}," 값을 공개적으로 접근 가능한 이미지 URL로 교체하면 됩니다.",[92,24388,24390],{"id":24389},"데모-그림이-살아나다","데모: 그림이 살아나다",[56,24392,60,24393],{"controls":58,"playsInline":58,"style":59},[62,24394],{"src":18795,"type":65},[11,24396,24397,2424,24400],{},[23,24398,24399],{},"사용된 프롬프트:",[2621,24401,24402],{},"\"The woman in the painting slowly reaches forward, picks up a coffee cup from the table, and takes a quiet sip. Soft indoor lighting. Painterly brushstroke style maintained. Subtle steam rises from the cup.\"",[11,24404,24405,24406,24408],{},"이 데모는 단일 페인팅 초상화를 ",[28,24407,2911],{},"(캐릭터 참조)로 사용합니다. 모델은 유화 미학을 유지하면서 자연스러운 팔 움직임과 증기 물리 효과를 생성합니다.",[92,24410,24412],{"id":24411},"데모-스타일-전이-애니메이션","데모: 스타일 전이 애니메이션",[56,24414,60,24415],{"controls":58,"playsInline":58,"style":59},[62,24416],{"src":24417,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%A2%B5%E9%AB%98%E7%94%BB%E5%A5%B3%E5%AD%A9%E4%B8%8E%E6%9D%91%E5%BA%84.mp4",[11,24419,24420,2424,24422],{},[23,24421,24399],{},[2621,24423,24424],{},"\"A young girl walks along a winding path through a Van Gogh-style village. Swirling sky with thick brushstrokes. Vibrant yellows and blues. The girl's dress and hair flow in the wind. Camera slowly follows her from behind.\"",[11,24426,24427],{},"입력 이미지의 반 고흐 붓터치 스타일이 모든 프레임에 어떻게 유지되는지 주목하세요 — 소용돌이치는 하늘, 건물의 임파스토 텍스처, 색상 관계. 단일 이미지 애니메이션은 스타일 일관성이 있는 모션에서 탁월합니다.",[92,24429,24431],{"id":24430},"단일-이미지-모드에서의-프롬프트-모범-사례","단일 이미지 모드에서의 프롬프트 모범 사례",[11,24433,24434],{},"프롬프트가 애니메이션의 품질을 결정합니다. 정적인 설명은 정적인 영상을 만들고, 동작이 풍부한 프롬프트는 역동적인 출력을 만듭니다.",[11,24436,24437],{},[23,24438,24439],{},"약한 프롬프트:",[137,24441,24444],{"className":24442,"code":24443,"language":2183},[2181],"A cat sitting on a windowsill\n",[28,24445,24443],{"__ignoreMap":142},[11,24447,24448],{},[23,24449,24450],{},"강한 프롬프트:",[137,24452,24455],{"className":24453,"code":24454,"language":2183},[2181],"The cat stretches lazily on the windowsill, yawns wide showing tiny teeth,\nthen curls back into a ball. Afternoon sunlight shifts slowly across the fur.\nDust motes float in the light beam. Camera holds steady, slight depth of field.\n",[28,24456,24454],{"__ignoreMap":142},[11,24458,24459,24460,24463,24464,24467,24468,24471],{},"차이점: 강한 프롬프트는 ",[23,24461,24462],{},"연속적인 동작","(기지개 → 하품 → 웅크림), ",[23,24465,24466],{},"환경적 움직임","(햇빛 이동, 먼지 입자), ",[23,24469,24470],{},"카메라 동작","(고정, 얕은 심도)을 지정합니다.",[11,24473,24474],{},"단일 이미지 프롬프트의 핵심 원칙:",[2035,24476,24477,24486],{},[2038,24478,24479],{},[2041,24480,24481,24484],{},[2044,24482,24483],{},"원칙",[2044,24485,11479],{},[2051,24487,24488,24496,24504,24512,24520],{},[2041,24489,24490,24493],{},[2056,24491,24492],{},"외형이 아닌 동작을 설명",[2056,24494,24495],{},"\"서 있는 사람\"이 아닌 \"앞으로 걸어감\"",[2041,24497,24498,24501],{},[2056,24499,24500],{},"2~3개의 동작을 나열",[2056,24502,24503],{},"\"집어 들기 → 살펴보기 → 내려놓기\"",[2041,24505,24506,24509],{},[2056,24507,24508],{},"환경적 역학 추가",[2056,24510,24511],{},"\"바람에 나뭇잎이 흔들림\", \"유리에 빗방울이 맺힘\"",[2041,24513,24514,24517],{},[2056,24515,24516],{},"카메라 움직임 지정",[2056,24518,24519],{},"\"천천히 왼쪽으로 패닝\", \"카메라가 뒤로 물러나며 드러냄\"",[2041,24521,24522,24525],{},[2056,24523,24524],{},"이미지의 아트 스타일과 일치",[2056,24526,24527],{},"\"회화적 붓터치 유지\", \"3D 렌더 품질\"",[11,24529,24530,24531,24533,24534,1260],{},"전체 프롬프트 엔지니어링 참고 자료는 ",[37,24532,2209],{"href":1766},"를 참조하세요. 카메라 관련 기법은 ",[37,24535,24536],{"href":3860},"카메라 무브먼트 가이드",[45,24538],{},[48,24540,24542],{"id":24541},"모드-2-첫-마지막-프레임-제어","모드 2: 첫-마지막 프레임 제어",[11,24544,24545,24546,24549],{},"단일 이미지 모드는 영상의 시작을 고정합니다. 첫-마지막 프레임 모드는 ",[23,24547,24548],{},"양쪽 끝","을 고정합니다. 두 장의 이미지 — 시작 프레임과 종료 프레임 — 를 제공하면 Seedance 2.0이 두 이미지 사이의 부드러운 전환을 생성합니다.",[92,24551,6444],{"id":24552},"작동-방식-1",[11,24554,24555,24557],{},[28,24556,2898],{},"에 정확히 두 개의 URL이 포함되면 모델은 다음과 같이 해석합니다:",[97,24559,24560,24566],{},[73,24561,24562,24565],{},[23,24563,24564],{},"첫 번째 URL"," → 시작 프레임",[73,24567,24568,24571],{},[23,24569,24570],{},"두 번째 URL"," → 종료 프레임",[11,24573,24574,24575,24578],{},"그런 다음 모델이 자연스럽고 물리적으로 그럴듯한 전환을 만드는 중간 프레임을 생성합니다. 프롬프트는 전환의 ",[2621,24576,24577],{},"스타일","을 안내합니다 — 부드러운 모핑, 서사적 여정, 또는 극적인 변환 등.",[92,24580,24582],{"id":24581},"활용-사례","활용 사례",[11,24584,24585],{},"첫-마지막 프레임 제어는 단일 이미지 모드로는 해결할 수 없는 문제를 해결합니다:",[97,24587,24588,24594,24600,24606,24612],{},[73,24589,24590,24593],{},[23,24591,24592],{},"비포/애프터 공개",": 리노베이션, 메이크오버, 계절 변화",[73,24595,24596,24599],{},[23,24597,24598],{},"타임랩스 시뮬레이션",": 새벽에서 황혼까지, 빈 방에서 가구가 갖춰진 방까지",[73,24601,24602,24605],{},[23,24603,24604],{},"장면 전환",": 한 장소에서 다른 장소로의 변환",[73,24607,24608,24611],{},[23,24609,24610],{},"제품 변환",": 닫힌 패키지에서 열린 제품 전시까지",[73,24613,24614,24617],{},[23,24615,24616],{},"모핑 효과",": 한 캐릭터나 스타일에서 다른 것으로의 변환",[92,24619,24621],{"id":24620},"전체-코드-첫-마지막-프레임-보간","전체 코드: 첫-마지막 프레임 보간",[137,24623,24625],{"className":338,"code":24624,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- First-Last Frame Control ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Smooth cinematic transition. The real-world landscape gradually \"\n        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/real-landscape.jpg\",\n        \"https://example.com/ink-wash-painting.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,24626,24627,24633,24639,24643,24651,24659,24667,24683,24691,24695,24699,24719,24741,24749,24759,24775,24783,24795,24807,24835,24841,24853,24881,24887,24915,24919,24927,24933,24937,24942,24950,24960,24966,24971,24976,24981,24986,24990,24996,25003,25008,25012,25022,25032,25040,25044,25048,25056,25068,25078,25086,25090,25098,25122,25126],{"__ignoreMap":142},[146,24628,24629,24631],{"class":148,"line":149},[146,24630,347],{"class":259},[146,24632,329],{"class":263},[146,24634,24635,24637],{"class":148,"line":167},[146,24636,347],{"class":259},[146,24638,356],{"class":263},[146,24640,24641],{"class":148,"line":179},[146,24642,376],{"emptyLinePlaceholder":58},[146,24644,24645,24647,24649],{"class":148,"line":188},[146,24646,388],{"class":156},[146,24648,391],{"class":259},[146,24650,17607],{"class":160},[146,24652,24653,24655,24657],{"class":148,"line":373},[146,24654,412],{"class":156},[146,24656,391],{"class":259},[146,24658,417],{"class":160},[146,24660,24661,24663,24665],{"class":148,"line":379},[146,24662,423],{"class":156},[146,24664,391],{"class":259},[146,24666,428],{"class":263},[146,24668,24669,24671,24673,24675,24677,24679,24681],{"class":148,"line":385},[146,24670,434],{"class":160},[146,24672,437],{"class":263},[146,24674,440],{"class":259},[146,24676,443],{"class":160},[146,24678,446],{"class":156},[146,24680,449],{"class":160},[146,24682,452],{"class":263},[146,24684,24685,24687,24689],{"class":148,"line":409},[146,24686,458],{"class":160},[146,24688,437],{"class":263},[146,24690,463],{"class":160},[146,24692,24693],{"class":148,"line":420},[146,24694,469],{"class":263},[146,24696,24697],{"class":148,"line":431},[146,24698,376],{"emptyLinePlaceholder":58},[146,24700,24701,24703,24705,24707,24709,24711,24713,24715,24717],{"class":148,"line":455},[146,24702,526],{"class":259},[146,24704,529],{"class":152},[146,24706,11696],{"class":263},[146,24708,267],{"class":259},[146,24710,1352],{"class":156},[146,24712,23505],{"class":263},[146,24714,267],{"class":259},[146,24716,11707],{"class":156},[146,24718,548],{"class":263},[146,24720,24721,24723,24725,24727,24729,24731,24733,24735,24737,24739],{"class":148,"line":466},[146,24722,23521],{"class":263},[146,24724,267],{"class":259},[146,24726,3361],{"class":259},[146,24728,449],{"class":160},[146,24730,679],{"class":156},[146,24732,682],{"class":160},[146,24734,685],{"class":156},[146,24736,688],{"class":263},[146,24738,691],{"class":156},[146,24740,950],{"class":160},[146,24742,24743,24745,24747],{"class":148,"line":600},[146,24744,631],{"class":263},[146,24746,267],{"class":259},[146,24748,636],{"class":156},[146,24750,24751,24753,24755,24757],{"class":148,"line":605},[146,24752,642],{"class":259},[146,24754,645],{"class":263},[146,24756,648],{"class":259},[146,24758,23562],{"class":263},[146,24760,24761,24763,24765,24767,24769,24771,24773],{"class":148,"line":611},[146,24762,6932],{"class":263},[146,24764,267],{"class":259},[146,24766,1131],{"class":263},[146,24768,17836],{"class":701},[146,24770,267],{"class":259},[146,24772,423],{"class":156},[146,24774,406],{"class":263},[146,24776,24777,24779,24781],{"class":148,"line":617},[146,24778,23583],{"class":263},[146,24780,267],{"class":259},[146,24782,11777],{"class":263},[146,24784,24785,24787,24789,24791,24793],{"class":148,"line":623},[146,24786,753],{"class":263},[146,24788,267],{"class":259},[146,24790,23596],{"class":263},[146,24792,761],{"class":160},[146,24794,764],{"class":263},[146,24796,24797,24799,24801,24803,24805],{"class":148,"line":628},[146,24798,848],{"class":259},[146,24800,851],{"class":263},[146,24802,854],{"class":259},[146,24804,857],{"class":160},[146,24806,860],{"class":263},[146,24808,24809,24811,24813,24815,24817,24819,24821,24823,24825,24827,24829,24831,24833],{"class":148,"line":639},[146,24810,5580],{"class":156},[146,24812,794],{"class":263},[146,24814,440],{"class":259},[146,24816,11817],{"class":160},[146,24818,685],{"class":156},[146,24820,24046],{"class":263},[146,24822,17898],{"class":160},[146,24824,1562],{"class":263},[146,24826,17903],{"class":160},[146,24828,1535],{"class":263},[146,24830,691],{"class":156},[146,24832,449],{"class":160},[146,24834,406],{"class":263},[146,24836,24837,24839],{"class":148,"line":654},[146,24838,866],{"class":259},[146,24840,23659],{"class":263},[146,24842,24843,24845,24847,24849,24851],{"class":148,"line":660},[146,24844,875],{"class":259},[146,24846,851],{"class":263},[146,24848,854],{"class":259},[146,24850,882],{"class":160},[146,24852,860],{"class":263},[146,24854,24855,24857,24859,24861,24863,24865,24867,24869,24871,24873,24875,24877,24879],{"class":148,"line":671},[146,24856,5580],{"class":156},[146,24858,794],{"class":263},[146,24860,440],{"class":259},[146,24862,24089],{"class":160},[146,24864,685],{"class":156},[146,24866,23686],{"class":263},[146,24868,11874],{"class":160},[146,24870,400],{"class":263},[146,24872,943],{"class":160},[146,24874,118],{"class":263},[146,24876,691],{"class":156},[146,24878,449],{"class":160},[146,24880,406],{"class":263},[146,24882,24883,24885],{"class":148,"line":698},[146,24884,866],{"class":259},[146,24886,23659],{"class":263},[146,24888,24889,24891,24893,24895,24897,24899,24901,24903,24905,24907,24909,24911,24913],{"class":148,"line":710},[146,24890,791],{"class":156},[146,24892,794],{"class":263},[146,24894,440],{"class":259},[146,24896,11903],{"class":160},[146,24898,685],{"class":156},[146,24900,814],{"class":263},[146,24902,691],{"class":156},[146,24904,104],{"class":160},[146,24906,685],{"class":156},[146,24908,804],{"class":263},[146,24910,691],{"class":156},[146,24912,10730],{"class":160},[146,24914,406],{"class":263},[146,24916,24917],{"class":148,"line":716},[146,24918,11927],{"class":263},[146,24920,24921,24923,24925],{"class":148,"line":722},[146,24922,979],{"class":263},[146,24924,982],{"class":259},[146,24926,11936],{"class":263},[146,24928,24929,24931],{"class":148,"line":728},[146,24930,1703],{"class":259},[146,24932,11958],{"class":156},[146,24934,24935],{"class":148,"line":739},[146,24936,376],{"emptyLinePlaceholder":58},[146,24938,24939],{"class":148,"line":744},[146,24940,24941],{"class":175},"# --- First-Last Frame Control ---\n",[146,24943,24944,24946,24948],{"class":148,"line":750},[146,24945,3665],{"class":263},[146,24947,267],{"class":259},[146,24949,428],{"class":263},[146,24951,24952,24954,24956,24958],{"class":148,"line":767},[146,24953,3674],{"class":160},[146,24955,437],{"class":263},[146,24957,1308],{"class":160},[146,24959,452],{"class":263},[146,24961,24962,24964],{"class":148,"line":788},[146,24963,3685],{"class":160},[146,24965,1322],{"class":263},[146,24967,24968],{"class":148,"line":834},[146,24969,24970],{"class":160},"        \"Smooth cinematic transition. The real-world landscape gradually \"\n",[146,24972,24973],{"class":148,"line":839},[146,24974,24975],{"class":160},"        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n",[146,24977,24978],{"class":148,"line":845},[146,24979,24980],{"class":160},"        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n",[146,24982,24983],{"class":148,"line":863},[146,24984,24985],{"class":160},"        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n",[146,24987,24988],{"class":148,"line":872},[146,24989,3808],{"class":263},[146,24991,24992,24994],{"class":148,"line":887},[146,24993,15392],{"class":160},[146,24995,2693],{"class":263},[146,24997,24998,25001],{"class":148,"line":903},[146,24999,25000],{"class":160},"        \"https://example.com/real-landscape.jpg\"",[146,25002,452],{"class":263},[146,25004,25005],{"class":148,"line":915},[146,25006,25007],{"class":160},"        \"https://example.com/ink-wash-painting.jpg\"\n",[146,25009,25010],{"class":148,"line":953},[146,25011,16375],{"class":263},[146,25013,25014,25016,25018,25020],{"class":148,"line":959},[146,25015,3697],{"class":160},[146,25017,437],{"class":263},[146,25019,537],{"class":156},[146,25021,452],{"class":263},[146,25023,25024,25026,25028,25030],{"class":148,"line":964},[146,25025,3709],{"class":160},[146,25027,437],{"class":263},[146,25029,3714],{"class":160},[146,25031,452],{"class":263},[146,25033,25034,25036,25038],{"class":148,"line":970},[146,25035,3721],{"class":160},[146,25037,437],{"class":263},[146,25039,2732],{"class":160},[146,25041,25042],{"class":148,"line":976},[146,25043,469],{"class":263},[146,25045,25046],{"class":148,"line":988},[146,25047,376],{"emptyLinePlaceholder":58},[146,25049,25050,25052,25054],{"class":148,"line":993},[146,25051,24282],{"class":263},[146,25053,267],{"class":259},[146,25055,1432],{"class":263},[146,25057,25058,25060,25062,25064,25066],{"class":148,"line":5534},[146,25059,6541],{"class":259},[146,25061,449],{"class":160},[146,25063,679],{"class":156},[146,25065,1444],{"class":160},[146,25067,452],{"class":263},[146,25069,25070,25072,25074,25076],{"class":148,"line":5543},[146,25071,6554],{"class":701},[146,25073,267],{"class":259},[146,25075,423],{"class":156},[146,25077,452],{"class":263},[146,25079,25080,25082,25084],{"class":148,"line":5549},[146,25081,6565],{"class":701},[146,25083,267],{"class":259},[146,25085,2790],{"class":263},[146,25087,25088],{"class":148,"line":5577},[146,25089,406],{"class":263},[146,25091,25092,25094,25096],{"class":148,"line":5608},[146,25093,12238],{"class":263},[146,25095,267],{"class":259},[146,25097,11777],{"class":263},[146,25099,25100,25102,25104,25106,25108,25110,25112,25114,25116,25118,25120],{"class":148,"line":5628},[146,25101,6587],{"class":156},[146,25103,794],{"class":263},[146,25105,440],{"class":259},[146,25107,24339],{"class":160},[146,25109,685],{"class":156},[146,25111,11822],{"class":263},[146,25113,19895],{"class":160},[146,25115,1535],{"class":263},[146,25117,691],{"class":156},[146,25119,449],{"class":160},[146,25121,406],{"class":263},[146,25123,25124],{"class":148,"line":5634},[146,25125,376],{"emptyLinePlaceholder":58},[146,25127,25128,25130,25132,25134,25136],{"class":148,"line":5640},[146,25129,24367],{"class":263},[146,25131,267],{"class":259},[146,25133,24372],{"class":263},[146,25135,7696],{"class":160},[146,25137,1629],{"class":263},[92,25139,25141],{"id":25140},"데모-현실에서-수묵화로","데모: 현실에서 수묵화로",[56,25143,60,25144],{"controls":58,"playsInline":58,"style":59},[62,25145],{"src":25146,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8E%B0%E5%AE%9E%E5%9C%BA%E6%99%AF%E5%B1%B1%E6%B0%B4%E7%94%BB.mp4",[11,25148,25149,2424,25151],{},[23,25150,24399],{},[2621,25152,25153],{},"\"The real-world mountain landscape gradually transforms into a traditional Chinese ink wash (山水画) painting. Photorealistic textures dissolve into flowing brushstrokes. Colors fade from vivid to monochrome ink tones. Water surfaces become calligraphic ink flows. Slow, contemplative transition.\"",[11,25155,25156],{},"첫 번째 프레임은 사실적인 산 풍경입니다. 마지막 프레임은 유사한 장면의 전통 수묵화입니다. 모델은 사진적 텍스처가 점진적으로 붓터치로 녹아드는 매끄러운 변환을 생성합니다 — After Effects에서 수동으로 구현하면 수 시간이 걸릴 효과입니다.",[92,25158,25160],{"id":25159},"첫-마지막-프레임-모드-팁","첫-마지막 프레임 모드 팁",[11,25162,25163,25166],{},[23,25164,25165],{},"프레임 간 구도를 일치시키세요."," 첫 번째 프레임에 왼쪽에 산이 있다면, 마지막 프레임에도 같은 위치에 유사한 구조적 요소가 있어야 합니다. 두 프레임이 대략 같은 레이아웃을 공유할 때 모델이 더 나은 전환을 생성합니다.",[11,25168,25169,25172,25173,25176],{},[23,25170,25171],{},"끝점이 아닌 전환을 설명하세요."," 모델은 시작과 끝이 어떻게 생겼는지 이미 알고 있습니다 — 이미지가 있기 때문입니다. 프롬프트는 A에서 B로 ",[2621,25174,25175],{},"어떻게"," 이동하는지를 설명해야 합니다.",[137,25178,25181],{"className":25179,"code":25180,"language":2183},[2181],"# Weak: just describes the endpoints\n\"A sunrise and a sunset\"\n\n# Strong: describes the journey\n\"The golden dawn light gradually warms to midday brightness,\nthen softens through amber afternoon hues into deep sunset oranges.\nShadows rotate clockwise. Cloud formations shift and reform.\"\n",[28,25182,25180],{"__ignoreMap":142},[11,25184,25185,25188],{},[23,25186,25187],{},"복잡한 전환에는 더 긴 지속 시간을 사용하세요."," 단순한 색상 변화는 4초면 충분합니다. 스타일 변환(사실적 → 일러스트)은 8~12초가 효과적입니다. 짧은 지속 시간에서의 급격한 변화는 부자연스러워 보입니다.",[2035,25190,25191,25201],{},[2038,25192,25193],{},[2041,25194,25195,25198],{},[2044,25196,25197],{},"전환 유형",[2044,25199,25200],{},"권장 지속 시간",[2051,25202,25203,25210,25217,25225],{},[2041,25204,25205,25208],{},[2056,25206,25207],{},"색상/조명 변화",[2056,25209,19515],{},[2041,25211,25212,25215],{},[2056,25213,25214],{},"카메라 위치 변경",[2056,25216,19438],{},[2041,25218,25219,25222],{},[2056,25220,25221],{},"스타일 변환",[2056,25223,25224],{},"8~12초",[2041,25226,25227,25230],{},[2056,25228,25229],{},"서사적 장면 전환",[2056,25231,25232],{},"10~15초",[45,25234],{},[48,25236,25238],{"id":25237},"모드-3-tags를-활용한-멀티-이미지-합성","모드 3: @Tags를 활용한 멀티 이미지 합성",[11,25240,25241,25242,25244],{},"이것은 Seedance 2.0의 가장 강력한 이미지-투-비디오 모드이며, 경쟁 API가 제공하지 못하는 유일한 기능입니다. 최대 9개의 이미지를 제공하고 프롬프트에서 ",[28,25243,4148],{}," 태그를 사용하여 각각에 의미적 역할을 지정하면, 모델이 이를 하나의 일관된 영상으로 합성합니다.",[92,25246,25248],{"id":25247},"tags-작동-방식","@Tags 작동 방식",[11,25250,25251,25253],{},[28,25252,2898],{},"에 여러 URL을 포함하면 Seedance 2.0이 배열 위치에 따라 순차적으로 태그를 할당합니다:",[137,25255,25258],{"className":25256,"code":25257,"language":2183},[2181],"image_urls[0] → @Image1\nimage_urls[1] → @Image2\nimage_urls[2] → @Image3\n...\nimage_urls[8] → @Image9\n",[28,25259,25257],{"__ignoreMap":142},[11,25261,25262],{},"프롬프트에서 이 태그를 참조하여 모델에 각 이미지의 사용 방법을 정확히 알려줍니다:",[137,25264,25267],{"className":25265,"code":25266,"language":2183},[2181],"@Image1 is the main character running through the city.\n@Image2 is the city skyline in the background.\n@Image3 defines the color grading and visual mood.\n",[28,25268,25266],{"__ignoreMap":142},[11,25270,25271],{},"태그가 없으면 모델이 어떤 이미지가 캐릭터이고 어떤 이미지가 배경인지 추측해야 합니다. 태그가 있으면 모호함이 없습니다. 이미지가 시각적으로 유사하거나 특정 이미지를 콘텐츠가 아닌 스타일 제어에 사용하고 싶을 때 특히 중요합니다.",[92,25273,25275],{"id":25274},"전체-코드-멀티-이미지-합성","전체 코드: 멀티 이미지 합성",[137,25277,25279],{"className":338,"code":25278,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Multi-Image Composition with @Tags ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a parkour runner in dark athletic gear. \"\n        \"@Image2 is a futuristic city rooftop at twilight. \"\n        \"@Image3 is a neon-lit alleyway. \"\n        \"@Image4 is a glass skyscraper facade. \"\n        \"@Image5 provides the cyberpunk color grading reference. \"\n        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n        \"leaps over the edge, flips through the alleyway (@Image3), \"\n        \"and wall-runs along the skyscraper (@Image4). \"\n        \"Dynamic handheld camera follows the action. \"\n        \"Cyberpunk neon color palette from @Image5 throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/runner.jpg\",\n        \"https://example.com/rooftop.jpg\",\n        \"https://example.com/alley.jpg\",\n        \"https://example.com/skyscraper.jpg\",\n        \"https://example.com/cyberpunk-ref.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,25280,25281,25287,25293,25297,25305,25313,25321,25337,25345,25349,25353,25373,25395,25403,25413,25429,25437,25449,25461,25489,25495,25507,25535,25541,25569,25573,25581,25587,25591,25596,25604,25614,25620,25625,25630,25635,25640,25645,25650,25655,25660,25665,25670,25674,25680,25687,25694,25701,25708,25713,25717,25727,25737,25747,25755,25759,25763,25771,25783,25793,25801,25805,25813,25837,25841],{"__ignoreMap":142},[146,25282,25283,25285],{"class":148,"line":149},[146,25284,347],{"class":259},[146,25286,329],{"class":263},[146,25288,25289,25291],{"class":148,"line":167},[146,25290,347],{"class":259},[146,25292,356],{"class":263},[146,25294,25295],{"class":148,"line":179},[146,25296,376],{"emptyLinePlaceholder":58},[146,25298,25299,25301,25303],{"class":148,"line":188},[146,25300,388],{"class":156},[146,25302,391],{"class":259},[146,25304,17607],{"class":160},[146,25306,25307,25309,25311],{"class":148,"line":373},[146,25308,412],{"class":156},[146,25310,391],{"class":259},[146,25312,417],{"class":160},[146,25314,25315,25317,25319],{"class":148,"line":379},[146,25316,423],{"class":156},[146,25318,391],{"class":259},[146,25320,428],{"class":263},[146,25322,25323,25325,25327,25329,25331,25333,25335],{"class":148,"line":385},[146,25324,434],{"class":160},[146,25326,437],{"class":263},[146,25328,440],{"class":259},[146,25330,443],{"class":160},[146,25332,446],{"class":156},[146,25334,449],{"class":160},[146,25336,452],{"class":263},[146,25338,25339,25341,25343],{"class":148,"line":409},[146,25340,458],{"class":160},[146,25342,437],{"class":263},[146,25344,463],{"class":160},[146,25346,25347],{"class":148,"line":420},[146,25348,469],{"class":263},[146,25350,25351],{"class":148,"line":431},[146,25352,376],{"emptyLinePlaceholder":58},[146,25354,25355,25357,25359,25361,25363,25365,25367,25369,25371],{"class":148,"line":455},[146,25356,526],{"class":259},[146,25358,529],{"class":152},[146,25360,11696],{"class":263},[146,25362,267],{"class":259},[146,25364,1352],{"class":156},[146,25366,23505],{"class":263},[146,25368,267],{"class":259},[146,25370,11707],{"class":156},[146,25372,548],{"class":263},[146,25374,25375,25377,25379,25381,25383,25385,25387,25389,25391,25393],{"class":148,"line":466},[146,25376,23521],{"class":263},[146,25378,267],{"class":259},[146,25380,3361],{"class":259},[146,25382,449],{"class":160},[146,25384,679],{"class":156},[146,25386,682],{"class":160},[146,25388,685],{"class":156},[146,25390,688],{"class":263},[146,25392,691],{"class":156},[146,25394,950],{"class":160},[146,25396,25397,25399,25401],{"class":148,"line":600},[146,25398,631],{"class":263},[146,25400,267],{"class":259},[146,25402,636],{"class":156},[146,25404,25405,25407,25409,25411],{"class":148,"line":605},[146,25406,642],{"class":259},[146,25408,645],{"class":263},[146,25410,648],{"class":259},[146,25412,23562],{"class":263},[146,25414,25415,25417,25419,25421,25423,25425,25427],{"class":148,"line":611},[146,25416,6932],{"class":263},[146,25418,267],{"class":259},[146,25420,1131],{"class":263},[146,25422,17836],{"class":701},[146,25424,267],{"class":259},[146,25426,423],{"class":156},[146,25428,406],{"class":263},[146,25430,25431,25433,25435],{"class":148,"line":617},[146,25432,23583],{"class":263},[146,25434,267],{"class":259},[146,25436,11777],{"class":263},[146,25438,25439,25441,25443,25445,25447],{"class":148,"line":623},[146,25440,753],{"class":263},[146,25442,267],{"class":259},[146,25444,23596],{"class":263},[146,25446,761],{"class":160},[146,25448,764],{"class":263},[146,25450,25451,25453,25455,25457,25459],{"class":148,"line":628},[146,25452,848],{"class":259},[146,25454,851],{"class":263},[146,25456,854],{"class":259},[146,25458,857],{"class":160},[146,25460,860],{"class":263},[146,25462,25463,25465,25467,25469,25471,25473,25475,25477,25479,25481,25483,25485,25487],{"class":148,"line":639},[146,25464,5580],{"class":156},[146,25466,794],{"class":263},[146,25468,440],{"class":259},[146,25470,11817],{"class":160},[146,25472,685],{"class":156},[146,25474,24046],{"class":263},[146,25476,17898],{"class":160},[146,25478,1562],{"class":263},[146,25480,17903],{"class":160},[146,25482,1535],{"class":263},[146,25484,691],{"class":156},[146,25486,449],{"class":160},[146,25488,406],{"class":263},[146,25490,25491,25493],{"class":148,"line":654},[146,25492,866],{"class":259},[146,25494,23659],{"class":263},[146,25496,25497,25499,25501,25503,25505],{"class":148,"line":660},[146,25498,875],{"class":259},[146,25500,851],{"class":263},[146,25502,854],{"class":259},[146,25504,882],{"class":160},[146,25506,860],{"class":263},[146,25508,25509,25511,25513,25515,25517,25519,25521,25523,25525,25527,25529,25531,25533],{"class":148,"line":671},[146,25510,5580],{"class":156},[146,25512,794],{"class":263},[146,25514,440],{"class":259},[146,25516,24089],{"class":160},[146,25518,685],{"class":156},[146,25520,23686],{"class":263},[146,25522,11874],{"class":160},[146,25524,400],{"class":263},[146,25526,943],{"class":160},[146,25528,118],{"class":263},[146,25530,691],{"class":156},[146,25532,449],{"class":160},[146,25534,406],{"class":263},[146,25536,25537,25539],{"class":148,"line":698},[146,25538,866],{"class":259},[146,25540,23659],{"class":263},[146,25542,25543,25545,25547,25549,25551,25553,25555,25557,25559,25561,25563,25565,25567],{"class":148,"line":710},[146,25544,791],{"class":156},[146,25546,794],{"class":263},[146,25548,440],{"class":259},[146,25550,11903],{"class":160},[146,25552,685],{"class":156},[146,25554,814],{"class":263},[146,25556,691],{"class":156},[146,25558,104],{"class":160},[146,25560,685],{"class":156},[146,25562,804],{"class":263},[146,25564,691],{"class":156},[146,25566,10730],{"class":160},[146,25568,406],{"class":263},[146,25570,25571],{"class":148,"line":716},[146,25572,11927],{"class":263},[146,25574,25575,25577,25579],{"class":148,"line":722},[146,25576,979],{"class":263},[146,25578,982],{"class":259},[146,25580,11936],{"class":263},[146,25582,25583,25585],{"class":148,"line":728},[146,25584,1703],{"class":259},[146,25586,11958],{"class":156},[146,25588,25589],{"class":148,"line":739},[146,25590,376],{"emptyLinePlaceholder":58},[146,25592,25593],{"class":148,"line":744},[146,25594,25595],{"class":175},"# --- Multi-Image Composition with @Tags ---\n",[146,25597,25598,25600,25602],{"class":148,"line":750},[146,25599,3665],{"class":263},[146,25601,267],{"class":259},[146,25603,428],{"class":263},[146,25605,25606,25608,25610,25612],{"class":148,"line":767},[146,25607,3674],{"class":160},[146,25609,437],{"class":263},[146,25611,1308],{"class":160},[146,25613,452],{"class":263},[146,25615,25616,25618],{"class":148,"line":788},[146,25617,3685],{"class":160},[146,25619,1322],{"class":263},[146,25621,25622],{"class":148,"line":834},[146,25623,25624],{"class":160},"        \"@Image1 is a parkour runner in dark athletic gear. \"\n",[146,25626,25627],{"class":148,"line":839},[146,25628,25629],{"class":160},"        \"@Image2 is a futuristic city rooftop at twilight. \"\n",[146,25631,25632],{"class":148,"line":845},[146,25633,25634],{"class":160},"        \"@Image3 is a neon-lit alleyway. \"\n",[146,25636,25637],{"class":148,"line":863},[146,25638,25639],{"class":160},"        \"@Image4 is a glass skyscraper facade. \"\n",[146,25641,25642],{"class":148,"line":872},[146,25643,25644],{"class":160},"        \"@Image5 provides the cyberpunk color grading reference. \"\n",[146,25646,25647],{"class":148,"line":887},[146,25648,25649],{"class":160},"        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n",[146,25651,25652],{"class":148,"line":903},[146,25653,25654],{"class":160},"        \"leaps over the edge, flips through the alleyway (@Image3), \"\n",[146,25656,25657],{"class":148,"line":915},[146,25658,25659],{"class":160},"        \"and wall-runs along the skyscraper (@Image4). \"\n",[146,25661,25662],{"class":148,"line":953},[146,25663,25664],{"class":160},"        \"Dynamic handheld camera follows the action. \"\n",[146,25666,25667],{"class":148,"line":959},[146,25668,25669],{"class":160},"        \"Cyberpunk neon color palette from @Image5 throughout.\"\n",[146,25671,25672],{"class":148,"line":964},[146,25673,3808],{"class":263},[146,25675,25676,25678],{"class":148,"line":970},[146,25677,15392],{"class":160},[146,25679,2693],{"class":263},[146,25681,25682,25685],{"class":148,"line":976},[146,25683,25684],{"class":160},"        \"https://example.com/runner.jpg\"",[146,25686,452],{"class":263},[146,25688,25689,25692],{"class":148,"line":988},[146,25690,25691],{"class":160},"        \"https://example.com/rooftop.jpg\"",[146,25693,452],{"class":263},[146,25695,25696,25699],{"class":148,"line":993},[146,25697,25698],{"class":160},"        \"https://example.com/alley.jpg\"",[146,25700,452],{"class":263},[146,25702,25703,25706],{"class":148,"line":5534},[146,25704,25705],{"class":160},"        \"https://example.com/skyscraper.jpg\"",[146,25707,452],{"class":263},[146,25709,25710],{"class":148,"line":5543},[146,25711,25712],{"class":160},"        \"https://example.com/cyberpunk-ref.jpg\"\n",[146,25714,25715],{"class":148,"line":5549},[146,25716,16375],{"class":263},[146,25718,25719,25721,25723,25725],{"class":148,"line":5577},[146,25720,3697],{"class":160},[146,25722,437],{"class":263},[146,25724,537],{"class":156},[146,25726,452],{"class":263},[146,25728,25729,25731,25733,25735],{"class":148,"line":5608},[146,25730,3709],{"class":160},[146,25732,437],{"class":263},[146,25734,3714],{"class":160},[146,25736,452],{"class":263},[146,25738,25739,25741,25743,25745],{"class":148,"line":5628},[146,25740,3721],{"class":160},[146,25742,437],{"class":263},[146,25744,1384],{"class":160},[146,25746,452],{"class":263},[146,25748,25749,25751,25753],{"class":148,"line":5634},[146,25750,3737],{"class":160},[146,25752,437],{"class":263},[146,25754,3742],{"class":156},[146,25756,25757],{"class":148,"line":5640},[146,25758,469],{"class":263},[146,25760,25761],{"class":148,"line":5645},[146,25762,376],{"emptyLinePlaceholder":58},[146,25764,25765,25767,25769],{"class":148,"line":5658},[146,25766,24282],{"class":263},[146,25768,267],{"class":259},[146,25770,1432],{"class":263},[146,25772,25773,25775,25777,25779,25781],{"class":148,"line":5664},[146,25774,6541],{"class":259},[146,25776,449],{"class":160},[146,25778,679],{"class":156},[146,25780,1444],{"class":160},[146,25782,452],{"class":263},[146,25784,25785,25787,25789,25791],{"class":148,"line":5691},[146,25786,6554],{"class":701},[146,25788,267],{"class":259},[146,25790,423],{"class":156},[146,25792,452],{"class":263},[146,25794,25795,25797,25799],{"class":148,"line":5731},[146,25796,6565],{"class":701},[146,25798,267],{"class":259},[146,25800,2790],{"class":263},[146,25802,25803],{"class":148,"line":5750},[146,25804,406],{"class":263},[146,25806,25807,25809,25811],{"class":148,"line":5755},[146,25808,12238],{"class":263},[146,25810,267],{"class":259},[146,25812,11777],{"class":263},[146,25814,25815,25817,25819,25821,25823,25825,25827,25829,25831,25833,25835],{"class":148,"line":5760},[146,25816,6587],{"class":156},[146,25818,794],{"class":263},[146,25820,440],{"class":259},[146,25822,24339],{"class":160},[146,25824,685],{"class":156},[146,25826,11822],{"class":263},[146,25828,19895],{"class":160},[146,25830,1535],{"class":263},[146,25832,691],{"class":156},[146,25834,449],{"class":160},[146,25836,406],{"class":263},[146,25838,25839],{"class":148,"line":5765},[146,25840,376],{"emptyLinePlaceholder":58},[146,25842,25843,25845,25847,25849,25851],{"class":148,"line":7445},[146,25844,24367],{"class":263},[146,25846,267],{"class":259},[146,25848,24372],{"class":263},[146,25850,7696],{"class":160},[146,25852,1629],{"class":263},[92,25854,25856],{"id":25855},"데모-5개-이미지-참조를-활용한-도시-파쿠르","데모: 5개 이미지 참조를 활용한 도시 파쿠르",[56,25858,60,25859],{"controls":58,"playsInline":58,"style":59},[62,25860],{"src":12259,"type":65},[11,25862,25863,2424,25865],{},[23,25864,24399],{},[2621,25866,25867],{},"\"@Image1 is the parkour runner. @Image2 is the rooftop environment. @Image3 is the neon alley. @Image4 is the glass building. @Image5 is the color palette reference. The runner (@Image1) sprints across the rooftop (@Image2), leaps, flips through the alley (@Image3), wall-runs along the building (@Image4). Dynamic tracking camera. Cyberpunk color grading from @Image5.\"",[11,25869,25870,25871,25873],{},"5개의 개별 이미지 — 캐릭터 1개, 환경 3개, 스타일 참조 1개 — 가 단일 연속 액션 시퀀스로 결합됩니다. 각 ",[28,25872,4148],{}," 태그가 모델에 어떤 시각적 요소가 장면의 어떤 부분을 제어하는지 정확한 지시를 제공합니다.",[92,25875,25877],{"id":25876},"일반적인-tag-역할-지정","일반적인 @Tag 역할 지정",[11,25879,25880,25882],{},[28,25881,23126],{}," 시스템은 유연합니다. 가장 효과적인 패턴은 다음과 같습니다:",[2035,25884,25885,25898],{},[2038,25886,25887],{},[2041,25888,25889,25892,25895],{},[2044,25890,25891],{},"역할",[2044,25893,25894],{},"프롬프트에서의 태그 사용",[2044,25896,25897],{},"목적",[2051,25899,25900,25913,25926,25939,25952,25965],{},[2041,25901,25902,25905,25910],{},[2056,25903,25904],{},"캐릭터",[2056,25906,25907],{},[28,25908,25909],{},"@Image1 is the main character",[2056,25911,25912],{},"정체성, 의상, 특징 보존",[2041,25914,25915,25918,25923],{},[2056,25916,25917],{},"배경",[2056,25919,25920],{},[28,25921,25922],{},"@Image2 is the environment",[2056,25924,25925],{},"장면 위치 설정",[2041,25927,25928,25931,25936],{},[2056,25929,25930],{},"스타일 참조",[2056,25932,25933],{},[28,25934,25935],{},"@Image3 defines the art style",[2056,25937,25938],{},"렌더링 미학 제어",[2041,25940,25941,25944,25949],{},[2056,25942,25943],{},"오브젝트/소품",[2056,25945,25946],{},[28,25947,25948],{},"@Image4 is the product on the table",[2056,25950,25951],{},"장면에 특정 아이템 배치",[2041,25953,25954,25957,25962],{},[2056,25955,25956],{},"색보정",[2056,25958,25959],{},[28,25960,25961],{},"@Image5 is the color palette",[2056,25963,25964],{},"참조에서 분위기/톤 적용",[2041,25966,25967,25970,25975],{},[2056,25968,25969],{},"텍스처 참조",[2056,25971,25972],{},[28,25973,25974],{},"@Image6 provides surface textures",[2056,25976,25977],{},"재질/텍스처 전이",[92,25979,25981],{"id":25980},"데모-스타일-참조를-활용한-캐릭터","데모: 스타일 참조를 활용한 캐릭터",[56,25983,60,25984],{"controls":58,"playsInline":58,"style":59},[62,25985],{"src":25986,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%BA%A2%E8%89%B2%E5%A4%96%E5%A5%97%E7%9A%84%E7%A5%9E%E7%A7%98%E8%BA%AB%E5%BD%B1%E5%9C%A8%E5%9F%8E%E5%B8%82%E8%A1%97%E9%81%93%E5%A5%94%E8%B7%91.mp4",[11,25988,25989,2424,25991],{},[23,25990,24399],{},[2621,25992,25993],{},"\"@Image1 is the character — a mysterious figure in a red coat. The character runs through rain-soaked city streets at night. Neon reflections on wet pavement. Camera tracks alongside at medium distance. Cinematic atmosphere, shallow depth of field.\"",[11,25995,25996,25997,25999],{},"단일 캐릭터 참조 이미지가 정체성을 제어하고 프롬프트가 환경과 동작을 주도합니다. 빨간 코트, 체형, 움직임 스타일이 모두 ",[28,25998,2911],{},"에서 파생됩니다.",[11,26001,26002,26003,26005,26006,1260],{},"전체 ",[28,26004,23126],{}," 참조 — 비디오 및 오디오 태그, 혼합 미디어 조합, 고급 역할 패턴 포함 — 는 ",[37,26007,2970],{"href":2969},[45,26009],{},[48,26011,26013],{"id":26012},"여러-샷에서-캐릭터-일관성-유지","여러 샷에서 캐릭터 일관성 유지",[11,26015,26016,26017,26020,26021,26023],{},"단일 생성 클립도 유용하지만, 다른 장면에서 ",[2621,26018,26019],{},"동일한 캐릭터","가 등장하는 클립 시퀀스는 하나의 스토리가 됩니다. 캐릭터 일관성은 AI 영상 생성에서 가장 어려운 문제이며, Seedance 2.0의 ",[28,26022,23126],{}," 시스템은 API를 통해 사용할 수 있는 가장 안정적인 솔루션을 제공합니다.",[92,26025,26027],{"id":26026},"캐릭터-고정-패턴","캐릭터 고정 패턴",[11,26029,26030,26031,26033],{},"여러 샷에서 동일한 캐릭터를 유지하려면 모든 생성 요청에서 동일한 캐릭터 참조 이미지를 ",[28,26032,2911],{},"으로 사용하세요. 프롬프트와 배경/환경 이미지만 변경합니다.",[137,26035,26037],{"className":338,"code":26036,"language":340,"meta":142,"style":142},"CHARACTER_IMAGE = \"https://example.com/my-character.jpg\"\n\nshots = [\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She walks into a cozy library, \"\n            \"looks around with wonder, and reaches for a book on the top shelf. \"\n            \"Warm golden lighting. Camera at eye level, slow push in.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 8\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She sits at a wooden reading table, \"\n            \"opens the book, and pages start glowing with magical light. \"\n            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She steps out of the library into \"\n            \"a fantastical world that matches the book's illustrations. \"\n            \"Vibrant colors replace the muted library tones. \"\n            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef generate_shot(shot):\n    image_urls = [CHARACTER_IMAGE] + shot[\"extra_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    return resp.json()[\"task_id\"]\n\n# Generate all shots\ntask_ids = [generate_shot(shot) for shot in shots]\nprint(f\"Submitted {len(task_ids)} shots: {task_ids}\")\n\n# Poll each shot\nfor i, task_id in enumerate(task_ids):\n    print(f\"\\nWaiting for Shot {i+1}...\")\n    wait_for_video(task_id)\n",[28,26038,26039,26049,26053,26062,26067,26073,26078,26083,26088,26092,26100,26109,26113,26117,26123,26128,26133,26138,26142,26148,26157,26161,26165,26171,26176,26181,26186,26191,26195,26201,26209,26213,26217,26221,26231,26253,26261,26271,26282,26289,26299,26309,26317,26321,26329,26341,26351,26359,26363,26373,26377,26382,26402,26434,26438,26443,26457,26484],{"__ignoreMap":142},[146,26040,26041,26044,26046],{"class":148,"line":149},[146,26042,26043],{"class":156},"CHARACTER_IMAGE",[146,26045,391],{"class":259},[146,26047,26048],{"class":160}," \"https://example.com/my-character.jpg\"\n",[146,26050,26051],{"class":148,"line":167},[146,26052,376],{"emptyLinePlaceholder":58},[146,26054,26055,26058,26060],{"class":148,"line":179},[146,26056,26057],{"class":263},"shots ",[146,26059,267],{"class":259},[146,26061,8868],{"class":263},[146,26063,26064],{"class":148,"line":188},[146,26065,26066],{"class":263},"    {\n",[146,26068,26069,26071],{"class":148,"line":373},[146,26070,1319],{"class":160},[146,26072,1322],{"class":263},[146,26074,26075],{"class":148,"line":379},[146,26076,26077],{"class":160},"            \"@Image1 is the main character. She walks into a cozy library, \"\n",[146,26079,26080],{"class":148,"line":385},[146,26081,26082],{"class":160},"            \"looks around with wonder, and reaches for a book on the top shelf. \"\n",[146,26084,26085],{"class":148,"line":409},[146,26086,26087],{"class":160},"            \"Warm golden lighting. Camera at eye level, slow push in.\"\n",[146,26089,26090],{"class":148,"line":420},[146,26091,1342],{"class":263},[146,26093,26094,26097],{"class":148,"line":431},[146,26095,26096],{"class":160},"        \"extra_images\"",[146,26098,26099],{"class":263},": [],\n",[146,26101,26102,26104,26106],{"class":148,"line":455},[146,26103,1347],{"class":160},[146,26105,437],{"class":263},[146,26107,26108],{"class":156},"8\n",[146,26110,26111],{"class":148,"line":466},[146,26112,22210],{"class":263},[146,26114,26115],{"class":148,"line":600},[146,26116,26066],{"class":263},[146,26118,26119,26121],{"class":148,"line":605},[146,26120,1319],{"class":160},[146,26122,1322],{"class":263},[146,26124,26125],{"class":148,"line":611},[146,26126,26127],{"class":160},"            \"@Image1 is the main character. She sits at a wooden reading table, \"\n",[146,26129,26130],{"class":148,"line":617},[146,26131,26132],{"class":160},"            \"opens the book, and pages start glowing with magical light. \"\n",[146,26134,26135],{"class":148,"line":623},[146,26136,26137],{"class":160},"            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n",[146,26139,26140],{"class":148,"line":628},[146,26141,1342],{"class":263},[146,26143,26144,26146],{"class":148,"line":639},[146,26145,26096],{"class":160},[146,26147,26099],{"class":263},[146,26149,26150,26152,26154],{"class":148,"line":654},[146,26151,1347],{"class":160},[146,26153,437],{"class":263},[146,26155,26156],{"class":156},"10\n",[146,26158,26159],{"class":148,"line":660},[146,26160,22210],{"class":263},[146,26162,26163],{"class":148,"line":671},[146,26164,26066],{"class":263},[146,26166,26167,26169],{"class":148,"line":698},[146,26168,1319],{"class":160},[146,26170,1322],{"class":263},[146,26172,26173],{"class":148,"line":710},[146,26174,26175],{"class":160},"            \"@Image1 is the main character. She steps out of the library into \"\n",[146,26177,26178],{"class":148,"line":716},[146,26179,26180],{"class":160},"            \"a fantastical world that matches the book's illustrations. \"\n",[146,26182,26183],{"class":148,"line":722},[146,26184,26185],{"class":160},"            \"Vibrant colors replace the muted library tones. \"\n",[146,26187,26188],{"class":148,"line":728},[146,26189,26190],{"class":160},"            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n",[146,26192,26193],{"class":148,"line":739},[146,26194,1342],{"class":263},[146,26196,26197,26199],{"class":148,"line":744},[146,26198,26096],{"class":160},[146,26200,26099],{"class":263},[146,26202,26203,26205,26207],{"class":148,"line":750},[146,26204,1347],{"class":160},[146,26206,437],{"class":263},[146,26208,26156],{"class":156},[146,26210,26211],{"class":148,"line":767},[146,26212,22210],{"class":263},[146,26214,26215],{"class":148,"line":788},[146,26216,764],{"class":263},[146,26218,26219],{"class":148,"line":834},[146,26220,376],{"emptyLinePlaceholder":58},[146,26222,26223,26225,26228],{"class":148,"line":839},[146,26224,526],{"class":259},[146,26226,26227],{"class":152}," generate_shot",[146,26229,26230],{"class":263},"(shot):\n",[146,26232,26233,26235,26237,26239,26241,26243,26245,26248,26251],{"class":148,"line":845},[146,26234,6234],{"class":263},[146,26236,267],{"class":259},[146,26238,8194],{"class":263},[146,26240,26043],{"class":156},[146,26242,14937],{"class":263},[146,26244,5430],{"class":259},[146,26246,26247],{"class":263}," shot[",[146,26249,26250],{"class":160},"\"extra_images\"",[146,26252,764],{"class":263},[146,26254,26255,26257,26259],{"class":148,"line":863},[146,26256,1294],{"class":263},[146,26258,267],{"class":259},[146,26260,428],{"class":263},[146,26262,26263,26265,26267,26269],{"class":148,"line":872},[146,26264,1303],{"class":160},[146,26266,437],{"class":263},[146,26268,1308],{"class":160},[146,26270,452],{"class":263},[146,26272,26273,26275,26278,26280],{"class":148,"line":887},[146,26274,1319],{"class":160},[146,26276,26277],{"class":263},": shot[",[146,26279,5924],{"class":160},[146,26281,10852],{"class":263},[146,26283,26284,26286],{"class":148,"line":903},[146,26285,2690],{"class":160},[146,26287,26288],{"class":263},": image_urls,\n",[146,26290,26291,26293,26295,26297],{"class":148,"line":915},[146,26292,1347],{"class":160},[146,26294,26277],{"class":263},[146,26296,5969],{"class":160},[146,26298,10852],{"class":263},[146,26300,26301,26303,26305,26307],{"class":148,"line":953},[146,26302,1363],{"class":160},[146,26304,437],{"class":263},[146,26306,3714],{"class":160},[146,26308,452],{"class":263},[146,26310,26311,26313,26315],{"class":148,"line":959},[146,26312,1379],{"class":160},[146,26314,437],{"class":263},[146,26316,2732],{"class":160},[146,26318,26319],{"class":148,"line":964},[146,26320,1407],{"class":263},[146,26322,26323,26325,26327],{"class":148,"line":970},[146,26324,1126],{"class":263},[146,26326,267],{"class":259},[146,26328,1432],{"class":263},[146,26330,26331,26333,26335,26337,26339],{"class":148,"line":976},[146,26332,1437],{"class":259},[146,26334,449],{"class":160},[146,26336,679],{"class":156},[146,26338,1444],{"class":160},[146,26340,452],{"class":263},[146,26342,26343,26345,26347,26349],{"class":148,"line":988},[146,26344,1455],{"class":701},[146,26346,267],{"class":259},[146,26348,423],{"class":156},[146,26350,452],{"class":263},[146,26352,26353,26355,26357],{"class":148,"line":993},[146,26354,1470],{"class":701},[146,26356,267],{"class":259},[146,26358,2790],{"class":263},[146,26360,26361],{"class":148,"line":5534},[146,26362,1483],{"class":263},[146,26364,26365,26367,26369,26371],{"class":148,"line":5543},[146,26366,1703],{"class":259},[146,26368,20766],{"class":263},[146,26370,7696],{"class":160},[146,26372,764],{"class":263},[146,26374,26375],{"class":148,"line":5549},[146,26376,376],{"emptyLinePlaceholder":58},[146,26378,26379],{"class":148,"line":5577},[146,26380,26381],{"class":175},"# Generate all shots\n",[146,26383,26384,26387,26389,26392,26394,26397,26399],{"class":148,"line":5608},[146,26385,26386],{"class":263},"task_ids ",[146,26388,267],{"class":259},[146,26390,26391],{"class":263}," [generate_shot(shot) ",[146,26393,8231],{"class":259},[146,26395,26396],{"class":263}," shot ",[146,26398,1180],{"class":259},[146,26400,26401],{"class":263}," shots]\n",[146,26403,26404,26406,26408,26410,26413,26415,26418,26420,26423,26425,26428,26430,26432],{"class":148,"line":5628},[146,26405,6587],{"class":156},[146,26407,794],{"class":263},[146,26409,440],{"class":259},[146,26411,26412],{"class":160},"\"Submitted ",[146,26414,6273],{"class":156},[146,26416,26417],{"class":263},"(task_ids)",[146,26419,691],{"class":156},[146,26421,26422],{"class":160}," shots: ",[146,26424,685],{"class":156},[146,26426,26427],{"class":263},"task_ids",[146,26429,691],{"class":156},[146,26431,449],{"class":160},[146,26433,406],{"class":263},[146,26435,26436],{"class":148,"line":5634},[146,26437,376],{"emptyLinePlaceholder":58},[146,26439,26440],{"class":148,"line":5640},[146,26441,26442],{"class":175},"# Poll each shot\n",[146,26444,26445,26447,26450,26452,26454],{"class":148,"line":5645},[146,26446,8231],{"class":259},[146,26448,26449],{"class":263}," i, task_id ",[146,26451,1180],{"class":259},[146,26453,6294],{"class":156},[146,26455,26456],{"class":263},"(task_ids):\n",[146,26458,26459,26461,26463,26465,26467,26469,26472,26474,26476,26478,26480,26482],{"class":148,"line":5658},[146,26460,1102],{"class":156},[146,26462,794],{"class":263},[146,26464,440],{"class":259},[146,26466,449],{"class":160},[146,26468,1670],{"class":156},[146,26470,26471],{"class":160},"Waiting for Shot ",[146,26473,685],{"class":156},[146,26475,6332],{"class":263},[146,26477,5430],{"class":259},[146,26479,10041],{"class":156},[146,26481,1119],{"class":160},[146,26483,406],{"class":263},[146,26485,26486],{"class":148,"line":5664},[146,26487,26488],{"class":263},"    wait_for_video(task_id)\n",[92,26490,26492],{"id":26491},"데모-도서관-스토리-시퀀스","데모: 도서관 스토리 시퀀스",[56,26494,60,26495],{"controls":58,"playsInline":58,"style":59},[62,26496],{"src":64,"type":65},[11,26498,26499,2424,26501],{},[23,26500,24399],{},[2621,26502,26503],{},"\"@Image1 is a young girl with braids. She enters a grand old library, runs her fingers along the spines of ancient books, pulls one out, and opens it. Golden dust motes swirl in shaft of light from a high window. Warm, magical atmosphere. Camera follows her at child's eye level.\"",[11,26505,26506],{},"캐릭터 — 땋은 머리의 어린 소녀 — 는 동일한 참조 이미지가 모든 샷에 앵커 역할을 하기 때문에 시각적으로 일관성을 유지합니다. 모델은 다양한 동작과 환경을 생성하면서도 그녀의 체형, 의상, 시각적 특징을 보존합니다.",[92,26508,26510],{"id":26509},"일관성-팁","일관성 팁",[11,26512,26513,26516],{},[23,26514,26515],{},"선명하고 조명이 좋은 캐릭터 참조를 사용하세요."," 모델은 참조 이미지에서 정체성 특징을 추출합니다. 흐릿하거나 조명이 나쁘거나 심하게 가려진 이미지는 모델이 활용할 수 있는 정보가 적습니다. 정면을 바라보는 전신 또는 상반신 사진에 깨끗한 배경이 있으면 최고의 일관성을 얻을 수 있습니다.",[11,26518,26519,2424,26522,26524],{},[23,26520,26521],{},"프롬프트에서 캐릭터 설명을 최소화하세요.",[28,26523,2911],{},"이 이미 파란 드레스를 입은 소녀를 보여주고 있다면, 프롬프트에 \"빨간 드레스를 입은 소녀\"라고 쓰지 마세요. 상충하는 설명은 모델이 이미지와 텍스트 중 하나를 선택하도록 강제하여 일관성이 저하됩니다.",[11,26526,26527,26530],{},[23,26528,26529],{},"모든 샷에서 동일한 화면 비율을 유지하세요."," 시퀀스 도중에 16:9에서 9:16으로 전환하면 프레이밍이 달라져 캐릭터가 다르게 보일 수 있습니다. 하나의 비율을 선택하고 유지하세요.",[11,26532,26533,26536,26537,26539],{},[23,26534,26535],{},"환경 이미지를 별도의 @tags로 추가하세요."," 배경을 텍스트로만 설명하는 대신 배경 참조 이미지를 ",[28,26538,2920],{},"로 제공하세요. 이렇게 하면 캐릭터와 환경 모두를 시각적으로 분리하면서 정밀하게 제어할 수 있습니다.",[137,26541,26543],{"className":338,"code":26542,"language":340,"meta":142,"style":142},"# Shot 1: Character in library\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/library.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n\n# Shot 2: Character in forest\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/forest.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[28,26544,26545,26550,26565,26570,26574,26579,26594],{"__ignoreMap":142},[146,26546,26547],{"class":148,"line":149},[146,26548,26549],{"class":175},"# Shot 1: Character in library\n",[146,26551,26552,26554,26556,26558,26560,26563],{"class":148,"line":167},[146,26553,6241],{"class":160},[146,26555,10846],{"class":263},[146,26557,26043],{"class":156},[146,26559,400],{"class":263},[146,26561,26562],{"class":160},"\"https://example.com/library.jpg\"",[146,26564,764],{"class":263},[146,26566,26567],{"class":148,"line":179},[146,26568,26569],{"class":175},"# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n",[146,26571,26572],{"class":148,"line":188},[146,26573,376],{"emptyLinePlaceholder":58},[146,26575,26576],{"class":148,"line":373},[146,26577,26578],{"class":175},"# Shot 2: Character in forest\n",[146,26580,26581,26583,26585,26587,26589,26592],{"class":148,"line":379},[146,26582,6241],{"class":160},[146,26584,10846],{"class":263},[146,26586,26043],{"class":156},[146,26588,400],{"class":263},[146,26590,26591],{"class":160},"\"https://example.com/forest.jpg\"",[146,26593,764],{"class":263},[146,26595,26596],{"class":148,"line":385},[146,26597,26598],{"class":175},"# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[11,26600,26601,26602,26604,26605,26607],{},"이 패턴 — 캐릭터용 고정 ",[28,26603,2911],{},", 환경용 가변 ",[28,26606,2920],{}," — 은 현재 모든 AI 비디오 API 중에서 가장 안정적인 멀티샷 워크플로우입니다.",[92,26609,26611],{"id":26610},"고급-멀티샷-내러티브-파이프라인","고급: 멀티샷 내러티브 파이프라인",[11,26613,26614],{},"더 긴 내러티브(30초 이상)의 경우, 여러 클립을 생성하고 결합해야 합니다. 다음은 전체 파이프라인을 관리하는 구조화된 접근 방식입니다 — 샷 목록 정의, 병렬 생성, 정렬된 출력:",[137,26616,26618],{"className":338,"code":26617,"language":340,"meta":142,"style":142},"import concurrent.futures\nimport requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\nCHARACTER_REF = \"https://example.com/story-character.jpg\"\n\nSHOT_LIST = [\n    {\n        \"shot_id\": \"01_entrance\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n            \"Dust swirls in the doorway light. \"\n            \"Camera follows her from behind, over-the-shoulder angle.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 6\n    },\n    {\n        \"shot_id\": \"02_discovery\",\n        \"prompt\": (\n            \"@Image1 is the main character. @Image2 is the room interior. \"\n            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n            \"Her face shows surprise. Blue light illuminates her features. \"\n            \"Camera pushes in from medium shot to close-up on her expression.\"\n        ),\n        \"env_images\": [\"https://example.com/mysterious-room.jpg\"],\n        \"duration\": 8\n    },\n    {\n        \"shot_id\": \"03_transformation\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She reaches out and touches the glowing object. \"\n            \"Light radiates outward from the point of contact. \"\n            \"The room transforms — walls dissolve into a starfield. \"\n            \"Camera rapidly pulls back to extreme wide shot.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef submit_shot(shot):\n    \"\"\"Submit a single shot for generation.\"\"\"\n    image_urls = [CHARACTER_REF] + shot[\"env_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    resp = requests.post(f\"{BASE_URL}/videos/generations\", headers=HEADERS, json=payload)\n    task_id = resp.json()[\"task_id\"]\n    return {\"shot_id\": shot[\"shot_id\"], \"task_id\": task_id}\n\ndef poll_until_done(task_id, max_wait=300):\n    \"\"\"Block until task completes or fails.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        data = requests.get(url, headers=HEADERS).json()\n        if data[\"status\"] in (\"completed\", \"failed\"):\n            return data\n        time.sleep(5)\n        elapsed += 5\n    return None\n\n# Submit all shots in parallel\nresults = []\nfor shot in SHOT_LIST:\n    result = submit_shot(shot)\n    results.append(result)\n    print(f\"Submitted {result['shot_id']} → {result['task_id']}\")\n    time.sleep(0.5)\n\n# Collect results in order\nfinal_videos = []\nfor r in results:\n    print(f\"\\nPolling {r['shot_id']}...\")\n    data = poll_until_done(r[\"task_id\"])\n    if data and data[\"status\"] == \"completed\":\n        video_url = data[\"output\"][\"video_url\"]\n        final_videos.append({\"shot_id\": r[\"shot_id\"], \"url\": video_url})\n        print(f\"  Done: {r['shot_id']}: {video_url}\")\n    else:\n        print(f\"  Failed: {r['shot_id']}: generation failed\")\n\n# Output the ordered shot list\nprint(\"\\n=== Final Shot List ===\")\nfor v in final_videos:\n    print(f\"{v['shot_id']}: {v['url']}\")\n",[28,26619,26620,26626,26632,26638,26644,26648,26656,26664,26672,26688,26696,26700,26704,26714,26718,26727,26731,26743,26749,26754,26759,26764,26769,26773,26780,26789,26793,26797,26808,26814,26819,26824,26829,26834,26838,26849,26857,26861,26865,26876,26882,26886,26891,26896,26901,26906,26910,26916,26924,26928,26932,26936,26945,26950,26971,26979,26989,26999,27005,27015,27025,27035,27043,27047,27081,27093,27113,27117,27133,27138,27160,27168,27178,27195,27219,27225,27233,27241,27247,27251,27256,27264,27277,27286,27291,27328,27337,27341,27346,27355,27365,27395,27409,27431,27448,27468,27501,27507,27533,27537,27542,27557,27569],{"__ignoreMap":142},[146,26621,26622,26624],{"class":148,"line":149},[146,26623,347],{"class":259},[146,26625,8371],{"class":263},[146,26627,26628,26630],{"class":148,"line":167},[146,26629,347],{"class":259},[146,26631,329],{"class":263},[146,26633,26634,26636],{"class":148,"line":179},[146,26635,347],{"class":259},[146,26637,356],{"class":263},[146,26639,26640,26642],{"class":148,"line":188},[146,26641,347],{"class":259},[146,26643,370],{"class":263},[146,26645,26646],{"class":148,"line":373},[146,26647,376],{"emptyLinePlaceholder":58},[146,26649,26650,26652,26654],{"class":148,"line":379},[146,26651,388],{"class":156},[146,26653,391],{"class":259},[146,26655,17607],{"class":160},[146,26657,26658,26660,26662],{"class":148,"line":385},[146,26659,412],{"class":156},[146,26661,391],{"class":259},[146,26663,417],{"class":160},[146,26665,26666,26668,26670],{"class":148,"line":409},[146,26667,423],{"class":156},[146,26669,391],{"class":259},[146,26671,428],{"class":263},[146,26673,26674,26676,26678,26680,26682,26684,26686],{"class":148,"line":420},[146,26675,434],{"class":160},[146,26677,437],{"class":263},[146,26679,440],{"class":259},[146,26681,443],{"class":160},[146,26683,446],{"class":156},[146,26685,449],{"class":160},[146,26687,452],{"class":263},[146,26689,26690,26692,26694],{"class":148,"line":431},[146,26691,458],{"class":160},[146,26693,437],{"class":263},[146,26695,463],{"class":160},[146,26697,26698],{"class":148,"line":455},[146,26699,469],{"class":263},[146,26701,26702],{"class":148,"line":466},[146,26703,376],{"emptyLinePlaceholder":58},[146,26705,26706,26709,26711],{"class":148,"line":600},[146,26707,26708],{"class":156},"CHARACTER_REF",[146,26710,391],{"class":259},[146,26712,26713],{"class":160}," \"https://example.com/story-character.jpg\"\n",[146,26715,26716],{"class":148,"line":605},[146,26717,376],{"emptyLinePlaceholder":58},[146,26719,26720,26723,26725],{"class":148,"line":611},[146,26721,26722],{"class":156},"SHOT_LIST",[146,26724,391],{"class":259},[146,26726,8868],{"class":263},[146,26728,26729],{"class":148,"line":617},[146,26730,26066],{"class":263},[146,26732,26733,26736,26738,26741],{"class":148,"line":623},[146,26734,26735],{"class":160},"        \"shot_id\"",[146,26737,437],{"class":263},[146,26739,26740],{"class":160},"\"01_entrance\"",[146,26742,452],{"class":263},[146,26744,26745,26747],{"class":148,"line":628},[146,26746,1319],{"class":160},[146,26748,1322],{"class":263},[146,26750,26751],{"class":148,"line":639},[146,26752,26753],{"class":160},"            \"@Image1 is the main character. \"\n",[146,26755,26756],{"class":148,"line":654},[146,26757,26758],{"class":160},"            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n",[146,26760,26761],{"class":148,"line":660},[146,26762,26763],{"class":160},"            \"Dust swirls in the doorway light. \"\n",[146,26765,26766],{"class":148,"line":671},[146,26767,26768],{"class":160},"            \"Camera follows her from behind, over-the-shoulder angle.\"\n",[146,26770,26771],{"class":148,"line":698},[146,26772,1342],{"class":263},[146,26774,26775,26778],{"class":148,"line":710},[146,26776,26777],{"class":160},"        \"env_images\"",[146,26779,26099],{"class":263},[146,26781,26782,26784,26786],{"class":148,"line":716},[146,26783,1347],{"class":160},[146,26785,437],{"class":263},[146,26787,26788],{"class":156},"6\n",[146,26790,26791],{"class":148,"line":722},[146,26792,22210],{"class":263},[146,26794,26795],{"class":148,"line":728},[146,26796,26066],{"class":263},[146,26798,26799,26801,26803,26806],{"class":148,"line":739},[146,26800,26735],{"class":160},[146,26802,437],{"class":263},[146,26804,26805],{"class":160},"\"02_discovery\"",[146,26807,452],{"class":263},[146,26809,26810,26812],{"class":148,"line":744},[146,26811,1319],{"class":160},[146,26813,1322],{"class":263},[146,26815,26816],{"class":148,"line":750},[146,26817,26818],{"class":160},"            \"@Image1 is the main character. @Image2 is the room interior. \"\n",[146,26820,26821],{"class":148,"line":767},[146,26822,26823],{"class":160},"            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n",[146,26825,26826],{"class":148,"line":788},[146,26827,26828],{"class":160},"            \"Her face shows surprise. Blue light illuminates her features. \"\n",[146,26830,26831],{"class":148,"line":834},[146,26832,26833],{"class":160},"            \"Camera pushes in from medium shot to close-up on her expression.\"\n",[146,26835,26836],{"class":148,"line":839},[146,26837,1342],{"class":263},[146,26839,26840,26842,26844,26847],{"class":148,"line":845},[146,26841,26777],{"class":160},[146,26843,10846],{"class":263},[146,26845,26846],{"class":160},"\"https://example.com/mysterious-room.jpg\"",[146,26848,10852],{"class":263},[146,26850,26851,26853,26855],{"class":148,"line":863},[146,26852,1347],{"class":160},[146,26854,437],{"class":263},[146,26856,26108],{"class":156},[146,26858,26859],{"class":148,"line":872},[146,26860,22210],{"class":263},[146,26862,26863],{"class":148,"line":887},[146,26864,26066],{"class":263},[146,26866,26867,26869,26871,26874],{"class":148,"line":903},[146,26868,26735],{"class":160},[146,26870,437],{"class":263},[146,26872,26873],{"class":160},"\"03_transformation\"",[146,26875,452],{"class":263},[146,26877,26878,26880],{"class":148,"line":915},[146,26879,1319],{"class":160},[146,26881,1322],{"class":263},[146,26883,26884],{"class":148,"line":953},[146,26885,26753],{"class":160},[146,26887,26888],{"class":148,"line":959},[146,26889,26890],{"class":160},"            \"She reaches out and touches the glowing object. \"\n",[146,26892,26893],{"class":148,"line":964},[146,26894,26895],{"class":160},"            \"Light radiates outward from the point of contact. \"\n",[146,26897,26898],{"class":148,"line":970},[146,26899,26900],{"class":160},"            \"The room transforms — walls dissolve into a starfield. \"\n",[146,26902,26903],{"class":148,"line":976},[146,26904,26905],{"class":160},"            \"Camera rapidly pulls back to extreme wide shot.\"\n",[146,26907,26908],{"class":148,"line":988},[146,26909,1342],{"class":263},[146,26911,26912,26914],{"class":148,"line":993},[146,26913,26777],{"class":160},[146,26915,26099],{"class":263},[146,26917,26918,26920,26922],{"class":148,"line":5534},[146,26919,1347],{"class":160},[146,26921,437],{"class":263},[146,26923,26156],{"class":156},[146,26925,26926],{"class":148,"line":5543},[146,26927,22210],{"class":263},[146,26929,26930],{"class":148,"line":5549},[146,26931,764],{"class":263},[146,26933,26934],{"class":148,"line":5577},[146,26935,376],{"emptyLinePlaceholder":58},[146,26937,26938,26940,26943],{"class":148,"line":5608},[146,26939,526],{"class":259},[146,26941,26942],{"class":152}," submit_shot",[146,26944,26230],{"class":263},[146,26946,26947],{"class":148,"line":5628},[146,26948,26949],{"class":160},"    \"\"\"Submit a single shot for generation.\"\"\"\n",[146,26951,26952,26954,26956,26958,26960,26962,26964,26966,26969],{"class":148,"line":5634},[146,26953,6234],{"class":263},[146,26955,267],{"class":259},[146,26957,8194],{"class":263},[146,26959,26708],{"class":156},[146,26961,14937],{"class":263},[146,26963,5430],{"class":259},[146,26965,26247],{"class":263},[146,26967,26968],{"class":160},"\"env_images\"",[146,26970,764],{"class":263},[146,26972,26973,26975,26977],{"class":148,"line":5640},[146,26974,1294],{"class":263},[146,26976,267],{"class":259},[146,26978,428],{"class":263},[146,26980,26981,26983,26985,26987],{"class":148,"line":5645},[146,26982,1303],{"class":160},[146,26984,437],{"class":263},[146,26986,1308],{"class":160},[146,26988,452],{"class":263},[146,26990,26991,26993,26995,26997],{"class":148,"line":5658},[146,26992,1319],{"class":160},[146,26994,26277],{"class":263},[146,26996,5924],{"class":160},[146,26998,10852],{"class":263},[146,27000,27001,27003],{"class":148,"line":5664},[146,27002,2690],{"class":160},[146,27004,26288],{"class":263},[146,27006,27007,27009,27011,27013],{"class":148,"line":5691},[146,27008,1347],{"class":160},[146,27010,26277],{"class":263},[146,27012,5969],{"class":160},[146,27014,10852],{"class":263},[146,27016,27017,27019,27021,27023],{"class":148,"line":5731},[146,27018,1363],{"class":160},[146,27020,437],{"class":263},[146,27022,3714],{"class":160},[146,27024,452],{"class":263},[146,27026,27027,27029,27031,27033],{"class":148,"line":5750},[146,27028,1379],{"class":160},[146,27030,437],{"class":263},[146,27032,1384],{"class":160},[146,27034,452],{"class":263},[146,27036,27037,27039,27041],{"class":148,"line":5755},[146,27038,1395],{"class":160},[146,27040,437],{"class":263},[146,27042,3742],{"class":156},[146,27044,27045],{"class":148,"line":5760},[146,27046,1407],{"class":263},[146,27048,27049,27051,27053,27056,27058,27060,27062,27064,27066,27068,27070,27072,27074,27076,27078],{"class":148,"line":5765},[146,27050,1126],{"class":263},[146,27052,267],{"class":259},[146,27054,27055],{"class":263}," requests.post(",[146,27057,440],{"class":259},[146,27059,449],{"class":160},[146,27061,679],{"class":156},[146,27063,1444],{"class":160},[146,27065,400],{"class":263},[146,27067,17836],{"class":701},[146,27069,267],{"class":259},[146,27071,423],{"class":156},[146,27073,400],{"class":263},[146,27075,1857],{"class":701},[146,27077,267],{"class":259},[146,27079,27080],{"class":263},"payload)\n",[146,27082,27083,27085,27087,27089,27091],{"class":148,"line":7445},[146,27084,7221],{"class":263},[146,27086,267],{"class":259},[146,27088,20766],{"class":263},[146,27090,7696],{"class":160},[146,27092,764],{"class":263},[146,27094,27095,27097,27099,27102,27104,27106,27108,27110],{"class":148,"line":7451},[146,27096,1703],{"class":259},[146,27098,6038],{"class":263},[146,27100,27101],{"class":160},"\"shot_id\"",[146,27103,26277],{"class":263},[146,27105,27101],{"class":160},[146,27107,10760],{"class":263},[146,27109,7696],{"class":160},[146,27111,27112],{"class":263},": task_id}\n",[146,27114,27115],{"class":148,"line":7462},[146,27116,376],{"emptyLinePlaceholder":58},[146,27118,27119,27121,27124,27127,27129,27131],{"class":148,"line":7473},[146,27120,526],{"class":259},[146,27122,27123],{"class":152}," poll_until_done",[146,27125,27126],{"class":263},"(task_id, max_wait",[146,27128,267],{"class":259},[146,27130,11707],{"class":156},[146,27132,548],{"class":263},[146,27134,27135],{"class":148,"line":7484},[146,27136,27137],{"class":160},"    \"\"\"Block until task completes or fails.\"\"\"\n",[146,27139,27140,27142,27144,27146,27148,27150,27152,27154,27156,27158],{"class":148,"line":7489},[146,27141,23521],{"class":263},[146,27143,267],{"class":259},[146,27145,3361],{"class":259},[146,27147,449],{"class":160},[146,27149,679],{"class":156},[146,27151,682],{"class":160},[146,27153,685],{"class":156},[146,27155,688],{"class":263},[146,27157,691],{"class":156},[146,27159,950],{"class":160},[146,27161,27162,27164,27166],{"class":148,"line":7495},[146,27163,631],{"class":263},[146,27165,267],{"class":259},[146,27167,636],{"class":156},[146,27169,27170,27172,27174,27176],{"class":148,"line":7503},[146,27171,642],{"class":259},[146,27173,645],{"class":263},[146,27175,648],{"class":259},[146,27177,23562],{"class":263},[146,27179,27180,27182,27184,27186,27188,27190,27192],{"class":148,"line":7517},[146,27181,23583],{"class":263},[146,27183,267],{"class":259},[146,27185,1131],{"class":263},[146,27187,17836],{"class":701},[146,27189,267],{"class":259},[146,27191,423],{"class":156},[146,27193,27194],{"class":263},").json()\n",[146,27196,27197,27199,27201,27203,27205,27207,27209,27212,27214,27217],{"class":148,"line":7522},[146,27198,848],{"class":259},[146,27200,23596],{"class":263},[146,27202,761],{"class":160},[146,27204,14937],{"class":263},[146,27206,1180],{"class":259},[146,27208,104],{"class":263},[146,27210,27211],{"class":160},"\"completed\"",[146,27213,400],{"class":263},[146,27215,27216],{"class":160},"\"failed\"",[146,27218,548],{"class":263},[146,27220,27221,27223],{"class":148,"line":7536},[146,27222,866],{"class":259},[146,27224,23659],{"class":263},[146,27226,27227,27229,27231],{"class":148,"line":7550},[146,27228,15074],{"class":263},[146,27230,1352],{"class":156},[146,27232,406],{"class":263},[146,27234,27235,27237,27239],{"class":148,"line":7582},[146,27236,979],{"class":263},[146,27238,982],{"class":259},[146,27240,20966],{"class":156},[146,27242,27243,27245],{"class":148,"line":7594},[146,27244,1703],{"class":259},[146,27246,11958],{"class":156},[146,27248,27249],{"class":148,"line":7604},[146,27250,376],{"emptyLinePlaceholder":58},[146,27252,27253],{"class":148,"line":7609},[146,27254,27255],{"class":175},"# Submit all shots in parallel\n",[146,27257,27258,27260,27262],{"class":148,"line":7616},[146,27259,21910],{"class":263},[146,27261,267],{"class":259},[146,27263,5879],{"class":263},[146,27265,27266,27268,27270,27272,27275],{"class":148,"line":7638},[146,27267,8231],{"class":259},[146,27269,26396],{"class":263},[146,27271,1180],{"class":259},[146,27273,27274],{"class":156}," SHOT_LIST",[146,27276,860],{"class":263},[146,27278,27279,27281,27283],{"class":148,"line":7669},[146,27280,1618],{"class":263},[146,27282,267],{"class":259},[146,27284,27285],{"class":263}," submit_shot(shot)\n",[146,27287,27288],{"class":148,"line":7674},[146,27289,27290],{"class":263},"    results.append(result)\n",[146,27292,27293,27295,27297,27299,27301,27303,27305,27308,27310,27312,27314,27316,27318,27320,27322,27324,27326],{"class":148,"line":7680},[146,27294,1102],{"class":156},[146,27296,794],{"class":263},[146,27298,440],{"class":259},[146,27300,26412],{"class":160},[146,27302,685],{"class":156},[146,27304,11822],{"class":263},[146,27306,27307],{"class":160},"'shot_id'",[146,27309,1535],{"class":263},[146,27311,691],{"class":156},[146,27313,2251],{"class":160},[146,27315,685],{"class":156},[146,27317,11822],{"class":263},[146,27319,19895],{"class":160},[146,27321,1535],{"class":263},[146,27323,691],{"class":156},[146,27325,449],{"class":160},[146,27327,406],{"class":263},[146,27329,27330,27332,27335],{"class":148,"line":7705},[146,27331,19908],{"class":263},[146,27333,27334],{"class":156},"0.5",[146,27336,406],{"class":263},[146,27338,27339],{"class":148,"line":7710},[146,27340,376],{"emptyLinePlaceholder":58},[146,27342,27343],{"class":148,"line":7715},[146,27344,27345],{"class":175},"# Collect results in order\n",[146,27347,27348,27351,27353],{"class":148,"line":7738},[146,27349,27350],{"class":263},"final_videos ",[146,27352,267],{"class":259},[146,27354,5879],{"class":263},[146,27356,27357,27359,27361,27363],{"class":148,"line":7748},[146,27358,8231],{"class":259},[146,27360,21830],{"class":263},[146,27362,1180],{"class":259},[146,27364,7402],{"class":263},[146,27366,27367,27369,27371,27373,27375,27377,27380,27382,27385,27387,27389,27391,27393],{"class":148,"line":7754},[146,27368,1102],{"class":156},[146,27370,794],{"class":263},[146,27372,440],{"class":259},[146,27374,449],{"class":160},[146,27376,1670],{"class":156},[146,27378,27379],{"class":160},"Polling ",[146,27381,685],{"class":156},[146,27383,27384],{"class":263},"r[",[146,27386,27307],{"class":160},[146,27388,1535],{"class":263},[146,27390,691],{"class":156},[146,27392,1119],{"class":160},[146,27394,406],{"class":263},[146,27396,27397,27400,27402,27405,27407],{"class":148,"line":7772},[146,27398,27399],{"class":263},"    data ",[146,27401,267],{"class":259},[146,27403,27404],{"class":263}," poll_until_done(r[",[146,27406,7696],{"class":160},[146,27408,1629],{"class":263},[146,27410,27411,27413,27416,27419,27421,27423,27425,27427,27429],{"class":148,"line":7777},[146,27412,2508],{"class":259},[146,27414,27415],{"class":263}," data ",[146,27417,27418],{"class":259},"and",[146,27420,23596],{"class":263},[146,27422,761],{"class":160},[146,27424,14937],{"class":263},[146,27426,854],{"class":259},[146,27428,857],{"class":160},[146,27430,860],{"class":263},[146,27432,27433,27436,27438,27440,27442,27444,27446],{"class":148,"line":7782},[146,27434,27435],{"class":263},"        video_url ",[146,27437,267],{"class":259},[146,27439,23596],{"class":263},[146,27441,21546],{"class":160},[146,27443,1562],{"class":263},[146,27445,14959],{"class":160},[146,27447,764],{"class":263},[146,27449,27450,27453,27455,27458,27460,27462,27465],{"class":148,"line":7795},[146,27451,27452],{"class":263},"        final_videos.append({",[146,27454,27101],{"class":160},[146,27456,27457],{"class":263},": r[",[146,27459,27101],{"class":160},[146,27461,10760],{"class":263},[146,27463,27464],{"class":160},"\"url\"",[146,27466,27467],{"class":263},": video_url})\n",[146,27469,27470,27472,27474,27476,27479,27481,27483,27485,27487,27489,27491,27493,27495,27497,27499],{"class":148,"line":7809},[146,27471,791],{"class":156},[146,27473,794],{"class":263},[146,27475,440],{"class":259},[146,27477,27478],{"class":160},"\"  Done: ",[146,27480,685],{"class":156},[146,27482,27384],{"class":263},[146,27484,27307],{"class":160},[146,27486,1535],{"class":263},[146,27488,691],{"class":156},[146,27490,437],{"class":160},[146,27492,685],{"class":156},[146,27494,1678],{"class":263},[146,27496,691],{"class":156},[146,27498,449],{"class":160},[146,27500,406],{"class":263},[146,27502,27503,27505],{"class":148,"line":7836},[146,27504,2544],{"class":259},[146,27506,860],{"class":263},[146,27508,27509,27511,27513,27515,27518,27520,27522,27524,27526,27528,27531],{"class":148,"line":7850},[146,27510,791],{"class":156},[146,27512,794],{"class":263},[146,27514,440],{"class":259},[146,27516,27517],{"class":160},"\"  Failed: ",[146,27519,685],{"class":156},[146,27521,27384],{"class":263},[146,27523,27307],{"class":160},[146,27525,1535],{"class":263},[146,27527,691],{"class":156},[146,27529,27530],{"class":160},": generation failed\"",[146,27532,406],{"class":263},[146,27534,27535],{"class":148,"line":10372},[146,27536,376],{"emptyLinePlaceholder":58},[146,27538,27539],{"class":148,"line":10379},[146,27540,27541],{"class":175},"# Output the ordered shot list\n",[146,27543,27544,27546,27548,27550,27552,27555],{"class":148,"line":10425},[146,27545,6587],{"class":156},[146,27547,794],{"class":263},[146,27549,449],{"class":160},[146,27551,1670],{"class":156},[146,27553,27554],{"class":160},"=== Final Shot List ===\"",[146,27556,406],{"class":263},[146,27558,27559,27561,27564,27566],{"class":148,"line":10430},[146,27560,8231],{"class":259},[146,27562,27563],{"class":263}," v ",[146,27565,1180],{"class":259},[146,27567,27568],{"class":263}," final_videos:\n",[146,27570,27571,27573,27575,27577,27579,27581,27584,27586,27588,27590,27592,27594,27596,27599,27601,27603,27605],{"class":148,"line":10435},[146,27572,1102],{"class":156},[146,27574,794],{"class":263},[146,27576,440],{"class":259},[146,27578,449],{"class":160},[146,27580,685],{"class":156},[146,27582,27583],{"class":263},"v[",[146,27585,27307],{"class":160},[146,27587,1535],{"class":263},[146,27589,691],{"class":156},[146,27591,437],{"class":160},[146,27593,685],{"class":156},[146,27595,27583],{"class":263},[146,27597,27598],{"class":160},"'url'",[146,27600,1535],{"class":263},[146,27602,691],{"class":156},[146,27604,449],{"class":160},[146,27606,406],{"class":263},[11,27608,27609,27610,27612,27613,27615],{},"이 파이프라인은 정렬된 비디오 URL 목록을 생성하며, 이를 모든 비디오 편집기나 자동 연결 도구(FFmpeg, MoviePy 등)에 입력하여 최종 내러티브 시퀀스를 조합할 수 있습니다. 모든 요청이 동일한 ",[28,27611,26708],{},"를 ",[28,27614,2911],{},"으로 사용하므로 캐릭터가 모든 샷에서 일관성을 유지합니다.",[92,27617,27619],{"id":27618},"일관성-엣지-케이스-처리","일관성 엣지 케이스 처리",[11,27621,27622],{},"동일한 참조 이미지를 사용하더라도 샷 간에 미세한 차이가 나타날 수 있습니다 — 캐릭터의 의상 색상이 약간 변하거나, 초광각 샷에서 체형이 미세하게 변할 수 있습니다. 이러한 변화를 최소화하는 전략은 다음과 같습니다:",[11,27624,27625,27628],{},[23,27626,27627],{},"모든 프롬프트에서 캐릭터 세부 정보를 다시 언급하세요."," 캐릭터가 특정 의상을 입고 있다면 간략하게 언급하세요: \"@Image1 is the main character wearing a blue denim jacket.\" 이렇게 하면 참조 이미지의 시각적 앵커가 강화됩니다.",[11,27630,27631,27634],{},[23,27632,27633],{},"샷 간 극단적인 앵글 변경을 피하세요."," 정면 미디엄 샷 다음에 탑다운 초광각 샷이 오면 가장 큰 변화가 발생합니다. 점진적으로 전환하세요: 미디엄 샷 → 약간 넓은 샷 → 와이드 샷.",[11,27636,27637,27640,27641,2962,27643,27645],{},[23,27638,27639],{},"동일한 화질과 화면 비율을 사용하세요."," 샷 간에 ",[28,27642,1786],{},[28,27644,1794],{},"를 혼합하면 미묘한 렌더링 차이가 발생할 수 있습니다. 샷 목록 전체에서 모든 파라미터를 표준화하세요.",[45,27647],{},[48,27649,27651],{"id":27650},"이커머스-제품-영상-엔드투엔드-워크플로우","이커머스 제품 영상: 엔드투엔드 워크플로우",[11,27653,27654,27655,27658],{},"제품 사진 촬영은 비용이 많이 듭니다. 제품 ",[2621,27656,27657],{},"영상 촬영","은 더욱 비쌉니다 — 스튜디오, 턴테이블, 적절한 조명, 카메라 오퍼레이터, 편집 시간이 필요합니다. Seedance 2.0의 이미지-투-비디오 API는 이 파이프라인의 대부분을 단일 API 호출로 대체합니다.",[92,27660,27662],{"id":27661},"제품-영상의-과제","제품 영상의 과제",[11,27664,27665],{},"이커머스 플랫폼은 점점 더 영상 콘텐츠를 선호합니다. Amazon은 영상이 포함된 제품 목록이 더 높은 전환율을 보인다고 보고합니다. Instagram과 TikTok은 영상 우선 플랫폼입니다. 하지만 간단한 10초 제품 회전 영상 하나를 제작하는 데도 전통적으로 다음이 필요합니다:",[70,27667,27668,27671,27674,27677,27680],{},[73,27669,27670],{},"물리적 턴테이블 설치",[73,27672,27673],{},"적절한 조명 장비",[73,27675,27676],{},"영상 촬영 전문가 (또는 직접 세심하게 촬영)",[73,27678,27679],{},"편집 및 색보정",[73,27681,27682],{},"내보내기 및 업로드",[11,27684,27685],{},"Seedance 2.0을 사용하면 파이프라인은 다음과 같이 단순해집니다:",[70,27687,27688,27691,27694],{},[73,27689,27690],{},"제품 사진 촬영 (이미 가지고 있는 것)",[73,27692,27693],{},"API 호출 하나",[73,27695,27696],{},"영상 다운로드",[92,27698,27700],{"id":27699},"단일-제품-시계-광고","단일 제품: 시계 광고",[11,27702,27703],{},"단일 제품 이미지에서 제품 쇼케이스 영상을 생성하는 전체 워크플로우입니다:",[137,27705,27707],{"className":338,"code":27706,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Product Video: Luxury Watch ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. \"\n        \"The watch rotates slowly on a dark marble surface. \"\n        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n        \"Light reflections move across the polished surfaces as the watch turns. \"\n        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n        \"Premium product advertisement aesthetic.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/watch-product.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,27708,27709,27715,27721,27725,27733,27741,27749,27765,27773,27777,27781,27801,27823,27831,27841,27857,27865,27877,27889,27917,27923,27935,27963,27969,27997,28001,28009,28015,28019,28024,28032,28042,28048,28053,28058,28063,28068,28073,28078,28082,28088,28093,28097,28107,28117,28127,28135,28139,28143,28151,28163,28173,28181,28185,28193,28217,28221],{"__ignoreMap":142},[146,27710,27711,27713],{"class":148,"line":149},[146,27712,347],{"class":259},[146,27714,329],{"class":263},[146,27716,27717,27719],{"class":148,"line":167},[146,27718,347],{"class":259},[146,27720,356],{"class":263},[146,27722,27723],{"class":148,"line":179},[146,27724,376],{"emptyLinePlaceholder":58},[146,27726,27727,27729,27731],{"class":148,"line":188},[146,27728,388],{"class":156},[146,27730,391],{"class":259},[146,27732,17607],{"class":160},[146,27734,27735,27737,27739],{"class":148,"line":373},[146,27736,412],{"class":156},[146,27738,391],{"class":259},[146,27740,417],{"class":160},[146,27742,27743,27745,27747],{"class":148,"line":379},[146,27744,423],{"class":156},[146,27746,391],{"class":259},[146,27748,428],{"class":263},[146,27750,27751,27753,27755,27757,27759,27761,27763],{"class":148,"line":385},[146,27752,434],{"class":160},[146,27754,437],{"class":263},[146,27756,440],{"class":259},[146,27758,443],{"class":160},[146,27760,446],{"class":156},[146,27762,449],{"class":160},[146,27764,452],{"class":263},[146,27766,27767,27769,27771],{"class":148,"line":409},[146,27768,458],{"class":160},[146,27770,437],{"class":263},[146,27772,463],{"class":160},[146,27774,27775],{"class":148,"line":420},[146,27776,469],{"class":263},[146,27778,27779],{"class":148,"line":431},[146,27780,376],{"emptyLinePlaceholder":58},[146,27782,27783,27785,27787,27789,27791,27793,27795,27797,27799],{"class":148,"line":455},[146,27784,526],{"class":259},[146,27786,529],{"class":152},[146,27788,11696],{"class":263},[146,27790,267],{"class":259},[146,27792,1352],{"class":156},[146,27794,23505],{"class":263},[146,27796,267],{"class":259},[146,27798,11707],{"class":156},[146,27800,548],{"class":263},[146,27802,27803,27805,27807,27809,27811,27813,27815,27817,27819,27821],{"class":148,"line":466},[146,27804,23521],{"class":263},[146,27806,267],{"class":259},[146,27808,3361],{"class":259},[146,27810,449],{"class":160},[146,27812,679],{"class":156},[146,27814,682],{"class":160},[146,27816,685],{"class":156},[146,27818,688],{"class":263},[146,27820,691],{"class":156},[146,27822,950],{"class":160},[146,27824,27825,27827,27829],{"class":148,"line":600},[146,27826,631],{"class":263},[146,27828,267],{"class":259},[146,27830,636],{"class":156},[146,27832,27833,27835,27837,27839],{"class":148,"line":605},[146,27834,642],{"class":259},[146,27836,645],{"class":263},[146,27838,648],{"class":259},[146,27840,23562],{"class":263},[146,27842,27843,27845,27847,27849,27851,27853,27855],{"class":148,"line":611},[146,27844,6932],{"class":263},[146,27846,267],{"class":259},[146,27848,1131],{"class":263},[146,27850,17836],{"class":701},[146,27852,267],{"class":259},[146,27854,423],{"class":156},[146,27856,406],{"class":263},[146,27858,27859,27861,27863],{"class":148,"line":617},[146,27860,23583],{"class":263},[146,27862,267],{"class":259},[146,27864,11777],{"class":263},[146,27866,27867,27869,27871,27873,27875],{"class":148,"line":623},[146,27868,753],{"class":263},[146,27870,267],{"class":259},[146,27872,23596],{"class":263},[146,27874,761],{"class":160},[146,27876,764],{"class":263},[146,27878,27879,27881,27883,27885,27887],{"class":148,"line":628},[146,27880,848],{"class":259},[146,27882,851],{"class":263},[146,27884,854],{"class":259},[146,27886,857],{"class":160},[146,27888,860],{"class":263},[146,27890,27891,27893,27895,27897,27899,27901,27903,27905,27907,27909,27911,27913,27915],{"class":148,"line":639},[146,27892,5580],{"class":156},[146,27894,794],{"class":263},[146,27896,440],{"class":259},[146,27898,11817],{"class":160},[146,27900,685],{"class":156},[146,27902,24046],{"class":263},[146,27904,17898],{"class":160},[146,27906,1562],{"class":263},[146,27908,17903],{"class":160},[146,27910,1535],{"class":263},[146,27912,691],{"class":156},[146,27914,449],{"class":160},[146,27916,406],{"class":263},[146,27918,27919,27921],{"class":148,"line":654},[146,27920,866],{"class":259},[146,27922,23659],{"class":263},[146,27924,27925,27927,27929,27931,27933],{"class":148,"line":660},[146,27926,875],{"class":259},[146,27928,851],{"class":263},[146,27930,854],{"class":259},[146,27932,882],{"class":160},[146,27934,860],{"class":263},[146,27936,27937,27939,27941,27943,27945,27947,27949,27951,27953,27955,27957,27959,27961],{"class":148,"line":671},[146,27938,5580],{"class":156},[146,27940,794],{"class":263},[146,27942,440],{"class":259},[146,27944,24089],{"class":160},[146,27946,685],{"class":156},[146,27948,23686],{"class":263},[146,27950,11874],{"class":160},[146,27952,400],{"class":263},[146,27954,943],{"class":160},[146,27956,118],{"class":263},[146,27958,691],{"class":156},[146,27960,449],{"class":160},[146,27962,406],{"class":263},[146,27964,27965,27967],{"class":148,"line":698},[146,27966,866],{"class":259},[146,27968,23659],{"class":263},[146,27970,27971,27973,27975,27977,27979,27981,27983,27985,27987,27989,27991,27993,27995],{"class":148,"line":710},[146,27972,791],{"class":156},[146,27974,794],{"class":263},[146,27976,440],{"class":259},[146,27978,11903],{"class":160},[146,27980,685],{"class":156},[146,27982,814],{"class":263},[146,27984,691],{"class":156},[146,27986,104],{"class":160},[146,27988,685],{"class":156},[146,27990,804],{"class":263},[146,27992,691],{"class":156},[146,27994,10730],{"class":160},[146,27996,406],{"class":263},[146,27998,27999],{"class":148,"line":716},[146,28000,11927],{"class":263},[146,28002,28003,28005,28007],{"class":148,"line":722},[146,28004,979],{"class":263},[146,28006,982],{"class":259},[146,28008,11936],{"class":263},[146,28010,28011,28013],{"class":148,"line":728},[146,28012,1703],{"class":259},[146,28014,11958],{"class":156},[146,28016,28017],{"class":148,"line":739},[146,28018,376],{"emptyLinePlaceholder":58},[146,28020,28021],{"class":148,"line":744},[146,28022,28023],{"class":175},"# --- Product Video: Luxury Watch ---\n",[146,28025,28026,28028,28030],{"class":148,"line":750},[146,28027,3665],{"class":263},[146,28029,267],{"class":259},[146,28031,428],{"class":263},[146,28033,28034,28036,28038,28040],{"class":148,"line":767},[146,28035,3674],{"class":160},[146,28037,437],{"class":263},[146,28039,1308],{"class":160},[146,28041,452],{"class":263},[146,28043,28044,28046],{"class":148,"line":788},[146,28045,3685],{"class":160},[146,28047,1322],{"class":263},[146,28049,28050],{"class":148,"line":834},[146,28051,28052],{"class":160},"        \"@Image1 is a luxury wristwatch. \"\n",[146,28054,28055],{"class":148,"line":839},[146,28056,28057],{"class":160},"        \"The watch rotates slowly on a dark marble surface. \"\n",[146,28059,28060],{"class":148,"line":845},[146,28061,28062],{"class":160},"        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n",[146,28064,28065],{"class":148,"line":863},[146,28066,28067],{"class":160},"        \"Light reflections move across the polished surfaces as the watch turns. \"\n",[146,28069,28070],{"class":148,"line":872},[146,28071,28072],{"class":160},"        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n",[146,28074,28075],{"class":148,"line":887},[146,28076,28077],{"class":160},"        \"Premium product advertisement aesthetic.\"\n",[146,28079,28080],{"class":148,"line":903},[146,28081,3808],{"class":263},[146,28083,28084,28086],{"class":148,"line":915},[146,28085,15392],{"class":160},[146,28087,2693],{"class":263},[146,28089,28090],{"class":148,"line":953},[146,28091,28092],{"class":160},"        \"https://example.com/watch-product.jpg\"\n",[146,28094,28095],{"class":148,"line":959},[146,28096,16375],{"class":263},[146,28098,28099,28101,28103,28105],{"class":148,"line":964},[146,28100,3697],{"class":160},[146,28102,437],{"class":263},[146,28104,3702],{"class":156},[146,28106,452],{"class":263},[146,28108,28109,28111,28113,28115],{"class":148,"line":970},[146,28110,3709],{"class":160},[146,28112,437],{"class":263},[146,28114,3714],{"class":160},[146,28116,452],{"class":263},[146,28118,28119,28121,28123,28125],{"class":148,"line":976},[146,28120,3721],{"class":160},[146,28122,437],{"class":263},[146,28124,1384],{"class":160},[146,28126,452],{"class":263},[146,28128,28129,28131,28133],{"class":148,"line":988},[146,28130,3737],{"class":160},[146,28132,437],{"class":263},[146,28134,15438],{"class":156},[146,28136,28137],{"class":148,"line":993},[146,28138,469],{"class":263},[146,28140,28141],{"class":148,"line":5534},[146,28142,376],{"emptyLinePlaceholder":58},[146,28144,28145,28147,28149],{"class":148,"line":5543},[146,28146,24282],{"class":263},[146,28148,267],{"class":259},[146,28150,1432],{"class":263},[146,28152,28153,28155,28157,28159,28161],{"class":148,"line":5549},[146,28154,6541],{"class":259},[146,28156,449],{"class":160},[146,28158,679],{"class":156},[146,28160,1444],{"class":160},[146,28162,452],{"class":263},[146,28164,28165,28167,28169,28171],{"class":148,"line":5577},[146,28166,6554],{"class":701},[146,28168,267],{"class":259},[146,28170,423],{"class":156},[146,28172,452],{"class":263},[146,28174,28175,28177,28179],{"class":148,"line":5608},[146,28176,6565],{"class":701},[146,28178,267],{"class":259},[146,28180,2790],{"class":263},[146,28182,28183],{"class":148,"line":5628},[146,28184,406],{"class":263},[146,28186,28187,28189,28191],{"class":148,"line":5634},[146,28188,12238],{"class":263},[146,28190,267],{"class":259},[146,28192,11777],{"class":263},[146,28194,28195,28197,28199,28201,28203,28205,28207,28209,28211,28213,28215],{"class":148,"line":5640},[146,28196,6587],{"class":156},[146,28198,794],{"class":263},[146,28200,440],{"class":259},[146,28202,24339],{"class":160},[146,28204,685],{"class":156},[146,28206,11822],{"class":263},[146,28208,19895],{"class":160},[146,28210,1535],{"class":263},[146,28212,691],{"class":156},[146,28214,449],{"class":160},[146,28216,406],{"class":263},[146,28218,28219],{"class":148,"line":5645},[146,28220,376],{"emptyLinePlaceholder":58},[146,28222,28223,28225,28227,28229,28231],{"class":148,"line":5658},[146,28224,24367],{"class":263},[146,28226,267],{"class":259},[146,28228,24372],{"class":263},[146,28230,7696],{"class":160},[146,28232,1629],{"class":263},[92,28234,28236],{"id":28235},"데모-시계-제품-영상","데모: 시계 제품 영상",[56,28238,60,28239],{"controls":58,"playsInline":58,"style":59},[62,28240],{"src":18168,"type":65},[11,28242,28243,2424,28245],{},[23,28244,24399],{},[2621,28246,28247],{},"\"@Image1 is a luxury wristwatch. The watch rotates slowly under dramatic studio lighting on a dark reflective surface. Light catches the polished metal case and sapphire crystal. Slow cinematic rotation. Premium advertisement quality.\"",[11,28249,28250],{},"단일 제품 사진에서 API가 스튜디오급 조명의 회전 제품 쇼케이스를 생성합니다. 시계의 디자인 디테일 — 다이얼 마킹, 브레이슬릿 링크, 케이스 형태 — 모두 참조 이미지에서 가져옵니다.",[92,28252,28254],{"id":28253},"다색-제품-변형","다색 제품 변형",[11,28256,28257,28258,28260],{},"많은 제품이 여러 컬러웨이로 출시됩니다. 각 변형을 별도로 촬영하는 대신 ",[28,28259,23126],{}," 시스템을 사용하여 모든 변형을 단일 영상에서 선보일 수 있습니다:",[137,28262,28264],{"className":338,"code":28263,"language":340,"meta":142,"style":142},"# --- Multi-Color Product: Headphones ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four different colors \"\n        \"arranged on a clean surface. The camera slowly pans across all four \"\n        \"variants. Each headphone catches the studio light differently. \"\n        \"Smooth dolly movement from left to right. \"\n        \"Clean white background with subtle shadows. \"\n        \"Product catalog video style.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/headphones-all-colors.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,28265,28266,28271,28279,28289,28295,28300,28305,28310,28315,28320,28325,28329,28335,28340,28344,28354,28364,28372,28376,28380,28388,28400,28410,28418,28422,28430,28454],{"__ignoreMap":142},[146,28267,28268],{"class":148,"line":149},[146,28269,28270],{"class":175},"# --- Multi-Color Product: Headphones ---\n",[146,28272,28273,28275,28277],{"class":148,"line":167},[146,28274,3665],{"class":263},[146,28276,267],{"class":259},[146,28278,428],{"class":263},[146,28280,28281,28283,28285,28287],{"class":148,"line":179},[146,28282,3674],{"class":160},[146,28284,437],{"class":263},[146,28286,1308],{"class":160},[146,28288,452],{"class":263},[146,28290,28291,28293],{"class":148,"line":188},[146,28292,3685],{"class":160},[146,28294,1322],{"class":263},[146,28296,28297],{"class":148,"line":373},[146,28298,28299],{"class":160},"        \"@Image1 shows premium over-ear headphones in four different colors \"\n",[146,28301,28302],{"class":148,"line":379},[146,28303,28304],{"class":160},"        \"arranged on a clean surface. The camera slowly pans across all four \"\n",[146,28306,28307],{"class":148,"line":385},[146,28308,28309],{"class":160},"        \"variants. Each headphone catches the studio light differently. \"\n",[146,28311,28312],{"class":148,"line":409},[146,28313,28314],{"class":160},"        \"Smooth dolly movement from left to right. \"\n",[146,28316,28317],{"class":148,"line":420},[146,28318,28319],{"class":160},"        \"Clean white background with subtle shadows. \"\n",[146,28321,28322],{"class":148,"line":431},[146,28323,28324],{"class":160},"        \"Product catalog video style.\"\n",[146,28326,28327],{"class":148,"line":455},[146,28328,3808],{"class":263},[146,28330,28331,28333],{"class":148,"line":466},[146,28332,15392],{"class":160},[146,28334,2693],{"class":263},[146,28336,28337],{"class":148,"line":600},[146,28338,28339],{"class":160},"        \"https://example.com/headphones-all-colors.jpg\"\n",[146,28341,28342],{"class":148,"line":605},[146,28343,16375],{"class":263},[146,28345,28346,28348,28350,28352],{"class":148,"line":611},[146,28347,3697],{"class":160},[146,28349,437],{"class":263},[146,28351,537],{"class":156},[146,28353,452],{"class":263},[146,28355,28356,28358,28360,28362],{"class":148,"line":617},[146,28357,3709],{"class":160},[146,28359,437],{"class":263},[146,28361,3714],{"class":160},[146,28363,452],{"class":263},[146,28365,28366,28368,28370],{"class":148,"line":623},[146,28367,3721],{"class":160},[146,28369,437],{"class":263},[146,28371,2732],{"class":160},[146,28373,28374],{"class":148,"line":628},[146,28375,469],{"class":263},[146,28377,28378],{"class":148,"line":639},[146,28379,376],{"emptyLinePlaceholder":58},[146,28381,28382,28384,28386],{"class":148,"line":654},[146,28383,24282],{"class":263},[146,28385,267],{"class":259},[146,28387,1432],{"class":263},[146,28389,28390,28392,28394,28396,28398],{"class":148,"line":660},[146,28391,6541],{"class":259},[146,28393,449],{"class":160},[146,28395,679],{"class":156},[146,28397,1444],{"class":160},[146,28399,452],{"class":263},[146,28401,28402,28404,28406,28408],{"class":148,"line":671},[146,28403,6554],{"class":701},[146,28405,267],{"class":259},[146,28407,423],{"class":156},[146,28409,452],{"class":263},[146,28411,28412,28414,28416],{"class":148,"line":698},[146,28413,6565],{"class":701},[146,28415,267],{"class":259},[146,28417,2790],{"class":263},[146,28419,28420],{"class":148,"line":710},[146,28421,406],{"class":263},[146,28423,28424,28426,28428],{"class":148,"line":716},[146,28425,12238],{"class":263},[146,28427,267],{"class":259},[146,28429,11777],{"class":263},[146,28431,28432,28434,28436,28438,28440,28442,28444,28446,28448,28450,28452],{"class":148,"line":722},[146,28433,6587],{"class":156},[146,28435,794],{"class":263},[146,28437,440],{"class":259},[146,28439,24339],{"class":160},[146,28441,685],{"class":156},[146,28443,11822],{"class":263},[146,28445,19895],{"class":160},[146,28447,1535],{"class":263},[146,28449,691],{"class":156},[146,28451,449],{"class":160},[146,28453,406],{"class":263},[146,28455,28456,28458,28460,28462,28464],{"class":148,"line":728},[146,28457,24367],{"class":263},[146,28459,267],{"class":259},[146,28461,24372],{"class":263},[146,28463,7696],{"class":160},[146,28465,1629],{"class":263},[92,28467,28469],{"id":28468},"데모-헤드폰-컬러-변형","데모: 헤드폰 컬러 변형",[56,28471,60,28472],{"controls":58,"playsInline":58,"style":59},[62,28473],{"src":18435,"type":65},[11,28475,28476,2424,28478],{},[23,28477,24399],{},[2621,28479,28480],{},"\"@Image1 shows over-ear headphones in four color variants. The camera pans smoothly across each variant under clean studio lighting. Soft reflections on the ear cups. Minimal white background. Product showcase cinematography.\"",[11,28482,28483],{},"단일 제품 라인업 사진이 부드러운 패닝 쇼케이스 영상이 됩니다. 각 컬러가 골고루 비춰지며, 스튜디오 조명 미학이 전문적인 제품 영상 촬영과 일치합니다.",[92,28485,28487],{"id":28486},"제품-카탈로그용-일괄-생성","제품 카탈로그용 일괄 생성",[11,28489,28490],{},"수십 또는 수백 개의 제품이 있다면 생성 로직을 일괄 처리기로 래핑하세요:",[137,28492,28494],{"className":338,"code":28493,"language":340,"meta":142,"style":142},"import csv\nimport time\nimport requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_product_video(product_name, image_url, style=\"premium\"):\n    \"\"\"Generate a product video from a single product image.\"\"\"\n    style_prompts = {\n        \"premium\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product rotates slowly under dramatic studio lighting \"\n            \"on a dark reflective surface. Cinematic close-up. \"\n            \"Light reveals surface details and textures. \"\n            \"Premium advertisement quality.\"\n        ),\n        \"lifestyle\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product is shown in a lifestyle setting — \"\n            \"a modern living space with natural light. \"\n            \"Camera slowly pushes in to reveal product details. \"\n            \"Warm, inviting atmosphere.\"\n        ),\n        \"minimal\": (\n            f\"@Image1 is a {product_name}. \"\n            \"Clean white background. The product rotates 360 degrees. \"\n            \"Even, shadowless lighting. E-commerce product spin.\"\n        ),\n    }\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": style_prompts[style],\n        \"image_urls\": [image_url],\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"1:1\"\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    data = resp.json()\n    return data[\"task_id\"]\n\n\n# Example: process a CSV product catalog\n# CSV format: product_name, image_url, style\nproducts = [\n    (\"Wireless Earbuds\", \"https://example.com/earbuds.jpg\", \"premium\"),\n    (\"Leather Wallet\", \"https://example.com/wallet.jpg\", \"lifestyle\"),\n    (\"Running Shoes\", \"https://example.com/shoes.jpg\", \"minimal\"),\n]\n\ntasks = []\nfor name, url, style in products:\n    task_id = generate_product_video(name, url, style)\n    tasks.append((name, task_id))\n    print(f\"Submitted: {name} → {task_id}\")\n    time.sleep(1)  # Rate limiting courtesy\n\nprint(f\"\\nSubmitted {len(tasks)} product videos\")\nprint(\"Poll each task_id to retrieve the completed video URLs\")\n",[28,28495,28496,28502,28508,28514,28518,28526,28534,28542,28558,28566,28570,28574,28591,28596,28605,28612,28629,28634,28639,28644,28649,28653,28660,28674,28679,28684,28689,28694,28698,28705,28719,28724,28729,28733,28737,28741,28749,28759,28766,28772,28782,28792,28801,28805,28809,28817,28829,28839,28847,28851,28859,28869,28873,28877,28882,28887,28896,28916,28935,28954,28958,28962,28970,28982,28991,28996,29025,29036,29040,29067],{"__ignoreMap":142},[146,28497,28498,28500],{"class":148,"line":149},[146,28499,347],{"class":259},[146,28501,20118],{"class":263},[146,28503,28504,28506],{"class":148,"line":167},[146,28505,347],{"class":259},[146,28507,356],{"class":263},[146,28509,28510,28512],{"class":148,"line":179},[146,28511,347],{"class":259},[146,28513,329],{"class":263},[146,28515,28516],{"class":148,"line":188},[146,28517,376],{"emptyLinePlaceholder":58},[146,28519,28520,28522,28524],{"class":148,"line":373},[146,28521,388],{"class":156},[146,28523,391],{"class":259},[146,28525,17607],{"class":160},[146,28527,28528,28530,28532],{"class":148,"line":379},[146,28529,412],{"class":156},[146,28531,391],{"class":259},[146,28533,417],{"class":160},[146,28535,28536,28538,28540],{"class":148,"line":385},[146,28537,423],{"class":156},[146,28539,391],{"class":259},[146,28541,428],{"class":263},[146,28543,28544,28546,28548,28550,28552,28554,28556],{"class":148,"line":409},[146,28545,434],{"class":160},[146,28547,437],{"class":263},[146,28549,440],{"class":259},[146,28551,443],{"class":160},[146,28553,446],{"class":156},[146,28555,449],{"class":160},[146,28557,452],{"class":263},[146,28559,28560,28562,28564],{"class":148,"line":420},[146,28561,458],{"class":160},[146,28563,437],{"class":263},[146,28565,463],{"class":160},[146,28567,28568],{"class":148,"line":431},[146,28569,469],{"class":263},[146,28571,28572],{"class":148,"line":455},[146,28573,376],{"emptyLinePlaceholder":58},[146,28575,28576,28578,28581,28584,28586,28589],{"class":148,"line":466},[146,28577,526],{"class":259},[146,28579,28580],{"class":152}," generate_product_video",[146,28582,28583],{"class":263},"(product_name, image_url, style",[146,28585,267],{"class":259},[146,28587,28588],{"class":160},"\"premium\"",[146,28590,548],{"class":263},[146,28592,28593],{"class":148,"line":600},[146,28594,28595],{"class":160},"    \"\"\"Generate a product video from a single product image.\"\"\"\n",[146,28597,28598,28601,28603],{"class":148,"line":605},[146,28599,28600],{"class":263},"    style_prompts ",[146,28602,267],{"class":259},[146,28604,428],{"class":263},[146,28606,28607,28610],{"class":148,"line":611},[146,28608,28609],{"class":160},"        \"premium\"",[146,28611,1322],{"class":263},[146,28613,28614,28616,28619,28621,28624,28626],{"class":148,"line":617},[146,28615,674],{"class":259},[146,28617,28618],{"class":160},"\"@Image1 is a ",[146,28620,685],{"class":156},[146,28622,28623],{"class":263},"product_name",[146,28625,691],{"class":156},[146,28627,28628],{"class":160},". \"\n",[146,28630,28631],{"class":148,"line":623},[146,28632,28633],{"class":160},"            \"The product rotates slowly under dramatic studio lighting \"\n",[146,28635,28636],{"class":148,"line":628},[146,28637,28638],{"class":160},"            \"on a dark reflective surface. Cinematic close-up. \"\n",[146,28640,28641],{"class":148,"line":639},[146,28642,28643],{"class":160},"            \"Light reveals surface details and textures. \"\n",[146,28645,28646],{"class":148,"line":654},[146,28647,28648],{"class":160},"            \"Premium advertisement quality.\"\n",[146,28650,28651],{"class":148,"line":660},[146,28652,1342],{"class":263},[146,28654,28655,28658],{"class":148,"line":671},[146,28656,28657],{"class":160},"        \"lifestyle\"",[146,28659,1322],{"class":263},[146,28661,28662,28664,28666,28668,28670,28672],{"class":148,"line":698},[146,28663,674],{"class":259},[146,28665,28618],{"class":160},[146,28667,685],{"class":156},[146,28669,28623],{"class":263},[146,28671,691],{"class":156},[146,28673,28628],{"class":160},[146,28675,28676],{"class":148,"line":710},[146,28677,28678],{"class":160},"            \"The product is shown in a lifestyle setting — \"\n",[146,28680,28681],{"class":148,"line":716},[146,28682,28683],{"class":160},"            \"a modern living space with natural light. \"\n",[146,28685,28686],{"class":148,"line":722},[146,28687,28688],{"class":160},"            \"Camera slowly pushes in to reveal product details. \"\n",[146,28690,28691],{"class":148,"line":728},[146,28692,28693],{"class":160},"            \"Warm, inviting atmosphere.\"\n",[146,28695,28696],{"class":148,"line":739},[146,28697,1342],{"class":263},[146,28699,28700,28703],{"class":148,"line":744},[146,28701,28702],{"class":160},"        \"minimal\"",[146,28704,1322],{"class":263},[146,28706,28707,28709,28711,28713,28715,28717],{"class":148,"line":750},[146,28708,674],{"class":259},[146,28710,28618],{"class":160},[146,28712,685],{"class":156},[146,28714,28623],{"class":263},[146,28716,691],{"class":156},[146,28718,28628],{"class":160},[146,28720,28721],{"class":148,"line":767},[146,28722,28723],{"class":160},"            \"Clean white background. The product rotates 360 degrees. \"\n",[146,28725,28726],{"class":148,"line":788},[146,28727,28728],{"class":160},"            \"Even, shadowless lighting. E-commerce product spin.\"\n",[146,28730,28731],{"class":148,"line":834},[146,28732,1342],{"class":263},[146,28734,28735],{"class":148,"line":839},[146,28736,1407],{"class":263},[146,28738,28739],{"class":148,"line":845},[146,28740,376],{"emptyLinePlaceholder":58},[146,28742,28743,28745,28747],{"class":148,"line":863},[146,28744,1294],{"class":263},[146,28746,267],{"class":259},[146,28748,428],{"class":263},[146,28750,28751,28753,28755,28757],{"class":148,"line":872},[146,28752,1303],{"class":160},[146,28754,437],{"class":263},[146,28756,1308],{"class":160},[146,28758,452],{"class":263},[146,28760,28761,28763],{"class":148,"line":887},[146,28762,1319],{"class":160},[146,28764,28765],{"class":263},": style_prompts[style],\n",[146,28767,28768,28770],{"class":148,"line":903},[146,28769,2690],{"class":160},[146,28771,20664],{"class":263},[146,28773,28774,28776,28778,28780],{"class":148,"line":915},[146,28775,1347],{"class":160},[146,28777,437],{"class":263},[146,28779,3702],{"class":156},[146,28781,452],{"class":263},[146,28783,28784,28786,28788,28790],{"class":148,"line":953},[146,28785,1363],{"class":160},[146,28787,437],{"class":263},[146,28789,3714],{"class":160},[146,28791,452],{"class":263},[146,28793,28794,28796,28798],{"class":148,"line":959},[146,28795,1379],{"class":160},[146,28797,437],{"class":263},[146,28799,28800],{"class":160},"\"1:1\"\n",[146,28802,28803],{"class":148,"line":964},[146,28804,1407],{"class":263},[146,28806,28807],{"class":148,"line":970},[146,28808,376],{"emptyLinePlaceholder":58},[146,28810,28811,28813,28815],{"class":148,"line":976},[146,28812,1126],{"class":263},[146,28814,267],{"class":259},[146,28816,1432],{"class":263},[146,28818,28819,28821,28823,28825,28827],{"class":148,"line":988},[146,28820,1437],{"class":259},[146,28822,449],{"class":160},[146,28824,679],{"class":156},[146,28826,1444],{"class":160},[146,28828,452],{"class":263},[146,28830,28831,28833,28835,28837],{"class":148,"line":993},[146,28832,1455],{"class":701},[146,28834,267],{"class":259},[146,28836,423],{"class":156},[146,28838,452],{"class":263},[146,28840,28841,28843,28845],{"class":148,"line":5534},[146,28842,1470],{"class":701},[146,28844,267],{"class":259},[146,28846,2790],{"class":263},[146,28848,28849],{"class":148,"line":5543},[146,28850,1483],{"class":263},[146,28852,28853,28855,28857],{"class":148,"line":5549},[146,28854,27399],{"class":263},[146,28856,267],{"class":259},[146,28858,11777],{"class":263},[146,28860,28861,28863,28865,28867],{"class":148,"line":5577},[146,28862,1703],{"class":259},[146,28864,23596],{"class":263},[146,28866,7696],{"class":160},[146,28868,764],{"class":263},[146,28870,28871],{"class":148,"line":5608},[146,28872,376],{"emptyLinePlaceholder":58},[146,28874,28875],{"class":148,"line":5628},[146,28876,376],{"emptyLinePlaceholder":58},[146,28878,28879],{"class":148,"line":5634},[146,28880,28881],{"class":175},"# Example: process a CSV product catalog\n",[146,28883,28884],{"class":148,"line":5640},[146,28885,28886],{"class":175},"# CSV format: product_name, image_url, style\n",[146,28888,28889,28892,28894],{"class":148,"line":5645},[146,28890,28891],{"class":263},"products ",[146,28893,267],{"class":259},[146,28895,8868],{"class":263},[146,28897,28898,28901,28904,28906,28909,28911,28913],{"class":148,"line":5658},[146,28899,28900],{"class":263},"    (",[146,28902,28903],{"class":160},"\"Wireless Earbuds\"",[146,28905,400],{"class":263},[146,28907,28908],{"class":160},"\"https://example.com/earbuds.jpg\"",[146,28910,400],{"class":263},[146,28912,28588],{"class":160},[146,28914,28915],{"class":263},"),\n",[146,28917,28918,28920,28923,28925,28928,28930,28933],{"class":148,"line":5664},[146,28919,28900],{"class":263},[146,28921,28922],{"class":160},"\"Leather Wallet\"",[146,28924,400],{"class":263},[146,28926,28927],{"class":160},"\"https://example.com/wallet.jpg\"",[146,28929,400],{"class":263},[146,28931,28932],{"class":160},"\"lifestyle\"",[146,28934,28915],{"class":263},[146,28936,28937,28939,28942,28944,28947,28949,28952],{"class":148,"line":5691},[146,28938,28900],{"class":263},[146,28940,28941],{"class":160},"\"Running Shoes\"",[146,28943,400],{"class":263},[146,28945,28946],{"class":160},"\"https://example.com/shoes.jpg\"",[146,28948,400],{"class":263},[146,28950,28951],{"class":160},"\"minimal\"",[146,28953,28915],{"class":263},[146,28955,28956],{"class":148,"line":5731},[146,28957,764],{"class":263},[146,28959,28960],{"class":148,"line":5750},[146,28961,376],{"emptyLinePlaceholder":58},[146,28963,28964,28966,28968],{"class":148,"line":5755},[146,28965,19730],{"class":263},[146,28967,267],{"class":259},[146,28969,5879],{"class":263},[146,28971,28972,28974,28977,28979],{"class":148,"line":5760},[146,28973,8231],{"class":259},[146,28975,28976],{"class":263}," name, url, style ",[146,28978,1180],{"class":259},[146,28980,28981],{"class":263}," products:\n",[146,28983,28984,28986,28988],{"class":148,"line":5765},[146,28985,7221],{"class":263},[146,28987,267],{"class":259},[146,28989,28990],{"class":263}," generate_product_video(name, url, style)\n",[146,28992,28993],{"class":148,"line":7445},[146,28994,28995],{"class":263},"    tasks.append((name, task_id))\n",[146,28997,28998,29000,29002,29004,29007,29009,29011,29013,29015,29017,29019,29021,29023],{"class":148,"line":7451},[146,28999,1102],{"class":156},[146,29001,794],{"class":263},[146,29003,440],{"class":259},[146,29005,29006],{"class":160},"\"Submitted: ",[146,29008,685],{"class":156},[146,29010,20674],{"class":263},[146,29012,691],{"class":156},[146,29014,2251],{"class":160},[146,29016,685],{"class":156},[146,29018,688],{"class":263},[146,29020,691],{"class":156},[146,29022,449],{"class":160},[146,29024,406],{"class":263},[146,29026,29027,29029,29031,29033],{"class":148,"line":7462},[146,29028,19908],{"class":263},[146,29030,5440],{"class":156},[146,29032,19913],{"class":263},[146,29034,29035],{"class":175},"# Rate limiting courtesy\n",[146,29037,29038],{"class":148,"line":7473},[146,29039,376],{"emptyLinePlaceholder":58},[146,29041,29042,29044,29046,29048,29050,29052,29055,29057,29060,29062,29065],{"class":148,"line":7484},[146,29043,6587],{"class":156},[146,29045,794],{"class":263},[146,29047,440],{"class":259},[146,29049,449],{"class":160},[146,29051,1670],{"class":156},[146,29053,29054],{"class":160},"Submitted ",[146,29056,6273],{"class":156},[146,29058,29059],{"class":263},"(tasks)",[146,29061,691],{"class":156},[146,29063,29064],{"class":160}," product videos\"",[146,29066,406],{"class":263},[146,29068,29069,29071,29073,29076],{"class":148,"line":7489},[146,29070,6587],{"class":156},[146,29072,794],{"class":263},[146,29074,29075],{"class":160},"\"Poll each task_id to retrieve the completed video URLs\"",[146,29077,406],{"class":263},[11,29079,29080,29081,29083],{},"이 일괄 처리 패턴은 모든 카탈로그 규모에 확장 가능합니다. 폴링 대신 콜백 URL(",[28,29082,3603],{}," 파라미터)을 사용하여 확장할 수 있으며, 대규모 배치에서 더 효율적입니다 — 각 영상이 완료되면 API가 엔드포인트로 POST를 보냅니다.",[92,29085,29087],{"id":29086},"제품-영상-프롬프트-템플릿","제품 영상 프롬프트 템플릿",[11,29089,29090],{},"일반적인 이커머스 영상 요구사항을 위해 실전에서 검증된 프롬프트 템플릿입니다:",[137,29092,29094],{"className":338,"code":29093,"language":340,"meta":142,"style":142},"PRODUCT_TEMPLATES = {\n    \"rotation_360\": (\n        \"@Image1 is the product. \"\n        \"Full 360-degree rotation on a clean background. \"\n        \"Consistent studio lighting throughout the rotation. \"\n        \"Smooth, steady turntable motion. \"\n        \"Product catalog photography style.\"\n    ),\n    \"unboxing_reveal\": (\n        \"@Image1 is the product. \"\n        \"The product emerges from soft tissue paper inside a premium box. \"\n        \"Hands carefully lift it into view. \"\n        \"Camera slowly pushes in as the product is revealed. \"\n        \"Luxury unboxing experience. Warm lighting.\"\n    ),\n    \"hero_shot\": (\n        \"@Image1 is the product. \"\n        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n        \"Volumetric light beams hit the product from the side. \"\n        \"Slow motion. Particles float in the light. \"\n        \"Epic product launch trailer aesthetic.\"\n    ),\n    \"in_use\": (\n        \"@Image1 is the product. \"\n        \"Someone picks up the product and uses it naturally. \"\n        \"Lifestyle setting with soft natural window light. \"\n        \"Medium close-up. The camera follows the interaction. \"\n        \"Authentic, relatable product usage.\"\n    ),\n}\n",[28,29095,29096,29105,29112,29117,29122,29127,29132,29137,29141,29148,29152,29157,29162,29167,29172,29176,29183,29187,29192,29197,29202,29207,29211,29218,29222,29227,29232,29237,29242,29246],{"__ignoreMap":142},[146,29097,29098,29101,29103],{"class":148,"line":149},[146,29099,29100],{"class":156},"PRODUCT_TEMPLATES",[146,29102,391],{"class":259},[146,29104,428],{"class":263},[146,29106,29107,29110],{"class":148,"line":167},[146,29108,29109],{"class":160},"    \"rotation_360\"",[146,29111,1322],{"class":263},[146,29113,29114],{"class":148,"line":179},[146,29115,29116],{"class":160},"        \"@Image1 is the product. \"\n",[146,29118,29119],{"class":148,"line":188},[146,29120,29121],{"class":160},"        \"Full 360-degree rotation on a clean background. \"\n",[146,29123,29124],{"class":148,"line":373},[146,29125,29126],{"class":160},"        \"Consistent studio lighting throughout the rotation. \"\n",[146,29128,29129],{"class":148,"line":379},[146,29130,29131],{"class":160},"        \"Smooth, steady turntable motion. \"\n",[146,29133,29134],{"class":148,"line":385},[146,29135,29136],{"class":160},"        \"Product catalog photography style.\"\n",[146,29138,29139],{"class":148,"line":409},[146,29140,3808],{"class":263},[146,29142,29143,29146],{"class":148,"line":420},[146,29144,29145],{"class":160},"    \"unboxing_reveal\"",[146,29147,1322],{"class":263},[146,29149,29150],{"class":148,"line":431},[146,29151,29116],{"class":160},[146,29153,29154],{"class":148,"line":455},[146,29155,29156],{"class":160},"        \"The product emerges from soft tissue paper inside a premium box. \"\n",[146,29158,29159],{"class":148,"line":466},[146,29160,29161],{"class":160},"        \"Hands carefully lift it into view. \"\n",[146,29163,29164],{"class":148,"line":600},[146,29165,29166],{"class":160},"        \"Camera slowly pushes in as the product is revealed. \"\n",[146,29168,29169],{"class":148,"line":605},[146,29170,29171],{"class":160},"        \"Luxury unboxing experience. Warm lighting.\"\n",[146,29173,29174],{"class":148,"line":611},[146,29175,3808],{"class":263},[146,29177,29178,29181],{"class":148,"line":617},[146,29179,29180],{"class":160},"    \"hero_shot\"",[146,29182,1322],{"class":263},[146,29184,29185],{"class":148,"line":623},[146,29186,29116],{"class":160},[146,29188,29189],{"class":148,"line":628},[146,29190,29191],{"class":160},"        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n",[146,29193,29194],{"class":148,"line":639},[146,29195,29196],{"class":160},"        \"Volumetric light beams hit the product from the side. \"\n",[146,29198,29199],{"class":148,"line":654},[146,29200,29201],{"class":160},"        \"Slow motion. Particles float in the light. \"\n",[146,29203,29204],{"class":148,"line":660},[146,29205,29206],{"class":160},"        \"Epic product launch trailer aesthetic.\"\n",[146,29208,29209],{"class":148,"line":671},[146,29210,3808],{"class":263},[146,29212,29213,29216],{"class":148,"line":698},[146,29214,29215],{"class":160},"    \"in_use\"",[146,29217,1322],{"class":263},[146,29219,29220],{"class":148,"line":710},[146,29221,29116],{"class":160},[146,29223,29224],{"class":148,"line":716},[146,29225,29226],{"class":160},"        \"Someone picks up the product and uses it naturally. \"\n",[146,29228,29229],{"class":148,"line":722},[146,29230,29231],{"class":160},"        \"Lifestyle setting with soft natural window light. \"\n",[146,29233,29234],{"class":148,"line":728},[146,29235,29236],{"class":160},"        \"Medium close-up. The camera follows the interaction. \"\n",[146,29238,29239],{"class":148,"line":739},[146,29240,29241],{"class":160},"        \"Authentic, relatable product usage.\"\n",[146,29243,29244],{"class":148,"line":744},[146,29245,3808],{"class":263},[146,29247,29248],{"class":148,"line":750},[146,29249,469],{"class":263},[45,29251],{},[48,29253,29255],{"id":29254},"흔한-실수와-해결-방법","흔한 실수와 해결 방법",[11,29257,29258],{},"수백 번의 API 호출을 거치면 무엇이 작동하고 무엇이 실패하는지 명확한 패턴이 드러납니다. 가장 흔한 실수와 해결 방법은 다음과 같습니다.",[92,29260,29262],{"id":29261},"실수-1-사실적인-인간-얼굴-사진-사용","실수 1: 사실적인 인간 얼굴 사진 사용",[11,29264,29265,29268,29269,29271,29272,29274],{},[23,29266,29267],{},"발생 현상:"," API가 ",[28,29270,3641],{}," 오류 또는 ",[28,29273,2085],{}," 작업 상태를 반환합니다.",[11,29276,29277,29280],{},[23,29278,29279],{},"이유:"," Seedance 2.0은 사실적인 인간 얼굴 이미지에서의 이미지-투-비디오 생성을 차단합니다. 이것은 버그가 아닌 안전 정책입니다.",[11,29282,29283,29286],{},[23,29284,29285],{},"해결 방법:"," 일러스트, 스타일화된 또는 카툰 스타일의 캐릭터 이미지를 대신 사용하세요. 애니메이션 캐릭터, 유화 초상화, 3D 렌더링 캐릭터, 실루엣 모두 완벽하게 작동합니다. 워크플로우에 인간 캐릭터가 필요하다면, 먼저 비사실적 스타일의 텍스트-투-이미지 모델을 사용하여 생성하세요.",[137,29288,29290],{"className":338,"code":29289,"language":340,"meta":142,"style":142},"# Will be rejected\n\"image_urls\": [\"https://example.com/real-person-photo.jpg\"]\n\n# Works fine\n\"image_urls\": [\"https://example.com/illustrated-character.png\"]\n\"image_urls\": [\"https://example.com/3d-rendered-character.jpg\"]\n\"image_urls\": [\"https://example.com/anime-character.png\"]\n",[28,29291,29292,29297,29308,29312,29317,29328,29339],{"__ignoreMap":142},[146,29293,29294],{"class":148,"line":149},[146,29295,29296],{"class":175},"# Will be rejected\n",[146,29298,29299,29301,29303,29306],{"class":148,"line":167},[146,29300,6241],{"class":160},[146,29302,10846],{"class":263},[146,29304,29305],{"class":160},"\"https://example.com/real-person-photo.jpg\"",[146,29307,764],{"class":263},[146,29309,29310],{"class":148,"line":179},[146,29311,376],{"emptyLinePlaceholder":58},[146,29313,29314],{"class":148,"line":188},[146,29315,29316],{"class":175},"# Works fine\n",[146,29318,29319,29321,29323,29326],{"class":148,"line":373},[146,29320,6241],{"class":160},[146,29322,10846],{"class":263},[146,29324,29325],{"class":160},"\"https://example.com/illustrated-character.png\"",[146,29327,764],{"class":263},[146,29329,29330,29332,29334,29337],{"class":148,"line":379},[146,29331,6241],{"class":160},[146,29333,10846],{"class":263},[146,29335,29336],{"class":160},"\"https://example.com/3d-rendered-character.jpg\"",[146,29338,764],{"class":263},[146,29340,29341,29343,29345,29348],{"class":148,"line":385},[146,29342,6241],{"class":160},[146,29344,10846],{"class":263},[146,29346,29347],{"class":160},"\"https://example.com/anime-character.png\"",[146,29349,764],{"class":263},[92,29351,29353],{"id":29352},"실수-2-외형만-설명하는-정적-프롬프트","실수 2: 외형만 설명하는 정적 프롬프트",[11,29355,29356,29358],{},[23,29357,29267],{}," 생성된 영상에 움직임이 거의 또는 전혀 없습니다. 피사체가 가만히 서 있거나 미세한 카메라 드리프트만 발생합니다.",[11,29360,29361,29363],{},[23,29362,29279],{}," 모델은 프롬프트를 문자 그대로 받아들입니다. 정적인 장면을 설명하면 (\"창턱에 앉은 고양이\"), 거의 정적인 영상을 얻습니다.",[11,29365,29366,29368],{},[23,29367,29285],{}," 항상 동작 동사, 연속적인 동작, 환경 역학을 포함하세요.",[137,29370,29372],{"className":338,"code":29371,"language":340,"meta":142,"style":142},"# Static: produces near-still video\n\"prompt\": \"A beautiful sunset over the ocean with golden light\"\n\n# Dynamic: produces engaging video\n\"prompt\": (\n    \"Waves crash against rocky coastline during golden sunset. \"\n    \"Water sprays upward, catching the warm light. \"\n    \"Camera slowly descends from sky level to water level. \"\n    \"Seabirds glide across the frame. \"\n    \"Light shifts from golden to deep amber.\"\n)\n",[28,29373,29374,29379,29388,29392,29397,29403,29408,29413,29418,29423,29428],{"__ignoreMap":142},[146,29375,29376],{"class":148,"line":149},[146,29377,29378],{"class":175},"# Static: produces near-still video\n",[146,29380,29381,29383,29385],{"class":148,"line":167},[146,29382,5924],{"class":160},[146,29384,437],{"class":263},[146,29386,29387],{"class":160},"\"A beautiful sunset over the ocean with golden light\"\n",[146,29389,29390],{"class":148,"line":179},[146,29391,376],{"emptyLinePlaceholder":58},[146,29393,29394],{"class":148,"line":188},[146,29395,29396],{"class":175},"# Dynamic: produces engaging video\n",[146,29398,29399,29401],{"class":148,"line":373},[146,29400,5924],{"class":160},[146,29402,1322],{"class":263},[146,29404,29405],{"class":148,"line":379},[146,29406,29407],{"class":160},"    \"Waves crash against rocky coastline during golden sunset. \"\n",[146,29409,29410],{"class":148,"line":385},[146,29411,29412],{"class":160},"    \"Water sprays upward, catching the warm light. \"\n",[146,29414,29415],{"class":148,"line":409},[146,29416,29417],{"class":160},"    \"Camera slowly descends from sky level to water level. \"\n",[146,29419,29420],{"class":148,"line":420},[146,29421,29422],{"class":160},"    \"Seabirds glide across the frame. \"\n",[146,29424,29425],{"class":148,"line":431},[146,29426,29427],{"class":160},"    \"Light shifts from golden to deep amber.\"\n",[146,29429,29430],{"class":148,"line":455},[146,29431,406],{"class":263},[92,29433,29435],{"id":29434},"실수-3-콘텐츠에-맞지-않는-지속-시간","실수 3: 콘텐츠에 맞지 않는 지속 시간",[11,29437,29438,29440],{},[23,29439,29267],{}," 단순한 동작이 늘어져서 어색하거나, 복잡한 시퀀스가 급하고 끊기게 느껴집니다.",[11,29442,29443,29445],{},[23,29444,29279],{}," 지속 시간은 프롬프트의 복잡도와 일치해야 합니다. 단순한 제품 회전에는 15초가 필요 없습니다. 다중 동작 캐릭터 시퀀스는 4초로는 작동하지 않습니다.",[11,29447,29448,29450],{},[23,29449,29285],{}," 지속 시간을 프롬프트 복잡도에 맞추세요:",[2035,29452,29453,29465],{},[2038,29454,29455],{},[2041,29456,29457,29460,29463],{},[2044,29458,29459],{},"프롬프트 복잡도",[2044,29461,29462],{},"설명된 동작",[2044,29464,25200],{},[2051,29466,29467,29477,29487],{},[2041,29468,29469,29472,29475],{},[2056,29470,29471],{},"단순 (단일 동작)",[2056,29473,29474],{},"1개 동작",[2056,29476,19515],{},[2041,29478,29479,29482,29485],{},[2056,29480,29481],{},"중간 (2~3개 동작)",[2056,29483,29484],{},"2~3개 연속 동작",[2056,29486,18344],{},[2041,29488,29489,29492,29495],{},[2056,29490,29491],{},"복잡 (내러티브)",[2056,29493,29494],{},"4개 이상 동작, 장면 전환",[2056,29496,25232],{},[92,29498,29500],{"id":29499},"실수-4-이미지-url-문제","실수 4: 이미지 URL 문제",[11,29502,29503,29505],{},[23,29504,29267],{}," API가 잘못된 이미지에 대한 오류를 반환하거나 처리 중 작업이 실패합니다.",[11,29507,29508,29510],{},[23,29509,29279],{}," 여러 가지 일반적인 URL 문제:",[97,29512,29513,29516,29519,29522,29525],{},[73,29514,29515],{},"URL이 인증을 요구함 (공개적으로 접근 불가)",[73,29517,29518],{},"URL이 직접 이미지 파일이 아닌 웹페이지를 가리킴",[73,29520,29521],{},"이미지 형식이 지원되지 않음 (WebP가 가끔 실패)",[73,29523,29524],{},"이미지가 너무 큼 (초고해상도 파일은 타임아웃될 수 있음)",[73,29526,29527],{},"URL이 만료됨 (시간 제한이 있는 사전 서명된 URL)",[11,29529,29530,29532],{},[23,29531,29285],{}," 이미지 URL이 다음을 충족하는지 확인하세요:",[70,29534,29535,29541,29553,29559,29565],{},[73,29536,29537,29540],{},[23,29538,29539],{},"공개적으로 접근 가능"," — 다운로드에 인증 헤더가 필요 없음",[73,29542,29543,1061,29546,400,29549,29552],{},[23,29544,29545],{},"직접 이미지 링크",[28,29547,29548],{},".jpg",[28,29550,29551],{},".png"," 등으로 끝남 (HTML 페이지가 아님)",[73,29554,29555,29558],{},[23,29556,29557],{},"표준 형식"," — JPEG와 PNG가 가장 안전",[73,29560,29561,29564],{},[23,29562,29563],{},"적절한 크기"," — 이미지당 10MB 미만",[73,29566,29567,29570],{},[23,29568,29569],{},"영구적"," — 처리 중에 만료되지 않음",[137,29572,29574],{"className":338,"code":29573,"language":340,"meta":142,"style":142},"# Problem URLs\n\"https://drive.google.com/file/d/abc123/view\"  # Requires auth\n\"https://example.com/product-page\"              # HTML page, not image\n\"https://storage.com/image.jpg?token=abc&exp=1h\" # Might expire\n\n# Good URLs\n\"https://cdn.example.com/images/product.jpg\"     # Direct CDN link\n\"https://i.imgur.com/abc123.png\"                  # Public image host\n",[28,29575,29576,29581,29589,29597,29605,29609,29614,29622],{"__ignoreMap":142},[146,29577,29578],{"class":148,"line":149},[146,29579,29580],{"class":175},"# Problem URLs\n",[146,29582,29583,29586],{"class":148,"line":167},[146,29584,29585],{"class":160},"\"https://drive.google.com/file/d/abc123/view\"",[146,29587,29588],{"class":175},"  # Requires auth\n",[146,29590,29591,29594],{"class":148,"line":179},[146,29592,29593],{"class":160},"\"https://example.com/product-page\"",[146,29595,29596],{"class":175},"              # HTML page, not image\n",[146,29598,29599,29602],{"class":148,"line":188},[146,29600,29601],{"class":160},"\"https://storage.com/image.jpg?token=abc&exp=1h\"",[146,29603,29604],{"class":175}," # Might expire\n",[146,29606,29607],{"class":148,"line":373},[146,29608,376],{"emptyLinePlaceholder":58},[146,29610,29611],{"class":148,"line":379},[146,29612,29613],{"class":175},"# Good URLs\n",[146,29615,29616,29619],{"class":148,"line":385},[146,29617,29618],{"class":160},"\"https://cdn.example.com/images/product.jpg\"",[146,29620,29621],{"class":175},"     # Direct CDN link\n",[146,29623,29624,29627],{"class":148,"line":409},[146,29625,29626],{"class":160},"\"https://i.imgur.com/abc123.png\"",[146,29628,29629],{"class":175},"                  # Public image host\n",[92,29631,29633],{"id":29632},"실수-5-여러-이미지에서-tags-미사용","실수 5: 여러 이미지에서 @Tags 미사용",[11,29635,29636,29638,29639,29641],{},[23,29637,29267],{}," 프롬프트에서 ",[28,29640,4148],{}," 태그를 사용하지 않고 3개 이상의 이미지를 전달하면 모델이 어떤 이미지가 어떤 용도인지 추측합니다. 결과가 예측 불가능합니다 — 때로는 배경 이미지가 캐릭터로 사용되거나, 스타일 참조가 장면 요소로 처리됩니다.",[11,29643,29644,29646,29647,29649],{},[23,29645,29285],{}," 이미지를 두 개 이상 전달할 때는 항상 ",[28,29648,4148],{}," 태그를 사용하세요. 각 이미지의 역할을 명시적으로 지정하세요.",[137,29651,29653],{"className":338,"code":29652,"language":340,"meta":142,"style":142},"# Ambiguous: model guesses roles\n\"prompt\": \"A character walks through a forest in watercolor style\"\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n\n# Explicit: model knows each role\n\"prompt\": (\n    \"@Image1 is the character. @Image2 is the forest environment. \"\n    \"@Image3 defines the watercolor art style. \"\n    \"The character (@Image1) walks through the forest (@Image2) \"\n    \"rendered in the watercolor style of @Image3.\"\n)\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[28,29654,29655,29660,29669,29676,29680,29685,29691,29696,29701,29706,29711,29715],{"__ignoreMap":142},[146,29656,29657],{"class":148,"line":149},[146,29658,29659],{"class":175},"# Ambiguous: model guesses roles\n",[146,29661,29662,29664,29666],{"class":148,"line":167},[146,29663,5924],{"class":160},[146,29665,437],{"class":263},[146,29667,29668],{"class":160},"\"A character walks through a forest in watercolor style\"\n",[146,29670,29671,29673],{"class":148,"line":179},[146,29672,6241],{"class":160},[146,29674,29675],{"class":263},": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[146,29677,29678],{"class":148,"line":188},[146,29679,376],{"emptyLinePlaceholder":58},[146,29681,29682],{"class":148,"line":373},[146,29683,29684],{"class":175},"# Explicit: model knows each role\n",[146,29686,29687,29689],{"class":148,"line":379},[146,29688,5924],{"class":160},[146,29690,1322],{"class":263},[146,29692,29693],{"class":148,"line":385},[146,29694,29695],{"class":160},"    \"@Image1 is the character. @Image2 is the forest environment. \"\n",[146,29697,29698],{"class":148,"line":409},[146,29699,29700],{"class":160},"    \"@Image3 defines the watercolor art style. \"\n",[146,29702,29703],{"class":148,"line":420},[146,29704,29705],{"class":160},"    \"The character (@Image1) walks through the forest (@Image2) \"\n",[146,29707,29708],{"class":148,"line":431},[146,29709,29710],{"class":160},"    \"rendered in the watercolor style of @Image3.\"\n",[146,29712,29713],{"class":148,"line":455},[146,29714,406],{"class":263},[146,29716,29717,29719],{"class":148,"line":466},[146,29718,6241],{"class":160},[146,29720,29675],{"class":263},[92,29722,29724],{"id":29723},"실수-6-비디오-url-만료-간과","실수 6: 비디오 URL 만료 간과",[11,29726,29727,29729],{},[23,29728,29267],{}," 영상을 생성하고 URL을 저장한 후 다음 날 접근하려고 하면 403 또는 404 오류가 발생합니다.",[11,29731,29732,29734],{},[23,29733,29279],{}," 생성된 비디오 URL은 24시간 후 만료됩니다.",[11,29736,29737,29739],{},[23,29738,29285],{}," 생성 완료 직후 비디오 파일을 즉시 다운로드하세요. 폴링 함수에 다운로드 단계를 추가하세요:",[137,29741,29743],{"className":338,"code":29742,"language":340,"meta":142,"style":142},"import os\n\ndef download_video(video_url, output_path):\n    \"\"\"Download a video before the URL expires.\"\"\"\n    resp = requests.get(video_url, stream=True)\n    resp.raise_for_status()\n    with open(output_path, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved to {output_path}\")\n\n# After generation completes:\nvideo_url = video_data[\"output\"][\"video_url\"]\ndownload_video(video_url, \"output/my-product-video.mp4\")\n",[28,29744,29745,29751,29755,29764,29769,29786,29790,29807,29825,29829,29851,29855,29860,29878],{"__ignoreMap":142},[146,29746,29747,29749],{"class":148,"line":149},[146,29748,347],{"class":259},[146,29750,363],{"class":263},[146,29752,29753],{"class":148,"line":167},[146,29754,376],{"emptyLinePlaceholder":58},[146,29756,29757,29759,29761],{"class":148,"line":179},[146,29758,526],{"class":259},[146,29760,1082],{"class":152},[146,29762,29763],{"class":263},"(video_url, output_path):\n",[146,29765,29766],{"class":148,"line":188},[146,29767,29768],{"class":160},"    \"\"\"Download a video before the URL expires.\"\"\"\n",[146,29770,29771,29773,29775,29778,29780,29782,29784],{"class":148,"line":373},[146,29772,1126],{"class":263},[146,29774,267],{"class":259},[146,29776,29777],{"class":263}," requests.get(video_url, ",[146,29779,1134],{"class":701},[146,29781,267],{"class":259},[146,29783,1139],{"class":156},[146,29785,406],{"class":263},[146,29787,29788],{"class":148,"line":379},[146,29789,1146],{"class":263},[146,29791,29792,29794,29796,29799,29801,29803,29805],{"class":148,"line":385},[146,29793,1151],{"class":259},[146,29795,1154],{"class":156},[146,29797,29798],{"class":263},"(output_path, ",[146,29800,1160],{"class":160},[146,29802,1163],{"class":263},[146,29804,1166],{"class":259},[146,29806,1169],{"class":263},[146,29808,29809,29811,29813,29815,29817,29819,29821,29823],{"class":148,"line":409},[146,29810,1174],{"class":259},[146,29812,1177],{"class":263},[146,29814,1180],{"class":259},[146,29816,1183],{"class":263},[146,29818,1186],{"class":701},[146,29820,267],{"class":259},[146,29822,1191],{"class":156},[146,29824,548],{"class":263},[146,29826,29827],{"class":148,"line":420},[146,29828,1198],{"class":263},[146,29830,29831,29833,29835,29837,29840,29842,29845,29847,29849],{"class":148,"line":431},[146,29832,1102],{"class":156},[146,29834,794],{"class":263},[146,29836,440],{"class":259},[146,29838,29839],{"class":160},"\"Saved to ",[146,29841,685],{"class":156},[146,29843,29844],{"class":263},"output_path",[146,29846,691],{"class":156},[146,29848,449],{"class":160},[146,29850,406],{"class":263},[146,29852,29853],{"class":148,"line":455},[146,29854,376],{"emptyLinePlaceholder":58},[146,29856,29857],{"class":148,"line":466},[146,29858,29859],{"class":175},"# After generation completes:\n",[146,29861,29862,29865,29867,29870,29872,29874,29876],{"class":148,"line":600},[146,29863,29864],{"class":263},"video_url ",[146,29866,267],{"class":259},[146,29868,29869],{"class":263}," video_data[",[146,29871,21546],{"class":160},[146,29873,1562],{"class":263},[146,29875,14959],{"class":160},[146,29877,764],{"class":263},[146,29879,29880,29883,29886],{"class":148,"line":605},[146,29881,29882],{"class":263},"download_video(video_url, ",[146,29884,29885],{"class":160},"\"output/my-product-video.mp4\"",[146,29887,406],{"class":263},[45,29889],{},[92,29891,29893],{"id":29892},"실수-7-프롬프트와-이미지-콘텐츠의-충돌","실수 7: 프롬프트와 이미지 콘텐츠의 충돌",[11,29895,29896,29898],{},[23,29897,29267],{}," 출력 영상이 혼란스러워 보입니다 — 이미지의 요소와 프롬프트의 요소가 주도권을 다투며 시각적 아티팩트나 비일관적인 장면을 만듭니다.",[11,29900,29901,29903],{},[23,29902,29279],{}," 프롬프트에서 참조 이미지와 직접적으로 모순되는 것을 설명했습니다. 예를 들어, 이미지는 빨간 자동차를 보여주는데 프롬프트에 \"파란 스포츠카가 고속도로를 달립니다\"라고 적었습니다.",[11,29905,29906,29908,29909,29912],{},[23,29907,29285],{}," 프롬프트는 이미지를 모순하는 것이 아니라 ",[2621,29910,29911],{},"보완","해야 합니다. 참조 이미지로 이미 정의된 요소의 외형이 아닌, 동작, 카메라 움직임, 환경 변화를 설명하세요.",[137,29914,29916],{"className":338,"code":29915,"language":340,"meta":142,"style":142},"# Contradicts image (image shows red car)\n\"prompt\": \"A blue sports car races down the highway at sunset\"\n\n# Complements image (lets the image define appearance)\n\"prompt\": (\n    \"@Image1 is the car. The car accelerates down an open highway. \"\n    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n)\n",[28,29917,29918,29923,29932,29936,29941,29947,29952,29957,29962],{"__ignoreMap":142},[146,29919,29920],{"class":148,"line":149},[146,29921,29922],{"class":175},"# Contradicts image (image shows red car)\n",[146,29924,29925,29927,29929],{"class":148,"line":167},[146,29926,5924],{"class":160},[146,29928,437],{"class":263},[146,29930,29931],{"class":160},"\"A blue sports car races down the highway at sunset\"\n",[146,29933,29934],{"class":148,"line":179},[146,29935,376],{"emptyLinePlaceholder":58},[146,29937,29938],{"class":148,"line":188},[146,29939,29940],{"class":175},"# Complements image (lets the image define appearance)\n",[146,29942,29943,29945],{"class":148,"line":373},[146,29944,5924],{"class":160},[146,29946,1322],{"class":263},[146,29948,29949],{"class":148,"line":379},[146,29950,29951],{"class":160},"    \"@Image1 is the car. The car accelerates down an open highway. \"\n",[146,29953,29954],{"class":148,"line":385},[146,29955,29956],{"class":160},"    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n",[146,29958,29959],{"class":148,"line":409},[146,29960,29961],{"class":160},"    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n",[146,29963,29964],{"class":148,"line":420},[146,29965,406],{"class":263},[45,29967],{},[48,29969,29971],{"id":29970},"api-파라미터-참조","API 파라미터 참조",[11,29973,29974],{},"이미지-투-비디오 생성과 관련된 모든 파라미터를 하나의 참조 표에 정리했습니다:",[2035,29976,29977,29991],{},[2038,29978,29979],{},[2041,29980,29981,29983,29985,29987,29989],{},[2044,29982,3403],{},[2044,29984,3406],{},[2044,29986,16503],{},[2044,29988,3409],{},[2044,29990,3415],{},[2051,29992,29993,30010,30028,30047,30062,30085,30112,30129,30146,30163],{},[2041,29994,29995,29999,30001,30003,30005],{},[2056,29996,29997],{},[28,29998,1747],{},[2056,30000,3426],{},[2056,30002,4954],{},[2056,30004,3429],{},[2056,30006,30007,30009],{},[28,30008,1308],{},"이어야 합니다",[2041,30011,30012,30016,30018,30020,30022],{},[2056,30013,30014],{},[28,30015,1762],{},[2056,30017,3426],{},[2056,30019,4954],{},[2056,30021,3429],{},[2056,30023,30024,30025,30027],{},"선택적 ",[28,30026,4148],{}," 태그를 포함한 동작 설명",[2041,30029,30030,30034,30036,30039,30044],{},[2056,30031,30032],{},[28,30033,2898],{},[2056,30035,3555],{},[2056,30037,30038],{},"예 (i2v의 경우)",[2056,30040,30041],{},[28,30042,30043],{},"[]",[2056,30045,30046],{},"1~9개의 공개적으로 접근 가능한 이미지 URL",[2041,30048,30049,30053,30055,30057,30059],{},[2056,30050,30051],{},[28,30052,1774],{},[2056,30054,3461],{},[2056,30056,4843],{},[2056,30058,1352],{},[2056,30060,30061],{},"영상 길이(초) (4~15)",[2041,30063,30064,30068,30070,30072,30076],{},[2056,30065,30066],{},[28,30067,1782],{},[2056,30069,3426],{},[2056,30071,4843],{},[2056,30073,30074],{},[28,30075,1368],{},[2056,30077,30078,30079,400,30081,400,30083],{},"출력 해상도: ",[28,30080,4017],{},[28,30082,1368],{},[28,30084,3714],{},[2041,30086,30087,30091,30093,30095,30099],{},[2056,30088,30089],{},[28,30090,1802],{},[2056,30092,3426],{},[2056,30094,4843],{},[2056,30096,30097],{},[28,30098,1384],{},[2056,30100,30101,30102,400,30104,400,30106,400,30108,400,30110],{},"출력 비율: ",[28,30103,1384],{},[28,30105,3726],{},[28,30107,6143],{},[28,30109,6148],{},[28,30111,6153],{},[2041,30113,30114,30118,30120,30122,30126],{},[2056,30115,30116],{},[28,30117,1822],{},[2056,30119,3533],{},[2056,30121,4843],{},[2056,30123,30124],{},[28,30125,2938],{},[2056,30127,30128],{},"동기화된 오디오 트랙 생성",[2041,30130,30131,30135,30137,30139,30143],{},[2056,30132,30133],{},[28,30134,3570],{},[2056,30136,3555],{},[2056,30138,4843],{},[2056,30140,30141],{},[28,30142,30043],{},[2056,30144,30145],{},"0~3개 비디오 참조 URL (혼합 미디어용)",[2041,30147,30148,30152,30154,30156,30160],{},[2056,30149,30150],{},[28,30151,3587],{},[2056,30153,3555],{},[2056,30155,4843],{},[2056,30157,30158],{},[28,30159,30043],{},[2056,30161,30162],{},"0~3개 오디오 참조 URL (혼합 미디어용)",[2041,30164,30165,30169,30171,30173,30175],{},[2056,30166,30167],{},[28,30168,3603],{},[2056,30170,3426],{},[2056,30172,4843],{},[2056,30174,3429],{},[2056,30176,30177],{},"완료 알림을 위한 Webhook URL",[11,30179,30180,30183,30184,2251,30187,400,30189,2251,30192,400,30194,2251,30197,4516],{},[23,30181,30182],{},"제한:"," 요청당 최대 9개 이미지 + 3개 비디오 + 3개 오디오 파일. 모든 미디어 유형 합계는 12를 초과할 수 없습니다. 태그는 배열 위치에 따라 할당됩니다: ",[28,30185,30186],{},"image_urls[0]",[28,30188,2911],{},[28,30190,30191],{},"video_urls[0]",[28,30193,11427],{},[28,30195,30196],{},"audio_urls[0]",[28,30198,16541],{},[45,30200],{},[48,30202,13302],{"id":13301},[92,30204,30206],{"id":30205},"seedance-20-이미지-투-비디오-api에서-모든-이미지-형식을-사용할-수-있습니까","Seedance 2.0 이미지-투-비디오 API에서 모든 이미지 형식을 사용할 수 있습니까?",[11,30208,30209],{},"JPEG와 PNG는 완전히 지원되며 권장됩니다. GIF(첫 번째 프레임만), BMP, TIFF는 일반적으로 작동하지만 테스트가 덜 되어 있습니다. WebP 지원은 일관적이지 않으므로 안정적인 결과를 위해 JPEG 또는 PNG로 변환하세요. 모든 이미지는 인증 없이 공개 URL을 통해 접근 가능해야 합니다.",[92,30211,30213],{"id":30212},"이미지-투-비디오-생성은-얼마나-걸립니까","이미지-투-비디오 생성은 얼마나 걸립니까?",[11,30215,30216,30217,30219,30220,30222],{},"일반적인 생성 시간은 지속 시간, 화질 설정, 현재 서버 부하에 따라 60~180초입니다. 480p에서 4초 클립은 1080p에서 15초 클립보다 빠르게 생성됩니다. 폴링 엔드포인트(",[28,30218,9177],{},")를 사용하거나 ",[28,30221,3603],{},"을 설정하여 처리 완료 시 알림을 받으세요.",[92,30224,30226],{"id":30225},"단일-요청에서-사용할-수-있는-최대-이미지-수는-얼마입니까","단일 요청에서 사용할 수 있는 최대 이미지 수는 얼마입니까?",[11,30228,30229,30231],{},[28,30230,2898],{},"에 최대 9개의 이미지를 포함할 수 있습니다. 모든 미디어 유형(이미지 + 비디오 + 오디오) 합계 파일 수는 요청당 12개로 제한됩니다. 따라서 9개의 이미지를 사용하고 있다면 최대 3개의 비디오 또는 오디오 참조를 추가할 수 있습니다.",[92,30233,30235],{"id":30234},"이미지-투-비디오와-오디오-생성을-결합할-수-있습니까","이미지-투-비디오와 오디오 생성을 결합할 수 있습니까?",[11,30237,30238,30239,30241,30242,30244,30245,30247,30248,30250],{},"네. 요청 페이로드에서 ",[28,30240,2898],{},"와 함께 ",[28,30243,23313],{},"를 설정하세요. 모델이 시각적 콘텐츠에 맞는 동기화된 오디오를 생성합니다 — 걷는 장면에는 발소리, 자연 장면에는 주변 소리, 제품 회전에는 기계 소리. ",[28,30246,3587],{},"를 통해 자체 오디오를 제공하고 프롬프트에서 ",[28,30249,16541],{},"로 참조할 수도 있습니다.",[92,30252,30254],{"id":30253},"프로덕션에서-비디오-url-만료를-어떻게-처리합니까","프로덕션에서 비디오 URL 만료를 어떻게 처리합니까?",[11,30256,30257,30258,30260,30261,30263],{},"생성된 비디오 URL은 24시간 후 만료됩니다. 프로덕션 시스템의 경우 파이프라인에 즉시 다운로드 단계를 구현하세요. 작업 상태가 ",[28,30259,2082],{},"로 변경된 후, 애플리케이션에 URL을 반환하기 전에 비디오 파일을 자체 스토리지(S3, GCS, 또는 로컬 디스크)에 다운로드하세요. API가 생성한 URL을 영구 참조로 저장하지 마세요. ",[28,30262,3603],{},"을 사용하는 경우 웹훅 핸들러의 처리 로직에 다운로드 단계를 포함해야 합니다.",[92,30265,30267],{"id":30266},"seedance-20-이미지-투-비디오를-애니메이션-로고나-브랜드-인트로에-사용할-수-있습니까","Seedance 2.0 이미지-투-비디오를 애니메이션 로고나 브랜드 인트로에 사용할 수 있습니까?",[11,30269,30270,30271,30273,30274,30276],{},"네, 이것은 가장 강력한 활용 사례 중 하나입니다. 로고 또는 브랜드 마크를 ",[28,30272,2911],{},"으로 업로드하고 원하는 애니메이션 스타일 — 파티클 조립, 리퀴드 리빌, 3D 회전 등 — 을 프롬프트하세요. 로고는 그래픽 요소이므로(사실적인 얼굴이 아님) 이미지-투-비디오 파이프라인에서 완벽하게 작동합니다. ",[28,30275,23313],{},"를 설정하면 리빌에 동기화된 사운드 이펙트를 추가할 수 있습니다.",[92,30278,30280],{"id":30279},"이미지-투-비디오-요청이-거부된-이유는-무엇입니까","이미지-투-비디오 요청이 거부된 이유는 무엇입니까?",[11,30282,30283,30284,30286],{},"가장 일반적인 거부 사유는 입력 이미지에 사실적인 인간 얼굴이 포함된 경우입니다. Seedance 2.0은 안전상의 이유로 사실적인 얼굴 이미지를 자동으로 감지하고 차단합니다. 다른 거부 원인으로는 접근 불가능한 이미지 URL, 지원하지 않는 파일 형식, 9개 이미지 제한 초과, 또는 총 미디어 파일 수가 12개를 초과하는 경우가 있습니다. 구체적인 세부 사항은 ",[28,30285,2085],{}," 작업 응답의 오류 메시지를 확인하세요.",[45,30288],{},[48,30290,30292],{"id":30291},"이미지-애니메이션을-시작하세요","이미지 애니메이션을 시작하세요",[11,30294,30295,30296,30299],{},"이제 Seedance 2.0 API를 통해 정적 이미지를 영상으로 변환하는 세 가지 고유한 방법을 갖추었습니다: 빠른 캐릭터 또는 장면 모션을 위한 단일 이미지 애니메이션, 정밀한 시작-종료 전환을 위한 첫-마지막 프레임 제어, 그리고 복잡한 역할 지정 장면을 위한 ",[28,30297,30298],{},"@tags","를 활용한 멀티 이미지 합성.",[11,30301,30302],{},"이 가이드의 코드 예제는 완전하며 바로 실행 가능합니다. 아무거나 복사하고, API 키를 입력하고, 자신의 이미지를 지정하면 몇 분 안에 생성된 영상을 얻을 수 있습니다.",[11,30304,30305,30306,30308],{},"제품 팀에게는 일괄 생성 워크플로우가 스튜디오 없이 전체 제품 카탈로그를 영상 자산으로 변환합니다. 크리에이티브 팀에게는 캐릭터 일관성 패턴이 단일 캐릭터 참조에서 멀티샷 스토리텔링을 가능하게 합니다. 개발자에게는 ",[28,30307,23126],{}," 시스템이 현재 다른 어떤 AI 비디오 API도 제공하지 못하는 수준의 구성적 제어를 제공합니다.",[11,30310,30311],{},[23,30312,30313],{},[37,30314,30316],{"href":212,"rel":30315},[41],"이미지 애니메이션을 시작하세요. EvoLink에서 무료로 가입하기 →",[45,30318],{},[11,30320,30321],{},[2621,30322,30323,30324,400,30326,400,30329,400,30331,4516],{},"이 가이드는 Seedance 2.0 튜토리얼 시리즈의 일부입니다. 이전 글: ",[37,30325,2209],{"href":1766},[37,30327,30328],{"href":17555},"시작하기",[37,30330,2970],{"href":2969},[37,30332,24536],{"href":3860},[11222,30334,13444],{},{"title":142,"searchDepth":167,"depth":167,"links":30336},[30337,30343,30349,30356,30363,30370,30377,30386,30395,30396,30405],{"id":23132,"depth":167,"text":23133,"children":30338},[30339,30340,30341,30342],{"id":23146,"depth":179,"text":23147},{"id":23287,"depth":179,"text":23288},{"id":23306,"depth":179,"text":23307},{"id":23317,"depth":179,"text":23318},{"id":23326,"depth":167,"text":23327,"children":30344},[30345,30346,30347,30348],{"id":23336,"depth":179,"text":23337},{"id":23363,"depth":179,"text":23364},{"id":23382,"depth":179,"text":23383},{"id":23481,"depth":179,"text":23482},{"id":23794,"depth":167,"text":23795,"children":30350},[30351,30352,30353,30354,30355],{"id":6443,"depth":179,"text":6444},{"id":23845,"depth":179,"text":23846},{"id":24389,"depth":179,"text":24390},{"id":24411,"depth":179,"text":24412},{"id":24430,"depth":179,"text":24431},{"id":24541,"depth":167,"text":24542,"children":30357},[30358,30359,30360,30361,30362],{"id":24552,"depth":179,"text":6444},{"id":24581,"depth":179,"text":24582},{"id":24620,"depth":179,"text":24621},{"id":25140,"depth":179,"text":25141},{"id":25159,"depth":179,"text":25160},{"id":25237,"depth":167,"text":25238,"children":30364},[30365,30366,30367,30368,30369],{"id":25247,"depth":179,"text":25248},{"id":25274,"depth":179,"text":25275},{"id":25855,"depth":179,"text":25856},{"id":25876,"depth":179,"text":25877},{"id":25980,"depth":179,"text":25981},{"id":26012,"depth":167,"text":26013,"children":30371},[30372,30373,30374,30375,30376],{"id":26026,"depth":179,"text":26027},{"id":26491,"depth":179,"text":26492},{"id":26509,"depth":179,"text":26510},{"id":26610,"depth":179,"text":26611},{"id":27618,"depth":179,"text":27619},{"id":27650,"depth":167,"text":27651,"children":30378},[30379,30380,30381,30382,30383,30384,30385],{"id":27661,"depth":179,"text":27662},{"id":27699,"depth":179,"text":27700},{"id":28235,"depth":179,"text":28236},{"id":28253,"depth":179,"text":28254},{"id":28468,"depth":179,"text":28469},{"id":28486,"depth":179,"text":28487},{"id":29086,"depth":179,"text":29087},{"id":29254,"depth":167,"text":29255,"children":30387},[30388,30389,30390,30391,30392,30393,30394],{"id":29261,"depth":179,"text":29262},{"id":29352,"depth":179,"text":29353},{"id":29434,"depth":179,"text":29435},{"id":29499,"depth":179,"text":29500},{"id":29632,"depth":179,"text":29633},{"id":29723,"depth":179,"text":29724},{"id":29892,"depth":179,"text":29893},{"id":29970,"depth":167,"text":29971},{"id":13301,"depth":167,"text":13302,"children":30397},[30398,30399,30400,30401,30402,30403,30404],{"id":30205,"depth":179,"text":30206},{"id":30212,"depth":179,"text":30213},{"id":30225,"depth":179,"text":30226},{"id":30234,"depth":179,"text":30235},{"id":30253,"depth":179,"text":30254},{"id":30266,"depth":179,"text":30267},{"id":30279,"depth":179,"text":30280},{"id":30291,"depth":167,"text":30292},"Seedance 2.0 API로 이미지를 애니메이션화하는 방법을 배워보세요 — 단일 이미지, 첫-마지막 프레임, 멀티 이미지 워크플로우. 완전한 Python 코드, @tag 구문, 이커머스 데모를 제공합니다.",{"date":23102,"image":30408,"seoTitle":30409},"/s5-hero-image-to-video.webp","Seedance 2.0 이미지-투-비디오 API: 모든 이미지 애니메이션화 (2026)","/ko/blog/seedance-2-image-to-video-api",{"title":23111,"description":30406},"ko/blog/seedance-2-image-to-video-api","EbEd1HnY6lkYLhoLA9L6kbYU8BgQV52F5Yacwn7lU4k",{"id":30415,"title":13429,"body":30416,"description":32180,"extension":11284,"meta":32181,"navigation":58,"path":32184,"seo":32185,"stem":32186,"__hash__":32187},"content/ko/blog/seedance-2-multimodal-tags-guide.md",{"type":8,"value":30417,"toc":32131},[30418,30424,30427,30434,30436,30440,30447,30450,30498,30501,30521,30528,30530,30534,30538,30544,30550,30553,30559,30583,30587,30681,30685,30688,30702,30708,30710,30714,30717,30721,30837,30841,30845,30851,30857,30863,30867,30872,30876,30880,30886,30891,30896,30900,30903,30909,30912,30914,30918,30925,30929,31017,31021,31025,31031,31036,31041,31045,31048,31093,31103,31107,31111,31116,31118,31122,31125,31129,31203,31207,31213,31217,31223,31228,31232,31235,31241,31244,31248,31253,31258,31261,31263,31267,31270,31274,31280,31285,31299,31303,31309,31315,31319,31324,31328,31342,31346,31352,31357,31361,31366,31370,31384,31388,31394,31399,31403,31406,31497,31503,31507,31510,31720,31723,31915,31921,31923,31925,31929,31936,31943,31946,31950,31953,31964,31968,31971,31975,31981,31985,31988,31996,32006,32010,32013,32015,32017,32021,32024,32028,32038,32042,32051,32055,32062,32066,32069,32071,32075,32078,32081,32101,32109,32114,32121,32123,32128],[11,30419,30420,30421,30423],{},"대부분의 AI 비디오 생성기는 텍스트 프롬프트를 받아 모델이 알아서 결과물을 만들어 냅니다. Seedance 2.0은 다릅니다. 이미지, 비디오, 오디오 파일을 업로드한 후 ",[23,30422,30298],{},"를 사용하여 각 파일이 정확히 어떤 역할을 해야 하는지 모델에게 지시합니다 — 첫 번째 프레임으로 사용하거나, 카메라 움직임을 정의하거나, 음악 템포를 설정하거나, 캐릭터 레퍼런스를 제공하는 등의 역할을 말합니다.",[11,30425,30426],{},"이 @tag 레퍼런스 시스템이 바로 Seedance 2.0을 Sora 2, Kling 3.0, Veo 3.1과 차별화하는 핵심입니다. 이 수준의 멀티모달 제어를 제공하는 모델은 다른 곳에서 찾을 수 없습니다.",[11,30428,30429,30430,30433],{},"이 가이드에서는 모든 @tag 유형, 문법 규칙, 파일 제한, 그리고 바로 사용할 수 있는 실제 프롬프트 예제를 다룹니다. API 호출을 직접 따라해 보고 싶다면 ",[37,30431,11966],{"href":212,"rel":30432},[41]," — 30초면 됩니다.",[45,30435],{},[48,30437,30439],{"id":30438},"tag-레퍼런스-시스템이란","@Tag 레퍼런스 시스템이란?",[11,30441,30442,30443,30446],{},"기존 텍스트-투-비디오는 하나의 입력, 하나의 출력으로 구성됩니다: 프롬프트를 작성하면 모델이 자체 판단으로 해석합니다. Seedance 2.0은 이를 ",[23,30444,30445],{},"다중 입력, 지시형 출력"," 프로세스로 전환합니다.",[11,30448,30449],{},"차이점을 비교해 보겠습니다:",[2035,30451,30452,30468],{},[2038,30453,30454],{},[2041,30455,30456,30459,30462,30465],{},[2044,30457,30458],{},"방식",[2044,30460,30461],{},"입력",[2044,30463,30464],{},"제어 수준",[2044,30466,30467],{},"결과",[2051,30469,30470,30484],{},[2041,30471,30472,30475,30478,30481],{},[2056,30473,30474],{},"텍스트만 사용",[2056,30476,30477],{},"\"한 여성이 무대에서 춤을 춘다\"",[2056,30479,30480],{},"낮음 — 모델이 모든 것을 결정",[2056,30482,30483],{},"어떤 여성, 어떤 춤, 어떤 무대가 나올지 전부 모델 마음대로",[2041,30485,30486,30489,30492,30495],{},[2056,30487,30488],{},"@tags 사용",[2056,30490,30491],{},"@Image1 (캐릭터) + @Video1 (춤 레퍼런스) + 프롬프트",[2056,30493,30494],{},"높음 — 각 요소를 직접 지시",[2056,30496,30497],{},"지정한 캐릭터가 레퍼런스와 정확히 동일한 춤을 수행",[11,30499,30500],{},"@tag 시스템은 영화 감독의 촬영 지시서처럼 작동합니다. 업로드된 각 파일은 프롬프트의 자연어를 통해 역할을 부여받습니다:",[97,30502,30503,30509,30515],{},[73,30504,30505,30508],{},[28,30506,30507],{},"@Image1 as the first frame"," — 시작 비주얼을 고정합니다",[73,30510,30511,30514],{},[28,30512,30513],{},"@Video1 for camera movement reference"," — 촬영 기법을 복제합니다",[73,30516,30517,30520],{},[28,30518,30519],{},"@Audio1 as background music"," — 사운드트랙과 리듬을 설정합니다",[11,30522,30523,30524,30527],{},"한 번의 생성에 최대 ",[23,30525,30526],{},"12개 파일"," (이미지 9개 + 비디오 3개 + 오디오 클립 3개)을 조합할 수 있으며, 각각 특정 목적의 태그가 지정됩니다.",[45,30529],{},[48,30531,30533],{"id":30532},"tag-문법-규칙-완벽-레퍼런스","@Tag 문법 규칙 — 완벽 레퍼런스",[92,30535,30537],{"id":30536},"기본-문법","기본 문법",[11,30539,30540,30541,30543],{},"형식은 간단합니다: ",[28,30542,11550],{}," + 에셋 유형 + 번호.",[137,30545,30548],{"className":30546,"code":30547,"language":2183},[2181],"@Image1, @Image2, @Image3 ... @Image9\n@Video1, @Video2, @Video3\n@Audio1, @Audio2, @Audio3\n",[28,30549,30547],{"__ignoreMap":142},[11,30551,30552],{},"프롬프트에서 이러한 태그를 참조하고 자연어로 역할을 설명합니다:",[137,30554,30557],{"className":30555,"code":30556,"language":2183},[2181],"@Image1 as the first frame, @Image2 as character reference,\nreference @Video1's camera movement and tracking shots,\nuse @Audio1 for background music tempo.\n",[28,30558,30556],{"__ignoreMap":142},[18,30560,30561],{},[11,30562,30563,30566,30567,400,30570,400,30573,30576,30577,400,30579,400,30581,2924],{},[23,30564,30565],{},"참고:"," 즈멍(即梦) 플랫폼에서는 태그가 중국어 형식을 사용합니다: ",[28,30568,30569],{},"@图片1",[28,30571,30572],{},"@视频1",[28,30574,30575],{},"@音频1",". API를 통해서는 ",[28,30578,2911],{},[28,30580,11427],{},[28,30582,16541],{},[92,30584,30586],{"id":30585},"파일-제한-및-형식","파일 제한 및 형식",[2035,30588,30589,30608],{},[2038,30590,30591],{},[2041,30592,30593,30596,30599,30602,30605],{},[2044,30594,30595],{},"에셋 유형",[2044,30597,30598],{},"최대 개수",[2044,30600,30601],{},"형식",[2044,30603,30604],{},"용량 제한",[2044,30606,30607],{},"비고",[2051,30609,30610,30626,30646,30662],{},[2041,30611,30612,30615,30618,30620,30623],{},[2056,30613,30614],{},"이미지",[2056,30616,30617],{},"9개",[2056,30619,3258],{},[2056,30621,30622],{},"각 30 MB",[2056,30624,30625],{},"해상도가 높을수록 출력 품질이 향상됩니다",[2041,30627,30628,30631,30634,30637,30640],{},[2056,30629,30630],{},"비디오",[2056,30632,30633],{},"3개",[2056,30635,30636],{},"MP4, MOV",[2056,30638,30639],{},"각 50 MB",[2056,30641,30642,30643,1786],{},"총 재생 시간: 2",[2429,30644,30645],{},"15초, 해상도: 480p",[2041,30647,30648,30651,30653,30656,30659],{},[2056,30649,30650],{},"오디오",[2056,30652,30633],{},[2056,30654,30655],{},"MP3, WAV",[2056,30657,30658],{},"각 15 MB",[2056,30660,30661],{},"총 재생 시간: 15초 이하",[2041,30663,30664,30669,30674,30676,30678],{},[2056,30665,30666],{},[23,30667,30668],{},"합계",[2056,30670,30671],{},[23,30672,30673],{},"총 12개",[2056,30675,3429],{},[2056,30677,3429],{},[2056,30679,30680],{},"제한 내에서 자유롭게 조합 가능",[92,30682,30684],{"id":30683},"두-가지-입력-모드","두 가지 입력 모드",[11,30686,30687],{},"Seedance 2.0에는 두 가지 생성 모드가 있습니다. 입력 내용에 따라 사용할 모드가 결정됩니다:",[70,30689,30690,30696],{},[73,30691,30692,30695],{},[23,30693,30694],{},"첫/마지막 프레임 모드"," — 시작 이미지(+ 선택적 종료 이미지)와 텍스트 프롬프트만 업로드합니다. 단순하고 빠릅니다.",[73,30697,30698,30701],{},[23,30699,30700],{},"올라운드 레퍼런스 모드"," — 이미지, 비디오, 오디오의 모든 조합을 @tag 지정과 함께 업로드합니다. 이 모드에서 Seedance 2.0의 모든 기능을 활용할 수 있습니다.",[11,30703,30704,30707],{},[23,30705,30706],{},"규칙:"," 비디오 또는 오디오 레퍼런스를 업로드하거나 이미지를 2개 이상 사용하는 경우 반드시 올라운드 레퍼런스 모드를 사용해야 합니다.",[45,30709],{},[48,30711,30713],{"id":30712},"이미지-tags-시각적-표현-제어","이미지 @Tags — 시각적 표현 제어",[11,30715,30716],{},"이미지 레퍼런스는 가장 다재다능한 @tag 유형입니다. 하나의 이미지가 프롬프트에서 어떻게 설명하느냐에 따라 다양한 목적으로 활용될 수 있습니다.",[92,30718,30720],{"id":30719},"이미지-레퍼런스-유형","이미지 레퍼런스 유형",[2035,30722,30723,30733],{},[2038,30724,30725],{},[2041,30726,30727,30729,30731],{},[2044,30728,25897],{},[2044,30730,2982],{},[2044,30732,11479],{},[2051,30734,30735,30749,30764,30778,30793,30808,30823],{},[2041,30736,30737,30742,30746],{},[2056,30738,30739],{},[23,30740,30741],{},"첫 번째 프레임",[2056,30743,30744],{},[28,30745,30507],{},[2056,30747,30748],{},"비디오의 정확한 시작 비주얼을 고정합니다",[2041,30750,30751,30756,30761],{},[2056,30752,30753],{},[23,30754,30755],{},"마지막 프레임",[2056,30757,30758],{},[28,30759,30760],{},"@Image2 as the last frame",[2056,30762,30763],{},"전환을 위한 종료 비주얼을 정의합니다",[2041,30765,30766,30771,30775],{},[2056,30767,30768],{},[23,30769,30770],{},"캐릭터 아이덴티티",[2056,30772,30773],{},[28,30774,25909],{},[2056,30776,30777],{},"비디오 전체에서 얼굴/체형 일관성을 유지합니다",[2041,30779,30780,30785,30790],{},[2056,30781,30782],{},[23,30783,30784],{},"스타일 레퍼런스",[2056,30786,30787],{},[28,30788,30789],{},"reference @Image1's art style",[2056,30791,30792],{},"회화 스타일, 색상 팔레트, 비주얼 미학을 적용합니다",[2041,30794,30795,30800,30805],{},[2056,30796,30797],{},[23,30798,30799],{},"장면/환경",[2056,30801,30802],{},[28,30803,30804],{},"scene references @Image3",[2056,30806,30807],{},"장소, 배경, 건축물을 설정합니다",[2041,30809,30810,30815,30820],{},[2056,30811,30812],{},[23,30813,30814],{},"오브젝트 레퍼런스",[2056,30816,30817],{},[28,30818,30819],{},"the product in @Image1",[2056,30821,30822],{},"광고용 제품 디테일을 유지합니다",[2041,30824,30825,30829,30834],{},[2056,30826,30827],{},[23,30828,23822],{},[2056,30830,30831],{},[28,30832,30833],{},"framing references @Image1",[2056,30835,30836],{},"카메라 앵글과 레이아웃을 복제합니다",[92,30838,30840],{"id":30839},"예시-반-고흐-스타일-트랜스퍼","예시: 반 고흐 스타일 트랜스퍼",[11,30842,30843],{},[23,30844,11997],{},[137,30846,30849],{"className":30847,"code":30848,"language":2183},[2181],"A young woman with long blonde hair in a blue dress stands on a hilltop,\ngazing at a Provençal village at sunset. Entirely rendered in @Image1's\npost-impressionist art style — thick impasto brushstrokes, swirling textures,\nrich yellows and blues.\n",[28,30850,30848],{"__ignoreMap":142},[11,30852,30853,30856],{},[23,30854,30855],{},"입력:"," 반 고흐 그림 1장을 @Image1으로 사용",[11,30858,30859,30862],{},[23,30860,30861],{},"결과:"," 모델이 반 고흐의 시그니처 스타일로 전체 장면을 렌더링합니다 — 단순한 필터 오버레이가 아니라 비디오 전체에서 붓터치 질감이 유지되는 진정한 스타일 트랜스퍼입니다.",[56,30864,60,30865],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30866],{"src":24417,"type":65},[11,30868,30869],{},[2621,30870,30871],{},"비디오: @Image 레퍼런스를 활용한 스타일 트랜스퍼 — 반 고흐 후기인상주의 렌더링",[92,30873,30875],{"id":30874},"예시-제품-광고","예시: 제품 광고",[11,30877,30878],{},[23,30879,11997],{},[137,30881,30884],{"className":30882,"code":30883,"language":2183},[2181],"Commercial showcase of the handbag in @Image2.\nSide profile references @Image1.\nSurface material texture references @Image3.\nDisplay all product details with cinematic camera movement.\nGrand orchestral background music.\n",[28,30885,30883],{"__ignoreMap":142},[11,30887,30888,30890],{},[23,30889,30855],{}," 이미지 3장 — 측면 뷰, 메인 제품 사진, 소재 클로즈업",[11,30892,30893,30895],{},[23,30894,30861],{}," 레퍼런스 이미지의 정확한 소재 질감과 비율을 유지하는 완성도 높은 제품 비디오 — AI가 제품 디테일을 임의로 변형하지 않습니다.",[92,30897,30899],{"id":30898},"다중-이미지-캐릭터-일관성","다중 이미지 캐릭터 일관성",[11,30901,30902],{},"여러 촬영에서 동일한 캐릭터가 필요한 경우, 다양한 각도의 레퍼런스 이미지를 여러 장 업로드합니다:",[137,30904,30907],{"className":30905,"code":30906,"language":2183},[2181],"@Image1 and @Image2 define the main character's appearance.\nThe character walks through @Image3's environment,\nwearing the outfit from @Image4.\n",[28,30908,30906],{"__ignoreMap":142},[11,30910,30911],{},"캐릭터에 대한 레퍼런스 이미지를 많이 제공할수록 출력의 일관성이 높아집니다. 이 방법은 단일 이미지 생성에서 자주 발생하는 \"얼굴 변형\" 문제를 해결합니다.",[45,30913],{},[48,30915,30917],{"id":30916},"비디오-tags-카메라-및-모션-복제","비디오 @Tags — 카메라 및 모션 복제",[11,30919,30920,30921,30924],{},"비디오 레퍼런스는 Seedance 2.0의 가장 강력한 기능을 이끌어 냅니다: ",[23,30922,30923],{},"카메라 워크와 물리적 모션의 정밀한 복제",". 레퍼런스 비디오를 업로드하면 모델이 정확한 촬영 기법, 액션 안무, 또는 시각 효과를 복제합니다.",[92,30926,30928],{"id":30927},"비디오-레퍼런스-유형","비디오 레퍼런스 유형",[2035,30930,30931,30942],{},[2038,30932,30933],{},[2041,30934,30935,30937,30939],{},[2044,30936,25897],{},[2044,30938,2982],{},[2044,30940,30941],{},"복제되는 요소",[2051,30943,30944,30958,30973,30987,31002],{},[2041,30945,30946,30950,30955],{},[2056,30947,30948],{},[23,30949,4156],{},[2056,30951,30952],{},[28,30953,30954],{},"reference @Video1's camera movement",[2056,30956,30957],{},"팬, 틸트, 돌리, 트래킹, 줌 패턴",[2041,30959,30960,30965,30970],{},[2056,30961,30962],{},[23,30963,30964],{},"액션/안무",[2056,30966,30967],{},[28,30968,30969],{},"perform the actions from @Video1",[2056,30971,30972],{},"몸동작, 댄스 스텝, 격투 안무",[2041,30974,30975,30979,30984],{},[2056,30976,30977],{},[23,30978,11530],{},[2056,30980,30981],{},[28,30982,30983],{},"reference @Video1's transition effects",[2056,30985,30986],{},"파티클 효과, 스타일 전환, VFX",[2041,30988,30989,30994,30999],{},[2056,30990,30991],{},[23,30992,30993],{},"리듬/페이싱",[2056,30995,30996],{},[28,30997,30998],{},"match @Video1's editing rhythm",[2056,31000,31001],{},"컷 타이밍, 비트 싱크, 템포",[2041,31003,31004,31009,31014],{},[2056,31005,31006],{},[23,31007,31008],{},"전체 복제",[2056,31010,31011],{},[28,31012,31013],{},"completely reference @Video1",[2056,31015,31016],{},"모든 요소 — 카메라, 액션, 효과, 페이싱",[92,31018,31020],{"id":31019},"예시-시네마틱-카메라-복제","예시: 시네마틱 카메라 복제",[11,31022,31023],{},[23,31024,11997],{},[137,31026,31029],{"className":31027,"code":31028,"language":2183},[2181],"Reference @Image1's character. He is in @Image2's elevator.\nCompletely reference @Video1's camera movements and the protagonist's\nfacial expressions. Hitchcock zoom when the character is frightened,\nthen several orbiting shots inside the elevator.\nThe elevator door opens, tracking shot follows him out.\nExterior scene references @Image3.\n",[28,31030,31028],{"__ignoreMap":142},[11,31032,31033,31035],{},[23,31034,30855],{}," 이미지 3장 (캐릭터, 엘리베이터 내부, 외부 장면) + 레퍼런스 비디오 1개 (원하는 카메라 워크 포함)",[11,31037,31038,31040],{},[23,31039,30861],{}," 모델이 레퍼런스 비디오의 정확한 히치콕 줌, 오비탈 카메라 움직임, 트래킹 샷을 재현합니다 — 완전히 다른 캐릭터와 배경에 적용됩니다.",[92,31042,31044],{"id":31043},"복제-가능한-카메라-기법","복제 가능한 카메라 기법",[11,31046,31047],{},"Seedance 2.0은 레퍼런스 비디오에서 다음 카메라 움직임을 재현할 수 있습니다:",[97,31049,31050,31056,31062,31068,31073,31078,31083,31088],{},[73,31051,31052,31055],{},[23,31053,31054],{},"히치콕 줌"," (돌리 줌 / 버티고 효과)",[73,31057,31058,31061],{},[23,31059,31060],{},"360도 오비트"," 피사체 주위 회전",[73,31063,31064,31067],{},[23,31065,31066],{},"원테이크 연속 촬영"," (컷 없음)",[73,31069,31070],{},[23,31071,31072],{},"기계식 암 다각도 트래킹",[73,31074,31075],{},[23,31076,31077],{},"로우앵글 히어로 샷",[73,31079,31080],{},[23,31081,31082],{},"핸드헬드 추적 카메라",[73,31084,31085],{},[23,31086,31087],{},"피쉬아이 렌즈 왜곡",[73,31089,31090],{},[23,31091,31092],{},"푸시-풀 리드미컬 무브먼트",[11,31094,31095,31098,31099,31102],{},[23,31096,31097],{},"프롬프트 팁:"," 레퍼런스 비디오에서 어떤 측면을 복제할지 구체적으로 지정하세요. \"Reference @Video1's camera movement\"가 단순히 \"reference @Video1\"보다 효과적입니다 — 모델에게 모든 것을 복제하려고 하지 않고 촬영 기법에 집중하도록 지시하기 때문입니다. 더 많은 카메라 레퍼런스 예시와 완전한 Python 코드는 ",[37,31100,31101],{"href":3860},"카메라 움직임 전용 튜토리얼","을 참고하세요.",[92,31104,31106],{"id":31105},"예시-액션-파쿠르","예시: 액션 파쿠르",[56,31108,60,31109],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31110],{"src":12259,"type":65},[11,31112,31113],{},[2621,31114,31115],{},"비디오: 시네마틱 트래킹 샷으로 생성된 다이내믹 파쿠르 — 카메라 움직임 레퍼런스 활용",[45,31117],{},[48,31119,31121],{"id":31120},"오디오-tags-레퍼런스를-활용한-사운드-디자인","오디오 @Tags — 레퍼런스를 활용한 사운드 디자인",[11,31123,31124],{},"Seedance 2.0은 모든 비디오에 네이티브 오디오를 생성합니다 — 효과음, 앰비언트 노이즈, 음악, 그리고 대사까지. 오디오 @tags를 사용하면 사운드를 직접 제어할 수 있습니다.",[92,31126,31128],{"id":31127},"오디오-레퍼런스-유형","오디오 레퍼런스 유형",[2035,31130,31131,31141],{},[2038,31132,31133],{},[2041,31134,31135,31137,31139],{},[2044,31136,25897],{},[2044,31138,2982],{},[2044,31140,30941],{},[2051,31142,31143,31158,31173,31188],{},[2041,31144,31145,31150,31155],{},[2056,31146,31147],{},[23,31148,31149],{},"배경 음악",[2056,31151,31152],{},[28,31153,31154],{},"use @Audio1 for background music",[2056,31156,31157],{},"음악 스타일, 템포, 악기",[2041,31159,31160,31165,31170],{},[2056,31161,31162],{},[23,31163,31164],{},"효과음",[2056,31166,31167],{},[28,31168,31169],{},"sound effects reference @Audio1",[2056,31171,31172],{},"특정 사운드 텍스처와 타이밍",[2041,31174,31175,31180,31185],{},[2056,31176,31177],{},[23,31178,31179],{},"보이스/내레이션 스타일",[2056,31181,31182],{},[28,31183,31184],{},"narration voice references @Video1",[2056,31186,31187],{},"보컬 톤, 말하기 속도, 억양",[2041,31189,31190,31195,31200],{},[2056,31191,31192],{},[23,31193,31194],{},"비트 싱크",[2056,31196,31197],{},[28,31198,31199],{},"match @Audio1's rhythm for editing cuts",[2056,31201,31202],{},"음악 비트에 따른 비주얼 전환",[92,31204,31206],{"id":31205},"비트-싱크로나이제이션-뮤직-비디오-모드","비트 싱크로나이제이션 (뮤직 비디오 모드)",[11,31208,31209,31210,4516],{},"가장 강력한 오디오 기능 중 하나입니다: 음악 트랙을 업로드하면 모델이 ",[23,31211,31212],{},"비주얼 컷과 전환을 비트에 맞춰 동기화합니다",[11,31214,31215],{},[23,31216,11997],{},[137,31218,31221],{"className":31219,"code":31220,"language":2183},[2181],"@Image1 through @Image7 as scene references.\nMatch @Video1's visual rhythm and beat synchronization.\nEach image appears on a music beat with dynamic transitions.\nEnhance visual impact with dramatic lighting changes on each cut.\n",[28,31222,31220],{"__ignoreMap":142},[11,31224,31225,31227],{},[23,31226,30861],{}," 모델이 뮤직비디오 스타일의 편집을 생성하여 장면 전환, 카메라 움직임, 조명 변화가 레퍼런스 오디오의 비트에 정확히 맞춰 발생합니다.",[92,31229,31231],{"id":31230},"비디오-오디오를-레퍼런스로-활용","비디오 오디오를 레퍼런스로 활용",[11,31233,31234],{},"별도의 오디오 파일이 필요 없습니다 — 업로드된 비디오의 오디오 트랙을 참조할 수 있습니다:",[137,31236,31239],{"className":31237,"code":31238,"language":2183},[2181],"Background music references @Video1's audio.\n",[28,31240,31238],{"__ignoreMap":142},[11,31242,31243],{},"기존 비디오의 사운드 디자인을 유지하면서 비주얼만 변경하고 싶을 때 유용합니다.",[92,31245,31247],{"id":31246},"예시-캐릭터-대화","예시: 캐릭터 대화",[56,31249,60,31250],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31251],{"src":31252,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8C%AB%E7%8B%97%E8%B0%88%E5%BF%83.mp4",[11,31254,31255],{},[2621,31256,31257],{},"비디오: 자연스러운 성우 연기와 앰비언트 카페 사운드가 포함된 AI 생성 캐릭터 대화",[11,31259,31260],{},"Seedance 2.0은 영어, 중국어, 스페인어, 한국어 등 다국어 대화 생성을 지원합니다. 프롬프트에 대사를 직접 작성하면 모델이 매칭되는 립싱크와 성우 연기를 생성합니다.",[45,31262],{},[48,31264,31266],{"id":31265},"고급-조합-멀티모달-레시피","고급 조합 — 멀티모달 레시피",[11,31268,31269],{},"@tags의 진정한 위력은 여러 모달리티를 결합할 때 발휘됩니다. 일반적인 프로덕션 시나리오에 적합한 세 가지 검증된 레시피를 소개합니다.",[92,31271,31273],{"id":31272},"레시피-1-시네마틱-숏-필름","레시피 1: 시네마틱 숏 필름",[11,31275,31276,31279],{},[23,31277,31278],{},"목표:"," 특정 캐릭터, 카메라 워크, 사운드트랙을 갖춘 영화 수준의 장면",[11,31281,31282],{},[23,31283,31284],{},"파일:",[97,31286,31287,31290,31293,31296],{},[73,31288,31289],{},"@Image1: 캐릭터 얼굴/체형 레퍼런스",[73,31291,31292],{},"@Image2: 환경/장소 레퍼런스",[73,31294,31295],{},"@Video1: 카메라 움직임 레퍼런스 (예: 영화의 트래킹 샷)",[73,31297,31298],{},"@Audio1: 배경 음악 트랙",[11,31300,31301],{},[23,31302,11997],{},[137,31304,31307],{"className":31305,"code":31306,"language":2183},[2181],"@Image1's character walks through @Image2's environment.\nCamera movement follows @Video1's tracking shot pattern.\nBackground music uses @Audio1.\nCinematic lighting, shallow depth of field, 24fps film grain.\n",[28,31308,31306],{"__ignoreMap":142},[11,31310,31311,31314],{},[23,31312,31313],{},"파일 할당:"," 이미지 2개 + 비디오 1개 + 오디오 1개 = 12개 중 4개 사용",[92,31316,31318],{"id":31317},"레시피-2-이커머스-제품-비디오","레시피 2: 이커머스 제품 비디오",[11,31320,31321,31323],{},[23,31322,31278],{}," 정적인 제품 사진으로 전문적인 제품 쇼케이스 제작",[11,31325,31326],{},[23,31327,31284],{},[97,31329,31330,31333,31336,31339],{},[73,31331,31332],{},"@Image1: 제품 메인 샷",[73,31334,31335],{},"@Image2: 제품 측면 뷰",[73,31337,31338],{},"@Image3: 소재/텍스처 클로즈업",[73,31340,31341],{},"@Video1: 카메라 움직임 레퍼런스 (제품 주위 오비팅 샷)",[11,31343,31344],{},[23,31345,11997],{},[137,31347,31350],{"className":31348,"code":31349,"language":2183},[2181],"Commercial showcase of the product in @Image2.\nSide profile references @Image1.\nSurface material and texture reference @Image3.\nCamera movement references @Video1's orbiting rotation.\nStudio lighting, reflective dark surface, premium aesthetic.\n",[28,31351,31349],{"__ignoreMap":142},[11,31353,31354,31356],{},[23,31355,31313],{}," 이미지 3개 + 비디오 1개 = 12개 중 4개 사용",[92,31358,31360],{"id":31359},"레시피-3-다중-캐릭터-애니메이션","레시피 3: 다중 캐릭터 애니메이션",[11,31362,31363,31365],{},[23,31364,31278],{}," 안무된 액션으로 두 캐릭터가 상호작용하는 장면",[11,31367,31368],{},[23,31369,31284],{},[97,31371,31372,31375,31378,31381],{},[73,31373,31374],{},"@Image1, @Image2: 캐릭터 A (정면 + 측면 레퍼런스)",[73,31376,31377],{},"@Image3, @Image4: 캐릭터 B (정면 + 측면 레퍼런스)",[73,31379,31380],{},"@Image5: 배경/장면 레퍼런스",[73,31382,31383],{},"@Video1: 액션 안무 레퍼런스",[11,31385,31386],{},[23,31387,11997],{},[137,31389,31392],{"className":31390,"code":31391,"language":2183},[2181],"@Image1 and @Image2 define Character A (spear wielder).\n@Image3 and @Image4 define Character B (dual swords).\nThey fight in @Image5's autumn forest, mimicking @Video1's\ncombat choreography. White dust rises on impact.\nDramatic star-filled night sky.\n",[28,31393,31391],{"__ignoreMap":142},[11,31395,31396,31398],{},[23,31397,31313],{}," 이미지 5개 + 비디오 1개 = 12개 중 6개 사용",[92,31400,31402],{"id":31401},"_12개-파일-예산-할당-전략","12개 파일 예산: 할당 전략",[11,31404,31405],{},"12개의 슬롯이 있습니다. 최대 효과를 위한 할당 방법은 다음과 같습니다:",[2035,31407,31408,31420],{},[2038,31409,31410],{},[2041,31411,31412,31415,31418],{},[2044,31413,31414],{},"우선순위",[2044,31416,31417],{},"할당",[2044,31419,8274],{},[2051,31421,31422,31434,31447,31459,31472,31484],{},[2041,31423,31424,31428,31431],{},[2056,31425,31426],{},[23,31427,30770],{},[2056,31429,31430],{},"캐릭터당 이미지 2~3개",[2056,31432,31433],{},"각도가 많을수록 일관성이 향상됩니다",[2041,31435,31436,31441,31444],{},[2056,31437,31438],{},[23,31439,31440],{},"카메라/모션 레퍼런스",[2056,31442,31443],{},"비디오 1개",[2056,31445,31446],{},"좋은 레퍼런스 하나면 충분합니다",[2041,31448,31449,31453,31456],{},[2056,31450,31451],{},[23,31452,30799],{},[2056,31454,31455],{},"이미지 1~2개",[2056,31457,31458],{},"세계관을 설정합니다",[2041,31460,31461,31466,31469],{},[2056,31462,31463],{},[23,31464,31465],{},"오디오/음악",[2056,31467,31468],{},"오디오 1개 또는 비디오 1개 (오디오 트랙 활용)",[2056,31470,31471],{},"분위기를 설정합니다",[2041,31473,31474,31478,31481],{},[2056,31475,31476],{},[23,31477,30784],{},[2056,31479,31480],{},"이미지 1개 (필요시)",[2056,31482,31483],{},"비사실적 스타일을 원할 때만 사용합니다",[2041,31485,31486,31491,31494],{},[2056,31487,31488],{},[23,31489,31490],{},"예비",[2056,31492,31493],{},"2~3개 슬롯 확보",[2056,31495,31496],{},"반복 작업과 추가 디테일을 위해 남겨둡니다",[11,31498,31499,31502],{},[23,31500,31501],{},"프로 팁:"," 12개 슬롯을 모두 사용하지 마세요. 4~6개 파일로 시작하고 출력에 더 높은 정밀도가 필요한 경우에만 추가하세요. 레퍼런스를 과도하게 사용하면 모델에 혼란을 줄 수 있습니다.",[92,31504,31506],{"id":31505},"api-호출-예시","API 호출 예시",[11,31508,31509],{},"멀티모달 생성이 API를 통해 어떻게 이루어지는지 살펴보겠습니다:",[137,31511,31513],{"className":338,"code":31512,"language":340,"meta":142,"style":142},"import requests\n\nresponse = requests.post(\n    \"https://api.evolink.ai/v1/videos/generations\",\n    headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the main character. \"\n            \"@Image2 as the environment. \"\n            \"Reference @Video1's tracking shot and camera movement. \"\n            \"The character walks through a misty forest at dawn. \"\n            \"Cinematic lighting, shallow depth of field.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character.jpg\",\n            \"https://your-cdn.com/forest.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/tracking-shot.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n        \"generate_audio\": true\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Generation started: {task_id}\")\n",[28,31514,31515,31521,31525,31533,31540,31558,31566,31576,31582,31587,31592,31597,31602,31607,31611,31617,31624,31629,31633,31639,31644,31648,31658,31668,31675,31679,31683,31687,31699],{"__ignoreMap":142},[146,31516,31517,31519],{"class":148,"line":149},[146,31518,347],{"class":259},[146,31520,329],{"class":263},[146,31522,31523],{"class":148,"line":167},[146,31524,376],{"emptyLinePlaceholder":58},[146,31526,31527,31529,31531],{"class":148,"line":179},[146,31528,6532],{"class":263},[146,31530,267],{"class":259},[146,31532,1432],{"class":263},[146,31534,31535,31538],{"class":148,"line":188},[146,31536,31537],{"class":160},"    \"https://api.evolink.ai/v1/videos/generations\"",[146,31539,452],{"class":263},[146,31541,31542,31544,31546,31548,31551,31553,31556],{"class":148,"line":373},[146,31543,6554],{"class":701},[146,31545,267],{"class":259},[146,31547,685],{"class":263},[146,31549,31550],{"class":160},"\"Authorization\"",[146,31552,437],{"class":263},[146,31554,31555],{"class":160},"\"Bearer YOUR_EVOLINK_API_KEY\"",[146,31557,19596],{"class":263},[146,31559,31560,31562,31564],{"class":148,"line":379},[146,31561,6565],{"class":701},[146,31563,267],{"class":259},[146,31565,1864],{"class":263},[146,31567,31568,31570,31572,31574],{"class":148,"line":385},[146,31569,1303],{"class":160},[146,31571,437],{"class":263},[146,31573,1308],{"class":160},[146,31575,452],{"class":263},[146,31577,31578,31580],{"class":148,"line":409},[146,31579,1319],{"class":160},[146,31581,1322],{"class":263},[146,31583,31584],{"class":148,"line":420},[146,31585,31586],{"class":160},"            \"@Image1 as the main character. \"\n",[146,31588,31589],{"class":148,"line":431},[146,31590,31591],{"class":160},"            \"@Image2 as the environment. \"\n",[146,31593,31594],{"class":148,"line":455},[146,31595,31596],{"class":160},"            \"Reference @Video1's tracking shot and camera movement. \"\n",[146,31598,31599],{"class":148,"line":466},[146,31600,31601],{"class":160},"            \"The character walks through a misty forest at dawn. \"\n",[146,31603,31604],{"class":148,"line":600},[146,31605,31606],{"class":160},"            \"Cinematic lighting, shallow depth of field.\"\n",[146,31608,31609],{"class":148,"line":605},[146,31610,1342],{"class":263},[146,31612,31613,31615],{"class":148,"line":611},[146,31614,2690],{"class":160},[146,31616,2693],{"class":263},[146,31618,31619,31622],{"class":148,"line":617},[146,31620,31621],{"class":160},"            \"https://your-cdn.com/character.jpg\"",[146,31623,452],{"class":263},[146,31625,31626],{"class":148,"line":623},[146,31627,31628],{"class":160},"            \"https://your-cdn.com/forest.jpg\"\n",[146,31630,31631],{"class":148,"line":628},[146,31632,2703],{"class":263},[146,31634,31635,31637],{"class":148,"line":639},[146,31636,12162],{"class":160},[146,31638,2693],{"class":263},[146,31640,31641],{"class":148,"line":654},[146,31642,31643],{"class":160},"            \"https://your-cdn.com/tracking-shot.mp4\"\n",[146,31645,31646],{"class":148,"line":660},[146,31647,2703],{"class":263},[146,31649,31650,31652,31654,31656],{"class":148,"line":671},[146,31651,1347],{"class":160},[146,31653,437],{"class":263},[146,31655,537],{"class":156},[146,31657,452],{"class":263},[146,31659,31660,31662,31664,31666],{"class":148,"line":698},[146,31661,1363],{"class":160},[146,31663,437],{"class":263},[146,31665,3714],{"class":160},[146,31667,452],{"class":263},[146,31669,31670,31672],{"class":148,"line":710},[146,31671,1395],{"class":160},[146,31673,31674],{"class":263},": true\n",[146,31676,31677],{"class":148,"line":716},[146,31678,1407],{"class":263},[146,31680,31681],{"class":148,"line":722},[146,31682,406],{"class":263},[146,31684,31685],{"class":148,"line":728},[146,31686,376],{"emptyLinePlaceholder":58},[146,31688,31689,31691,31693,31695,31697],{"class":148,"line":739},[146,31690,12204],{"class":263},[146,31692,267],{"class":259},[146,31694,12209],{"class":263},[146,31696,1626],{"class":160},[146,31698,764],{"class":263},[146,31700,31701,31703,31705,31707,31710,31712,31714,31716,31718],{"class":148,"line":744},[146,31702,6587],{"class":156},[146,31704,794],{"class":263},[146,31706,440],{"class":259},[146,31708,31709],{"class":160},"\"Generation started: ",[146,31711,685],{"class":156},[146,31713,688],{"class":263},[146,31715,691],{"class":156},[146,31717,449],{"class":160},[146,31719,406],{"class":263},[11,31721,31722],{},"결과를 폴링합니다:",[137,31724,31726],{"className":338,"code":31725,"language":340,"meta":142,"style":142},"import time\n\nwhile True:\n    status = requests.get(\n        f\"https://api.evolink.ai/v1/tasks/{task_id}\",\n        headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"}\n    )\n    result = status.json()\n\n    if result[\"status\"] == \"completed\":\n        print(f\"Video ready: {result['results'][0]}\")\n        break\n    elif result[\"status\"] == \"failed\":\n        print(f\"Error: {result.get('error', 'Unknown error')}\")\n        break\n\n    time.sleep(5)\n",[28,31727,31728,31734,31738,31747,31755,31772,31788,31792,31801,31805,31821,31849,31854,31870,31899,31903,31907],{"__ignoreMap":142},[146,31729,31730,31732],{"class":148,"line":149},[146,31731,347],{"class":259},[146,31733,356],{"class":263},[146,31735,31736],{"class":148,"line":167},[146,31737,376],{"emptyLinePlaceholder":58},[146,31739,31740,31743,31745],{"class":148,"line":179},[146,31741,31742],{"class":259},"while",[146,31744,14865],{"class":156},[146,31746,860],{"class":263},[146,31748,31749,31751,31753],{"class":148,"line":188},[146,31750,7239],{"class":263},[146,31752,267],{"class":259},[146,31754,668],{"class":263},[146,31756,31757,31759,31762,31764,31766,31768,31770],{"class":148,"line":373},[146,31758,1437],{"class":259},[146,31760,31761],{"class":160},"\"https://api.evolink.ai/v1/tasks/",[146,31763,685],{"class":156},[146,31765,688],{"class":263},[146,31767,691],{"class":156},[146,31769,449],{"class":160},[146,31771,452],{"class":263},[146,31773,31774,31776,31778,31780,31782,31784,31786],{"class":148,"line":379},[146,31775,1455],{"class":701},[146,31777,267],{"class":259},[146,31779,685],{"class":263},[146,31781,31550],{"class":160},[146,31783,437],{"class":263},[146,31785,31555],{"class":160},[146,31787,469],{"class":263},[146,31789,31790],{"class":148,"line":385},[146,31791,1483],{"class":263},[146,31793,31794,31796,31798],{"class":148,"line":409},[146,31795,1618],{"class":263},[146,31797,267],{"class":259},[146,31799,31800],{"class":263}," status.json()\n",[146,31802,31803],{"class":148,"line":420},[146,31804,376],{"emptyLinePlaceholder":58},[146,31806,31807,31809,31811,31813,31815,31817,31819],{"class":148,"line":431},[146,31808,2508],{"class":259},[146,31810,1648],{"class":263},[146,31812,761],{"class":160},[146,31814,14937],{"class":263},[146,31816,854],{"class":259},[146,31818,857],{"class":160},[146,31820,860],{"class":263},[146,31822,31823,31825,31827,31829,31831,31833,31835,31837,31839,31841,31843,31845,31847],{"class":148,"line":455},[146,31824,791],{"class":156},[146,31826,794],{"class":263},[146,31828,440],{"class":259},[146,31830,11817],{"class":160},[146,31832,685],{"class":156},[146,31834,11822],{"class":263},[146,31836,11825],{"class":160},[146,31838,1562],{"class":263},[146,31840,783],{"class":156},[146,31842,1535],{"class":263},[146,31844,691],{"class":156},[146,31846,449],{"class":160},[146,31848,406],{"class":263},[146,31850,31851],{"class":148,"line":466},[146,31852,31853],{"class":259},"        break\n",[146,31855,31856,31858,31860,31862,31864,31866,31868],{"class":148,"line":600},[146,31857,7525],{"class":259},[146,31859,1648],{"class":263},[146,31861,761],{"class":160},[146,31863,14937],{"class":263},[146,31865,854],{"class":259},[146,31867,882],{"class":160},[146,31869,860],{"class":263},[146,31871,31872,31874,31876,31878,31881,31883,31885,31887,31889,31891,31893,31895,31897],{"class":148,"line":605},[146,31873,791],{"class":156},[146,31875,794],{"class":263},[146,31877,440],{"class":259},[146,31879,31880],{"class":160},"\"Error: ",[146,31882,685],{"class":156},[146,31884,11871],{"class":263},[146,31886,11874],{"class":160},[146,31888,400],{"class":263},[146,31890,943],{"class":160},[146,31892,118],{"class":263},[146,31894,691],{"class":156},[146,31896,449],{"class":160},[146,31898,406],{"class":263},[146,31900,31901],{"class":148,"line":611},[146,31902,31853],{"class":259},[146,31904,31905],{"class":148,"line":617},[146,31906,376],{"emptyLinePlaceholder":58},[146,31908,31909,31911,31913],{"class":148,"line":623},[146,31910,19908],{"class":263},[146,31912,1352],{"class":156},[146,31914,406],{"class":263},[11,31916,31917,31920],{},[37,31918,11354],{"href":212,"rel":31919},[41],"로 이 코드를 실행해 보세요. 가입은 무료이며 신용카드가 필요하지 않습니다.",[45,31922],{},[48,31924,13189],{"id":13188},[92,31926,31928],{"id":31927},"tag의-목적을-지정하지-않는-경우","@tag의 목적을 지정하지 않는 경우",[11,31930,31931,2424,31933],{},[23,31932,13198],{},[28,31934,31935],{},"@Image1 @Video1 generate a video of a dancer",[11,31937,31938,2424,31940],{},[23,31939,13215],{},[28,31941,31942],{},"@Image1 as the dancer's appearance reference. @Video1 for dance choreography and camera movement. Generate the dancer performing on a stage.",[11,31944,31945],{},"모델은 명시적인 역할 지정이 필요합니다. 지정하지 않으면 추측하게 되고 — 잘못 추측합니다.",[92,31947,31949],{"id":31948},"저해상도-입력-파일","저해상도 입력 파일",[11,31951,31952],{},"@Image1이 480p라면 출력이 흐릿하게 보일 것입니다. 항상 다음을 사용하세요:",[97,31954,31955,31958,31961],{},[73,31956,31957],{},"이미지: 2K 이상 해상도",[73,31959,31960],{},"비디오: 720p, 압축 아티팩트 없는 깨끗한 영상",[73,31962,31963],{},"오디오: 128kbps 이상 MP3 또는 무손실 WAV",[92,31965,31967],{"id":31966},"_12개-파일-슬롯을-모두-사용하려는-경우","12개 파일 슬롯을 모두 사용하려는 경우",[11,31969,31970],{},"레퍼런스가 많다고 출력이 더 좋아지는 것은 아닙니다. 3~5개 파일로 시작하고 필요한 경우에만 추가하세요. 서로 충돌하는 레퍼런스가 너무 많으면 모델에 혼란을 줍니다.",[92,31972,31974],{"id":31973},"실사-인물-얼굴-사진-업로드","실사 인물 얼굴 사진 업로드",[11,31976,31977,31980],{},[23,31978,31979],{},"플랫폼 제한:"," Seedance 2.0은 현재 실사 인물 얼굴이 포함된 이미지나 비디오 업로드를 지원하지 않습니다. 시스템이 자동으로 이러한 업로드를 차단합니다. 대신 일러스트, 애니메이션 스타일 또는 양식화된 캐릭터 레퍼런스를 사용하세요.",[92,31982,31984],{"id":31983},"에셋-번호-혼동","에셋 번호 혼동",[11,31986,31987],{},"이미지 3개와 비디오 2개를 업로드하면, 번호는 유형별로 독립적으로 매겨집니다:",[97,31989,31990,31993],{},[73,31991,31992],{},"이미지: @Image1, @Image2, @Image3",[73,31994,31995],{},"비디오: @Video1, @Video2",[11,31997,31998,32001,32002,32005],{},[28,31999,32000],{},"@File3","이나 ",[28,32003,32004],{},"@Asset5","와 같이 작성하지 마세요 — 유형별 번호 체계를 사용하세요.",[92,32007,32009],{"id":32008},"비디오-연장-시-잘못된-재생-시간-설정","비디오 연장 시 잘못된 재생 시간 설정",[11,32011,32012],{},"기존 비디오를 5초 연장하는 경우, 생성 재생 시간을 총 길이가 아닌 5초(새로 추가되는 부분)로 설정하세요. 연장된 부분은 원본에 이어 붙여집니다.",[45,32014],{},[48,32016,13302],{"id":13301},[92,32018,32020],{"id":32019},"한-번의-생성에-몇-개의-파일을-업로드할-수-있나요","한 번의 생성에 몇 개의 파일을 업로드할 수 있나요?",[11,32022,32023],{},"최대 12개 파일을 업로드할 수 있습니다: 이미지 최대 9개, 비디오 3개, 오디오 클립 3개. 비디오의 합산 재생 시간은 2초에서 15초 사이여야 합니다. 오디오 클립의 합산 재생 시간은 최대 15초입니다.",[92,32025,32027],{"id":32026},"api를-통해-tags를-사용할-수-있나요","API를 통해 @tags를 사용할 수 있나요?",[11,32029,32030,32031,400,32033,400,32035,32037],{},"네. API를 호출할 때 JSON 요청 본문에 ",[28,32032,2898],{},[28,32034,3570],{},[28,32036,3587],{}," 배열을 전달하세요. 각 배열에는 레퍼런스 파일의 직접 URL이 포함됩니다. @tag 번호 매기기(@Image1, @Image2...)는 각 배열 내 URL의 순서에 해당합니다. 프롬프트 텍스트는 UI와 동일한 @tag 문법을 사용합니다.",[92,32039,32041],{"id":32040},"tag에-역할을-지정하지-않으면-어떻게-되나요","@tag에 역할을 지정하지 않으면 어떻게 되나요?",[11,32043,32044,32045,32047,32048,32050],{},"모델이 파일 내용과 프롬프트 컨텍스트를 기반으로 목적을 추론하려고 시도합니다. 그러나 이 방식은 신뢰할 수 없습니다. 항상 각 태그의 역할을 명시적으로 지정하세요 — 예를 들어 ",[28,32046,2911],{},"을 맥락 없이 언급하기보다는 ",[28,32049,30507],{},"으로 작성하세요.",[92,32052,32054],{"id":32053},"업로드한-비디오-파일의-오디오를-참조할-수-있나요","업로드한 비디오 파일의 오디오를 참조할 수 있나요?",[11,32056,32057,32058,32061],{},"네. 프롬프트에 ",[28,32059,32060],{},"background music references @Video1's audio","를 사용하세요. 모델이 비디오에서 오디오 트랙을 추출하여 별도의 오디오 파일 없이도 사운드 레퍼런스로 활용합니다.",[92,32063,32065],{"id":32064},"어떤-이미지와-비디오-형식이-지원되나요","어떤 이미지와 비디오 형식이 지원되나요?",[11,32067,32068],{},"이미지: JPEG, PNG, WebP, BMP, TIFF, GIF (각 최대 30 MB). 비디오: MP4, MOV (각 최대 50 MB, 480p~720p 해상도). 오디오: MP3, WAV (각 최대 15 MB).",[45,32070],{},[48,32072,32074],{"id":32073},"tags로-시작하기","@Tags로 시작하기",[11,32076,32077],{},"@tag 레퍼런스 시스템은 Seedance 2.0을 현재 사용 가능한 가장 제어 가능한 AI 비디오 생성기로 만드는 핵심 요소입니다. 원하는 것을 설명하고 운에 맡기는 대신, 모델에게 정확히 무엇을 의미하는지 보여주고 — 영화 촬영팀처럼 직접 연출할 수 있습니다.",[11,32079,32080],{},"핵심 원칙:",[70,32082,32083,32089,32095],{},[73,32084,32085,32088],{},[23,32086,32087],{},"모든 @tag에는 역할이 필요합니다."," 파일을 업로드하는 것만으로는 부족합니다 — 각 파일이 무엇을 하는지 모델에게 지시하세요.",[73,32090,32091,32094],{},[23,32092,32093],{},"작게 시작하고 정밀도를 높이세요."," 3~4개 레퍼런스로 시작하세요. 출력에 필요한 경우에만 추가하세요.",[73,32096,32097,32100],{},[23,32098,32099],{},"복제할 대상을 구체적으로 지정하세요."," \"Reference @Video1's camera movement\"가 \"reference @Video1\"보다 효과적입니다.",[11,32102,32103,32104,32108],{},"직접 AI 비디오를 연출할 준비가 되셨나요? ",[37,32105,32107],{"href":212,"rel":32106},[41],"EvoLink에서 무료로 시작하세요"," — Seedance 2.0과 모든 주요 AI 비디오 모델을 위한 하나의 API 키로, 스마트 라우팅을 통해 20~70% 비용을 절감할 수 있습니다.",[11,32110,32111],{},[23,32112,32113],{},"계속 학습하기:",[97,32115,32116],{},[73,32117,32118,32120],{},[37,32119,2209],{"href":1766}," — 프롬프트 작성의 기본을 마스터하세요",[45,32122],{},[11,32124,32125],{},[2621,32126,32127],{},"최종 업데이트: 2026년 2월 20일 | Written by J, Growth Lead at EvoLink",[11222,32129,32130],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":142,"searchDepth":167,"depth":167,"links":32132},[32133,32134,32139,32145,32151,32157,32164,32172,32179],{"id":30438,"depth":167,"text":30439},{"id":30532,"depth":167,"text":30533,"children":32135},[32136,32137,32138],{"id":30536,"depth":179,"text":30537},{"id":30585,"depth":179,"text":30586},{"id":30683,"depth":179,"text":30684},{"id":30712,"depth":167,"text":30713,"children":32140},[32141,32142,32143,32144],{"id":30719,"depth":179,"text":30720},{"id":30839,"depth":179,"text":30840},{"id":30874,"depth":179,"text":30875},{"id":30898,"depth":179,"text":30899},{"id":30916,"depth":167,"text":30917,"children":32146},[32147,32148,32149,32150],{"id":30927,"depth":179,"text":30928},{"id":31019,"depth":179,"text":31020},{"id":31043,"depth":179,"text":31044},{"id":31105,"depth":179,"text":31106},{"id":31120,"depth":167,"text":31121,"children":32152},[32153,32154,32155,32156],{"id":31127,"depth":179,"text":31128},{"id":31205,"depth":179,"text":31206},{"id":31230,"depth":179,"text":31231},{"id":31246,"depth":179,"text":31247},{"id":31265,"depth":167,"text":31266,"children":32158},[32159,32160,32161,32162,32163],{"id":31272,"depth":179,"text":31273},{"id":31317,"depth":179,"text":31318},{"id":31359,"depth":179,"text":31360},{"id":31401,"depth":179,"text":31402},{"id":31505,"depth":179,"text":31506},{"id":13188,"depth":167,"text":13189,"children":32165},[32166,32167,32168,32169,32170,32171],{"id":31927,"depth":179,"text":31928},{"id":31948,"depth":179,"text":31949},{"id":31966,"depth":179,"text":31967},{"id":31973,"depth":179,"text":31974},{"id":31983,"depth":179,"text":31984},{"id":32008,"depth":179,"text":32009},{"id":13301,"depth":167,"text":13302,"children":32173},[32174,32175,32176,32177,32178],{"id":32019,"depth":179,"text":32020},{"id":32026,"depth":179,"text":32027},{"id":32040,"depth":179,"text":32041},{"id":32053,"depth":179,"text":32054},{"id":32064,"depth":179,"text":32065},{"id":32073,"depth":167,"text":32074},"Seedance 2.0의 @tag 레퍼런스 시스템을 마스터하세요. 이미지, 비디오, 오디오 태깅 문법을 실제 예제와 프롬프트 템플릿으로 배워보세요. 무료로 시작할 수 있습니다.",{"date":13496,"image":32182,"seoTitle":32183},"/screenshot-20260220-193326.png","Seedance 2.0 @Tags 가이드: 멀티모달 레퍼런스 시스템 완벽 해설","/ko/blog/seedance-2-multimodal-tags-guide",{"title":13429,"description":32180},"ko/blog/seedance-2-multimodal-tags-guide","XAP9A-YbQp-dbu5k6bi-CKhSWxkSYX7PzrTWmeIo3Tk",{"id":32189,"title":13419,"body":32190,"description":38610,"extension":11284,"meta":38611,"navigation":58,"path":38614,"seo":38615,"stem":38616,"__hash__":38617},"content/ko/blog/seedance-2-prompt-guide.md",{"type":8,"value":32191,"toc":38561},[32192,32199,32207,32222,32234,32236,32239,32242,32247,32326,32330,32339,32342,32347,32351,32358,32361,32385,32388,32394,32399,32402,32407,32413,32418,32424,32428,32431,32455,32463,32470,32474,32480,32486,32492,32498,32501,32505,32508,32513,32992,32995,33001,33015,33017,33021,33026,33030,33078,33084,33090,33094,33180,33184,33258,33262,33320,33324,33327,33423,33430,33432,33436,33440,33444,33450,33454,33687,33691,33696,33700,33936,33940,33945,33950,34181,34185,34189,34200,34204,34433,34437,34445,34449,34723,34727,34735,34739,34980,34984,34993,34997,35341,35345,35349,35358,35363,35662,35666,35671,35676,35943,35947,35952,35956,36212,36216,36221,36226,36468,36472,36476,36481,36654,36658,36663,36836,36844,36846,36850,37041,37047,37049,37053,37057,37060,37348,37351,37355,37358,37399,37403,37406,37427,37433,37437,37440,37458,37468,37472,37475,37584,37587,37591,37594,37765,37768,37788,37790,37794,37798,37801,37928,37932,37935,38075,38079,38082,38238,38246,38248,38250,38254,38257,38261,38264,38295,38299,38313,38317,38320,38323,38334,38340,38344,38347,38358,38362,38376,38380,38383,38409,38413,38430,38434,38440,38444,38476,38480,38483,38500,38502,38505,38508,38511,38514,38525,38535,38551,38553,38558],[11,32193,32194,32195,32198],{},"Seedance 2.0은 텍스트, 이미지, 비디오 클립, 오디오 파일을 하나의 프롬프트에서 모두 처리합니다. 시네마틱한 결과를 얻는 핵심은 프롬프트를 어떻게 구성하고, 업로드한 미디어를 ",[28,32196,32197],{},"@Tags","로 어떻게 참조하느냐에 달려 있습니다.",[11,32200,32201,32202,32206],{},"ByteDance의 ",[37,32203,32205],{"href":17404,"rel":32204},[41],"Seed 비디오 파운데이션 모델","을 기반으로 구축된 Seedance 2.0은 API를 통해 사용할 수 있는 가장 강력한 멀티모달 비디오 생성 모델입니다.",[11,32208,32209,32210,32213,32214,32217,32218,32221],{},"이 가이드에서는 ",[23,32211,32212],{},"Seedance 2.0 프롬프트 공식","을 분석하고, ",[28,32215,32216],{},"@Tag"," 참조 시스템을 설명하며, 실제 작동하는 Python API 코드와 함께 ",[23,32219,32220],{},"15개 이상의 복사-붙여넣기 프롬프트 템플릿","을 제공합니다.",[18,32223,32224],{},[11,32225,32226,32229,32230,4516],{},[23,32227,32228],{},"코드 예제를 직접 실행해 보세요:"," 아래의 모든 코드를 실행하려면 ",[37,32231,32233],{"href":212,"rel":32232},[41],"EvoLink에서 무료 API 키를 받으세요",[45,32235],{},[48,32237,32212],{"id":32238},"seedance-20-프롬프트-공식",[11,32240,32241],{},"효과적인 Seedance 프롬프트는 다섯 가지 구조를 따릅니다:",[11,32243,32244],{},[23,32245,32246],{},"주체 + 행동 + 카메라 + 스타일 + 제약 조건",[2035,32248,32249,32261],{},[2038,32250,32251],{},[2041,32252,32253,32256,32259],{},[2044,32254,32255],{},"구성 요소",[2044,32257,32258],{},"제어 대상",[2044,32260,11479],{},[2051,32262,32263,32276,32289,32301,32313],{},[2041,32264,32265,32270,32273],{},[2056,32266,32267],{},[23,32268,32269],{},"주체",[2056,32271,32272],{},"화면에 나타나는 대상",[2056,32274,32275],{},"\"화성 위에 서 있는 흰색 우주복을 입은 우주비행사\"",[2041,32277,32278,32283,32286],{},[2056,32279,32280],{},[23,32281,32282],{},"행동",[2056,32284,32285],{},"움직임과 이벤트",[2056,32287,32288],{},"\"크레이터 가장자리에서 한 발짝 내딛는다\"",[2041,32290,32291,32295,32298],{},[2056,32292,32293],{},[23,32294,13244],{},[2056,32296,32297],{},"앵글, 움직임, 렌즈",[2056,32299,32300],{},"\"극단적 와이드 샷, 클로즈업으로 천천히 푸시인\"",[2041,32302,32303,32307,32310],{},[2056,32304,32305],{},[23,32306,24577],{},[2056,32308,32309],{},"시각적 미학",[2056,32311,32312],{},"\"SF 서사시, IMAX 70mm, 채도 낮은 틸-오렌지 팔레트\"",[2041,32314,32315,32320,32323],{},[2056,32316,32317],{},[23,32318,32319],{},"제약 조건",[2056,32321,32322],{},"길이, 해상도, 분위기",[2056,32324,32325],{},"\"10초, 사실적인 먼지 물리, 일관된 우주복 디자인\"",[92,32327,32329],{"id":32328},"이-공식이-효과적인-이유","이 공식이 효과적인 이유",[11,32331,32332,32333,32338],{},"Seedance 2.0은 이중 분기 ",[37,32334,32337],{"href":32335,"rel":32336},"https://arxiv.org/abs/2212.09748",[41],"Diffusion Transformer"," 아키텍처를 사용합니다. 한 분기는 공간 정보(사물의 외형)를 처리하고, 다른 분기는 시간 정보(시간에 따른 움직임)를 처리합니다. 잘 구성된 프롬프트는 두 분기 모두에 명확한 정보를 제공합니다.",[11,32340,32341],{},"*\"멋진 자동차 영상\"*과 같은 모호한 프롬프트는 모델이 공간적, 시간적 세부 사항을 추측하도록 만듭니다. 구조화된 프롬프트는 이러한 추측을 없애줍니다.",[11,32343,32344,32345,1260],{},"전체 API 파라미터 레퍼런스는 ",[37,32346,1259],{"href":14392},[92,32348,32350],{"id":32349},"고급-샷-스크립트-형식","고급: 샷 스크립트 형식",[11,32352,32353,32354,32357],{},"다섯 가지 공식은 훌륭한 출발점입니다. 하지만 소셜 미디어에서 입소문을 타는 최고 품질의 Seedance 2.0 결과물은 더 강력한 형식인 ",[23,32355,32356],{},"샷 스크립트","를 사용합니다.",[11,32359,32360],{},"샷 스크립트는 기본 공식 위에 세 가지 레이어를 추가합니다:",[70,32362,32363,32373,32379],{},[73,32364,32365,32368,32369,32372],{},[23,32366,32367],{},"타임코드"," — 비디오를 3~5초 단위로 나누고 명시적인 ",[28,32370,32371],{},"[00:00-00:05]"," 마커를 사용합니다",[73,32374,32375,32378],{},[23,32376,32377],{},"샷 언어"," — 각 샷의 이름과 기능을 명시합니다: \"Shot 1: The Scale (Extreme Wide Shot)\"",[73,32380,32381,32384],{},[23,32382,32383],{},"스타일 앵커 + 물리 디테일"," — 특정 감독/영화 스타일에 고정하고, 추상적 개념 대신 물리적 반응을 서술합니다",[11,32386,32387],{},"구조는 다음과 같습니다:",[137,32389,32392],{"className":32390,"code":32391,"language":2183},[2181],"【Style】특정 스타일 앵커 (감독명 / 영화 스타일 / 예술 사조)\n【Duration】전체 길이\n\n[00:00-00:04] Shot 1: 샷 이름 (카메라 유형).\n물리적 디테일이 포함된 장면 서술.\n구체적인 바디 랭귀지가 포함된 캐릭터 행동.\n오디오 큐.\n\n[00:04-00:07] Shot 2: 샷 이름 (카메라 유형).\n...\n\n[00:07-00:10] Shot 3: 샷 이름 (카메라 유형).\n...\n\n일관성 제약 조건. 물리 요구사항. 팔레트 참고사항.\n",[28,32393,32391],{"__ignoreMap":142},[32395,32396,32398],"h4",{"id":32397},"기본-공식-vs-샷-스크립트-나란히-비교","기본 공식 vs. 샷 스크립트: 나란히 비교",[11,32400,32401],{},"같은 콘셉트 — 화성 위의 우주비행사 — 를 두 가지 방식으로 작성하여 비교해 보겠습니다:",[11,32403,32404],{},[23,32405,32406],{},"기본 공식 (초보자에게 적합):",[137,32408,32411],{"className":32409,"code":32410,"language":2183},[2181],"An astronaut in a white spacesuit stands at the edge of a Mars crater.\nRed dust blows across the visor. Camera slowly pushes in to reveal\nEarth reflected in the helmet. Sci-fi epic style, desaturated\nteal-orange palette. 10 seconds.\n",[28,32412,32410],{"__ignoreMap":142},[11,32414,32415],{},[23,32416,32417],{},"샷 스크립트 (상급 크리에이터가 사용):",[137,32419,32422],{"className":32420,"code":32421,"language":2183},[2181],"【Style】Denis Villeneuve Sci-Fi Epic, IMAX 70mm, desaturated teal-orange palette.\n【Duration】10 seconds\n\n[00:00-00:04] Shot 1: The Scale (Extreme Wide Shot).\nA lone astronaut in a white spacesuit stands at the edge of an enormous\ncrater on Mars. Red dust blows across the visor in gusts. The crater\nstretches to the horizon — the scale of nature dwarfs the human figure\ncompletely. Deep rumbling bass audio.\n\n[00:04-00:07] Shot 2: The Discovery (Push-in to Close-up).\nCamera slowly pushes from the wide shot into a tight close-up of the\nastronaut's helmet visor. In the curved reflection, we see Earth — tiny,\nblue, impossibly far away. The astronaut's breathing is audible.\nAnamorphic lens flare streaks across the frame.\n\n[00:07-00:10] Shot 3: The Decision (Low Angle, Static).\nFrom below, the astronaut steps forward off the crater edge — a leap of\nfaith into the unknown. Dust particles float in slow motion around the\nboots. Camera holds steady as the figure descends. Cut to black.\n\nConsistent spacesuit design. Realistic Mars dust physics. Epic\norchestral audio swell on final shot.\n",[28,32423,32421],{"__ignoreMap":142},[32395,32425,32427],{"id":32426},"샷-스크립트가-더-나은-결과를-내는-이유","샷 스크립트가 더 나은 결과를 내는 이유",[11,32429,32430],{},"샷 스크립트가 기본 공식보다 우수한 결과를 내는 세 가지 이유가 있습니다:",[70,32432,32433,32443,32449],{},[73,32434,32435,32438,32439,32442],{},[23,32436,32437],{},"시간적 정밀도."," 타임코드는 Seedance에게 각 행동이 ",[2621,32440,32441],{},"언제"," 일어나는지 정확히 알려줍니다. 타임코드 없이는 모델이 행동을 전체 길이에 걸쳐 예측 불가능하게 분배합니다.",[73,32444,32445,32448],{},[23,32446,32447],{},"내러티브 아크."," 이름이 붙은 샷은 이야기를 구축하도록 강제합니다: 설정 → 발견 → 결말. 모델이 감정적 진행을 이해할 때 더 설득력 있는 움직임을 생성합니다.",[73,32450,32451,32454],{},[23,32452,32453],{},"물리적 근거."," \"부츠 주변으로 먼지 입자가 슬로모션으로 떠다닌다\"와 같은 디테일은 물리 엔진에 모호한 미학 대신 구체적인 제약 조건을 제공합니다.",[11,32456,32457,32462],{},[37,32458,32461],{"href":32459,"rel":32460},"https://github.com/EvoLinkAI/awesome-seedance-2-guide",[41],"awesome-seedance"," 커뮤니티의 상급 크리에이터들은 레이싱 장면부터 아트 스타일 변환까지, 최고의 작품에 지속적으로 샷 스크립트 형식을 사용합니다. 패턴은 명확합니다: 구조화된 타임코드 + 구체적인 스타일 앵커 = 시네마틱 결과물.",[11,32464,32465,32466,32469],{},"이러한 카메라 기법을 ",[37,32467,32468],{"href":3860},"카메라 무브먼트 복제 가이드","에서 단계별로 설명합니다.",[92,32471,32473],{"id":32472},"텍스트-전용-vs-멀티모달-프롬프트","텍스트 전용 vs. 멀티모달 프롬프트",[11,32475,32476,32479],{},[23,32477,32478],{},"텍스트 전용 프롬프트","는 장면을 묘사하기 위해 전적으로 언어에 의존합니다:",[137,32481,32484],{"className":32482,"code":32483,"language":2183},[2181],"A red sports car drifts around a mountain curve, tires smoking,\ndrone shot tracking from above, cinematic color grading, 10 seconds\n",[28,32485,32483],{"__ignoreMap":142},[11,32487,32488,32491],{},[23,32489,32490],{},"멀티모달 프롬프트","는 텍스트와 업로드된 레퍼런스를 결합합니다:",[137,32493,32496],{"className":32494,"code":32495,"language":2183},[2181],"@Image1 as first frame, car drifts around the curve following\n@Video1 camera path, @Audio1 as engine sound, cinematic grading, 10 seconds\n",[28,32497,32495],{"__ignoreMap":142},[11,32499,32500],{},"멀티모달 버전은 \"빨간 스포츠카\"에 대한 모델의 해석에 의존하는 대신, Seedance 2.0에게 정확한 시각적 앵커를 제공합니다.",[92,32502,32504],{"id":32503},"첫-번째-seedance-20-프롬프트-api-예제","첫 번째 Seedance 2.0 프롬프트 — API 예제",[11,32506,32507],{},"샷 스크립트 형식을 사용한 완전한 텍스트-비디오 생성 호출입니다:",[56,32509,60,32510],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,32511],{"src":32512,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%B5%9B%E8%BD%A6%E7%94%B5%E5%BD%B1%E6%84%9F.mp4",[137,32514,32516],{"className":338,"code":32515,"language":340,"meta":142,"style":142},"import requests\nimport os\nimport time\n\nAPI_KEY = os.environ.get(\"SEEDANCE_API_KEY\")\nBASE_URL = \"https://api.evolink.ai/v1\"\n\n# Submit generation task\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).\\n\"\n            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n            \"at his rival. Dashboard instruments glow green on his visor.\\n\"\n            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'\\n\\n\"\n            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).\\n\"\n            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n            \"adrenaline through the visor slit.\\n\"\n            \"Dialogue Cue: He whispers 'Focus' to himself.\\n\\n\"\n            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).\\n\"\n            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n            \"the camera lens. Motion blur turns stadium lights into long golden streaks.\\n\\n\"\n            \"Consistent car designs. Realistic rain physics, water reflections. \"\n            \"Tension-building audio.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\ntask = response.json()\ntask_id = task[\"id\"]\n\n# Poll for result\nwhile True:\n    status = requests.get(\n        f\"{BASE_URL}/tasks/{task_id}\",\n        headers={\"Authorization\": f\"Bearer {API_KEY}\"}\n    ).json()\n    if status[\"status\"] == \"completed\":\n        print(f\"Video ready: {status['results'][0]}\")\n        break\n    elif status[\"status\"] == \"failed\":\n        print(f\"Error: {status['error']}\")\n        break\n    time.sleep(5)\n",[28,32517,32518,32524,32530,32536,32540,32554,32562,32566,32571,32579,32591,32613,32621,32631,32637,32646,32655,32664,32669,32674,32683,32692,32701,32706,32711,32720,32729,32738,32743,32748,32757,32762,32767,32771,32781,32790,32794,32798,32806,32818,32822,32827,32835,32843,32863,32885,32890,32907,32936,32940,32956,32980,32984],{"__ignoreMap":142},[146,32519,32520,32522],{"class":148,"line":149},[146,32521,347],{"class":259},[146,32523,329],{"class":263},[146,32525,32526,32528],{"class":148,"line":167},[146,32527,347],{"class":259},[146,32529,363],{"class":263},[146,32531,32532,32534],{"class":148,"line":179},[146,32533,347],{"class":259},[146,32535,356],{"class":263},[146,32537,32538],{"class":148,"line":188},[146,32539,376],{"emptyLinePlaceholder":58},[146,32541,32542,32544,32546,32549,32552],{"class":148,"line":373},[146,32543,388],{"class":156},[146,32545,391],{"class":259},[146,32547,32548],{"class":263}," os.environ.get(",[146,32550,32551],{"class":160},"\"SEEDANCE_API_KEY\"",[146,32553,406],{"class":263},[146,32555,32556,32558,32560],{"class":148,"line":379},[146,32557,412],{"class":156},[146,32559,391],{"class":259},[146,32561,417],{"class":160},[146,32563,32564],{"class":148,"line":385},[146,32565,376],{"emptyLinePlaceholder":58},[146,32567,32568],{"class":148,"line":409},[146,32569,32570],{"class":175},"# Submit generation task\n",[146,32572,32573,32575,32577],{"class":148,"line":420},[146,32574,6532],{"class":263},[146,32576,267],{"class":259},[146,32578,1432],{"class":263},[146,32580,32581,32583,32585,32587,32589],{"class":148,"line":431},[146,32582,6541],{"class":259},[146,32584,449],{"class":160},[146,32586,679],{"class":156},[146,32588,1444],{"class":160},[146,32590,452],{"class":263},[146,32592,32593,32595,32597,32599,32601,32603,32605,32607,32609,32611],{"class":148,"line":455},[146,32594,6554],{"class":701},[146,32596,267],{"class":259},[146,32598,685],{"class":263},[146,32600,31550],{"class":160},[146,32602,437],{"class":263},[146,32604,440],{"class":259},[146,32606,443],{"class":160},[146,32608,446],{"class":156},[146,32610,449],{"class":160},[146,32612,19596],{"class":263},[146,32614,32615,32617,32619],{"class":148,"line":466},[146,32616,6565],{"class":701},[146,32618,267],{"class":259},[146,32620,1864],{"class":263},[146,32622,32623,32625,32627,32629],{"class":148,"line":600},[146,32624,1303],{"class":160},[146,32626,437],{"class":263},[146,32628,1308],{"class":160},[146,32630,452],{"class":263},[146,32632,32633,32635],{"class":148,"line":605},[146,32634,1319],{"class":160},[146,32636,1322],{"class":263},[146,32638,32639,32642,32644],{"class":148,"line":611},[146,32640,32641],{"class":160},"            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.",[146,32643,1670],{"class":156},[146,32645,950],{"class":160},[146,32647,32648,32651,32653],{"class":148,"line":617},[146,32649,32650],{"class":160},"            \"【Duration】10 seconds",[146,32652,12126],{"class":156},[146,32654,950],{"class":160},[146,32656,32657,32660,32662],{"class":148,"line":623},[146,32658,32659],{"class":160},"            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).",[146,32661,1670],{"class":156},[146,32663,950],{"class":160},[146,32665,32666],{"class":148,"line":628},[146,32667,32668],{"class":160},"            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n",[146,32670,32671],{"class":148,"line":639},[146,32672,32673],{"class":160},"            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n",[146,32675,32676,32679,32681],{"class":148,"line":654},[146,32677,32678],{"class":160},"            \"at his rival. Dashboard instruments glow green on his visor.",[146,32680,1670],{"class":156},[146,32682,950],{"class":160},[146,32684,32685,32688,32690],{"class":148,"line":660},[146,32686,32687],{"class":160},"            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'",[146,32689,12126],{"class":156},[146,32691,950],{"class":160},[146,32693,32694,32697,32699],{"class":148,"line":671},[146,32695,32696],{"class":160},"            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).",[146,32698,1670],{"class":156},[146,32700,950],{"class":160},[146,32702,32703],{"class":148,"line":698},[146,32704,32705],{"class":160},"            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n",[146,32707,32708],{"class":148,"line":710},[146,32709,32710],{"class":160},"            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n",[146,32712,32713,32716,32718],{"class":148,"line":716},[146,32714,32715],{"class":160},"            \"adrenaline through the visor slit.",[146,32717,1670],{"class":156},[146,32719,950],{"class":160},[146,32721,32722,32725,32727],{"class":148,"line":722},[146,32723,32724],{"class":160},"            \"Dialogue Cue: He whispers 'Focus' to himself.",[146,32726,12126],{"class":156},[146,32728,950],{"class":160},[146,32730,32731,32734,32736],{"class":148,"line":728},[146,32732,32733],{"class":160},"            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).",[146,32735,1670],{"class":156},[146,32737,950],{"class":160},[146,32739,32740],{"class":148,"line":739},[146,32741,32742],{"class":160},"            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n",[146,32744,32745],{"class":148,"line":744},[146,32746,32747],{"class":160},"            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n",[146,32749,32750,32753,32755],{"class":148,"line":750},[146,32751,32752],{"class":160},"            \"the camera lens. Motion blur turns stadium lights into long golden streaks.",[146,32754,12126],{"class":156},[146,32756,950],{"class":160},[146,32758,32759],{"class":148,"line":767},[146,32760,32761],{"class":160},"            \"Consistent car designs. Realistic rain physics, water reflections. \"\n",[146,32763,32764],{"class":148,"line":788},[146,32765,32766],{"class":160},"            \"Tension-building audio.\"\n",[146,32768,32769],{"class":148,"line":834},[146,32770,1342],{"class":263},[146,32772,32773,32775,32777,32779],{"class":148,"line":839},[146,32774,1347],{"class":160},[146,32776,437],{"class":263},[146,32778,537],{"class":156},[146,32780,452],{"class":263},[146,32782,32783,32785,32787],{"class":148,"line":845},[146,32784,1363],{"class":160},[146,32786,437],{"class":263},[146,32788,32789],{"class":160},"\"1080p\"\n",[146,32791,32792],{"class":148,"line":863},[146,32793,1407],{"class":263},[146,32795,32796],{"class":148,"line":872},[146,32797,406],{"class":263},[146,32799,32800,32802,32804],{"class":148,"line":887},[146,32801,6578],{"class":263},[146,32803,267],{"class":259},[146,32805,736],{"class":263},[146,32807,32808,32810,32812,32814,32816],{"class":148,"line":903},[146,32809,12204],{"class":263},[146,32811,267],{"class":259},[146,32813,758],{"class":263},[146,32815,1626],{"class":160},[146,32817,764],{"class":263},[146,32819,32820],{"class":148,"line":915},[146,32821,376],{"emptyLinePlaceholder":58},[146,32823,32824],{"class":148,"line":953},[146,32825,32826],{"class":175},"# Poll for result\n",[146,32828,32829,32831,32833],{"class":148,"line":959},[146,32830,31742],{"class":259},[146,32832,14865],{"class":156},[146,32834,860],{"class":263},[146,32836,32837,32839,32841],{"class":148,"line":964},[146,32838,7239],{"class":263},[146,32840,267],{"class":259},[146,32842,668],{"class":263},[146,32844,32845,32847,32849,32851,32853,32855,32857,32859,32861],{"class":148,"line":970},[146,32846,1437],{"class":259},[146,32848,449],{"class":160},[146,32850,679],{"class":156},[146,32852,682],{"class":160},[146,32854,685],{"class":156},[146,32856,688],{"class":263},[146,32858,691],{"class":156},[146,32860,449],{"class":160},[146,32862,452],{"class":263},[146,32864,32865,32867,32869,32871,32873,32875,32877,32879,32881,32883],{"class":148,"line":976},[146,32866,1455],{"class":701},[146,32868,267],{"class":259},[146,32870,685],{"class":263},[146,32872,31550],{"class":160},[146,32874,437],{"class":263},[146,32876,440],{"class":259},[146,32878,443],{"class":160},[146,32880,446],{"class":156},[146,32882,449],{"class":160},[146,32884,469],{"class":263},[146,32886,32887],{"class":148,"line":988},[146,32888,32889],{"class":263},"    ).json()\n",[146,32891,32892,32894,32897,32899,32901,32903,32905],{"class":148,"line":993},[146,32893,2508],{"class":259},[146,32895,32896],{"class":263}," status[",[146,32898,761],{"class":160},[146,32900,14937],{"class":263},[146,32902,854],{"class":259},[146,32904,857],{"class":160},[146,32906,860],{"class":263},[146,32908,32909,32911,32913,32915,32917,32919,32922,32924,32926,32928,32930,32932,32934],{"class":148,"line":5534},[146,32910,791],{"class":156},[146,32912,794],{"class":263},[146,32914,440],{"class":259},[146,32916,11817],{"class":160},[146,32918,685],{"class":156},[146,32920,32921],{"class":263},"status[",[146,32923,11825],{"class":160},[146,32925,1562],{"class":263},[146,32927,783],{"class":156},[146,32929,1535],{"class":263},[146,32931,691],{"class":156},[146,32933,449],{"class":160},[146,32935,406],{"class":263},[146,32937,32938],{"class":148,"line":5543},[146,32939,31853],{"class":259},[146,32941,32942,32944,32946,32948,32950,32952,32954],{"class":148,"line":5549},[146,32943,7525],{"class":259},[146,32945,32896],{"class":263},[146,32947,761],{"class":160},[146,32949,14937],{"class":263},[146,32951,854],{"class":259},[146,32953,882],{"class":160},[146,32955,860],{"class":263},[146,32957,32958,32960,32962,32964,32966,32968,32970,32972,32974,32976,32978],{"class":148,"line":5577},[146,32959,791],{"class":156},[146,32961,794],{"class":263},[146,32963,440],{"class":259},[146,32965,31880],{"class":160},[146,32967,685],{"class":156},[146,32969,32921],{"class":263},[146,32971,11874],{"class":160},[146,32973,1535],{"class":263},[146,32975,691],{"class":156},[146,32977,449],{"class":160},[146,32979,406],{"class":263},[146,32981,32982],{"class":148,"line":5608},[146,32983,31853],{"class":259},[146,32985,32986,32988,32990],{"class":148,"line":5628},[146,32987,19908],{"class":263},[146,32989,1352],{"class":156},[146,32991,406],{"class":263},[11,32993,32994],{},"이 코드는 네이티브 오디오 출력이 포함된 10초, 1080p 비디오를 생성합니다. 샷 스크립트는 Seedance에게 명확한 타임코드, 카메라 디렉션, 물리적 디테일을 제공하여 단일 텍스트 프롬프트로 시네마틱한 3막 구조의 레이싱 시퀀스를 생성합니다.",[11,32996,32997,32998,33000],{},"API가 처음이신가요? 설정과 인증에 대해서는 ",[37,32999,23789],{"href":17555},"부터 시작하세요.",[18,33002,33003],{},[11,33004,33005,33007,33008,400,33010,400,33012,33014],{},[23,33006,30565],{}," 이후의 모든 코드 예제는 동일한 설정을 사용합니다. 위 예제에서 ",[28,33009,347],{},[28,33011,388],{},[28,33013,412],{},", 폴링 로직을 복사하세요. 고유한 프롬프트와 파라미터가 포함된 API 호출 부분만 표시합니다.",[45,33016],{},[48,33018,33020],{"id":33019},"tag-참조-시스템-상세-설명","@Tag 참조 시스템 상세 설명",[11,33022,33023,33025],{},[28,33024,32216],{}," 시스템은 Seedance 2.0 프롬프트를 진정한 멀티모달로 만드는 핵심입니다. 파일을 업로드하면 각 파일에 유형과 업로드 순서에 따라 자동으로 태그가 부여됩니다.",[92,33027,33029],{"id":33028},"구문-규칙","구문 규칙",[97,33031,33032,33045,33058,33072],{},[73,33033,33034,2424,33037,400,33039,33041,33042,33044],{},[23,33035,33036],{},"이미지:",[28,33038,2911],{},[28,33040,2920],{},", ... ",[28,33043,2957],{}," (최대 9장)",[73,33046,33047,2424,33050,400,33052,400,33054,33057],{},[23,33048,33049],{},"비디오:",[28,33051,11427],{},[28,33053,13318],{},[28,33055,33056],{},"@Video3"," (최대 3개 클립)",[73,33059,33060,2424,33063,400,33065,400,33068,33071],{},[23,33061,33062],{},"오디오:",[28,33064,16541],{},[28,33066,33067],{},"@Audio2",[28,33069,33070],{},"@Audio3"," (최대 3개 파일)",[73,33073,33074,33077],{},[23,33075,33076],{},"총 파일 제한:"," 요청당 12개 파일",[11,33079,33080,33081,33083],{},"태그는 각 유형 내에서 업로드 순서대로 할당됩니다. 프롬프트 텍스트는 Seedance에게 각 레퍼런스를 ",[2621,33082,25175],{}," 사용할지 알려줍니다.",[11,33085,33086,33087,1260],{},"모든 @tag 패턴과 8개 이상의 실제 사례를 자세히 알아보려면 ",[37,33088,33089],{"href":2969},"완전한 @Tags 가이드",[92,33091,33093],{"id":33092},"이미지-레퍼런스를-사용하는-5가지-방법","이미지 레퍼런스를 사용하는 5가지 방법",[2035,33095,33096,33108],{},[2038,33097,33098],{},[2041,33099,33100,33103,33106],{},[2044,33101,33102],{},"용도",[2044,33104,33105],{},"프롬프트 구문",[2044,33107,23156],{},[2051,33109,33110,33124,33137,33151,33166],{},[2041,33111,33112,33117,33121],{},[2056,33113,33114],{},[23,33115,33116],{},"첫 프레임",[2056,33118,33119],{},[28,33120,2997],{},[2056,33122,33123],{},"이 이미지에서 비디오가 시작됩니다",[2041,33125,33126,33130,33134],{},[2056,33127,33128],{},[23,33129,30755],{},[2056,33131,33132],{},[28,33133,3010],{},[2056,33135,33136],{},"이 이미지에서 비디오가 끝납니다",[2041,33138,33139,33144,33148],{},[2056,33140,33141],{},[23,33142,33143],{},"캐릭터 외형",[2056,33145,33146],{},[28,33147,3023],{},[2056,33149,33150],{},"전체 비디오에서 캐릭터 외형을 유지합니다",[2041,33152,33153,33158,33163],{},[2056,33154,33155],{},[23,33156,33157],{},"장면 환경",[2056,33159,33160],{},[28,33161,33162],{},"@Image1 as background environment",[2056,33164,33165],{},"이미지를 장면 배경으로 사용합니다",[2041,33167,33168,33173,33177],{},[2056,33169,33170],{},[23,33171,33172],{},"스타일 / 미학",[2056,33174,33175],{},[28,33176,3036],{},[2056,33178,33179],{},"색상 팔레트, 질감, 분위기를 맞춥니다",[92,33181,33183],{"id":33182},"비디오-레퍼런스를-사용하는-4가지-방법","비디오 레퍼런스를 사용하는 4가지 방법",[2035,33185,33186,33196],{},[2038,33187,33188],{},[2041,33189,33190,33192,33194],{},[2044,33191,33102],{},[2044,33193,33105],{},[2044,33195,23156],{},[2051,33197,33198,33213,33228,33243],{},[2041,33199,33200,33205,33210],{},[2056,33201,33202],{},[23,33203,33204],{},"카메라 복제",[2056,33206,33207],{},[28,33208,33209],{},"follow @Video1 camera movement",[2056,33211,33212],{},"팬, 틸트, 줌 패턴을 복사합니다",[2041,33214,33215,33220,33225],{},[2056,33216,33217],{},[23,33218,33219],{},"모션 모방",[2056,33221,33222],{},[28,33223,33224],{},"character moves like @Video1",[2056,33226,33227],{},"신체 동작 / 안무를 전달합니다",[2041,33229,33230,33235,33240],{},[2056,33231,33232],{},[23,33233,33234],{},"이펙트 복제",[2056,33236,33237],{},[28,33238,33239],{},"apply @Video1 transition effects",[2056,33241,33242],{},"시각 효과와 전환을 맞춥니다",[2041,33244,33245,33250,33255],{},[2056,33246,33247],{},[23,33248,33249],{},"리듬 참조",[2056,33251,33252],{},[28,33253,33254],{},"match @Video1 pacing and cuts",[2056,33256,33257],{},"타이밍과 장면 리듬을 동기화합니다",[92,33259,33261],{"id":33260},"오디오-레퍼런스를-사용하는-3가지-방법","오디오 레퍼런스를 사용하는 3가지 방법",[2035,33263,33264,33274],{},[2038,33265,33266],{},[2041,33267,33268,33270,33272],{},[2044,33269,33102],{},[2044,33271,33105],{},[2044,33273,23156],{},[2051,33275,33276,33290,33305],{},[2041,33277,33278,33282,33287],{},[2056,33279,33280],{},[23,33281,31149],{},[2056,33283,33284],{},[28,33285,33286],{},"@Audio1 as background soundtrack",[2056,33288,33289],{},"업로드한 음악으로 분위기를 설정합니다",[2041,33291,33292,33297,33302],{},[2056,33293,33294],{},[23,33295,33296],{},"사운드 이펙트",[2056,33298,33299],{},[28,33300,33301],{},"@Audio1 as ambient sound",[2056,33303,33304],{},"특정 효과음을 추가합니다",[2041,33306,33307,33312,33317],{},[2056,33308,33309],{},[23,33310,33311],{},"보이스 스타일",[2056,33313,33314],{},[28,33315,33316],{},"@Audio1 as voice style reference",[2056,33318,33319],{},"음성 톤과 리듬을 맞춥니다",[92,33321,33323],{"id":33322},"최적의-파일-배분-전략","최적의 파일 배분 전략",[11,33325,33326],{},"12개 파일 제한 내에서 다양한 용도에 맞게 레퍼런스를 배분하는 방법입니다:",[2035,33328,33329,33343],{},[2038,33330,33331],{},[2041,33332,33333,33335,33337,33339,33341],{},[2044,33334,33102],{},[2044,33336,30614],{},[2044,33338,30630],{},[2044,33340,30650],{},[2044,33342,30668],{},[2051,33344,33345,33361,33376,33393,33408],{},[2041,33346,33347,33350,33353,33356,33358],{},[2056,33348,33349],{},"제품 광고",[2056,33351,33352],{},"4 (제품 앵글)",[2056,33354,33355],{},"1 (카메라 참조)",[2056,33357,13172],{},[2056,33359,33360],{},"6",[2041,33362,33363,33366,33369,33372,33374],{},[2056,33364,33365],{},"캐릭터 애니메이션",[2056,33367,33368],{},"3 (캐릭터 + 장면)",[2056,33370,33371],{},"2 (모션 참조)",[2056,33373,13172],{},[2056,33375,33360],{},[2041,33377,33378,33381,33384,33387,33390],{},[2056,33379,33380],{},"뮤직비디오",[2056,33382,33383],{},"2 (스타일 + 캐릭터)",[2056,33385,33386],{},"2 (댄스 참조)",[2056,33388,33389],{},"3 (트랙)",[2056,33391,33392],{},"7",[2041,33394,33395,33398,33401,33404,33406],{},[2056,33396,33397],{},"멀티샷 내러티브",[2056,33399,33400],{},"6 (장면 키프레임)",[2056,33402,33403],{},"1 (스타일 참조)",[2056,33405,13172],{},[2056,33407,3702],{},[2041,33409,33410,33413,33416,33418,33421],{},[2056,33411,33412],{},"최고 품질 단일 샷",[2056,33414,33415],{},"9 (모든 앵글)",[2056,33417,783],{},[2056,33419,33420],{},"3 (오디오 레이어)",[2056,33422,16416],{},[18,33424,33425],{},[11,33426,33427,33429],{},[23,33428,134],{}," 12개 슬롯을 모두 사용할 필요는 거의 없습니다. 적지만 고품질의 레퍼런스가 많은 저품질 레퍼런스보다 대부분 더 나은 결과를 냅니다.",[45,33431],{},[48,33433,33435],{"id":33434},"_15개-이상의-즉시-사용-가능한-seedance-프롬프트-템플릿","15개 이상의 즉시 사용 가능한 Seedance 프롬프트 템플릿",[92,33437,33439],{"id":33438},"텍스트-비디오-프롬프트-템플릿","텍스트-비디오 프롬프트 템플릿",[32395,33441,33443],{"id":33442},"t1-다중-캐릭터-대화-단편-영화","T1: 다중 캐릭터 대화 단편 영화",[11,33445,33446,33449],{},[23,33447,33448],{},"설명:"," 뚜렷한 음성 개성을 가진 두 애니메이션 캐릭터가 역동적인 대화를 나누며, 샷 스크립트 형식으로 음성 연기 능력을 보여줍니다.",[56,33451,60,33452],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33453],{"src":31252,"type":65},[137,33455,33457],{"className":338,"code":33456,"language":340,"meta":142,"style":142},"# T1: 다중 캐릭터 대화 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).\\n\"\n            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n            \"light through the cafe window. Subtle ear twitch.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).\\n\"\n            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n            \"gesture wildly, nearly knocking over a pastry plate.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).\\n\"\n            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n            \"drops in amazement. Beat of silence. Both burst into laughter.\\n\\n\"\n            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n            \"Warm cafe lighting with bokeh background.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,33458,33459,33464,33472,33484,33506,33514,33524,33530,33539,33548,33557,33562,33567,33572,33581,33590,33595,33600,33605,33614,33623,33628,33633,33642,33647,33652,33656,33666,33674,33678,33682],{"__ignoreMap":142},[146,33460,33461],{"class":148,"line":149},[146,33462,33463],{"class":175},"# T1: 다중 캐릭터 대화 — 위 첫 번째 예제의 설정 사용\n",[146,33465,33466,33468,33470],{"class":148,"line":167},[146,33467,6532],{"class":263},[146,33469,267],{"class":259},[146,33471,1432],{"class":263},[146,33473,33474,33476,33478,33480,33482],{"class":148,"line":179},[146,33475,6541],{"class":259},[146,33477,449],{"class":160},[146,33479,679],{"class":156},[146,33481,1444],{"class":160},[146,33483,452],{"class":263},[146,33485,33486,33488,33490,33492,33494,33496,33498,33500,33502,33504],{"class":148,"line":188},[146,33487,6554],{"class":701},[146,33489,267],{"class":259},[146,33491,685],{"class":263},[146,33493,31550],{"class":160},[146,33495,437],{"class":263},[146,33497,440],{"class":259},[146,33499,443],{"class":160},[146,33501,446],{"class":156},[146,33503,449],{"class":160},[146,33505,19596],{"class":263},[146,33507,33508,33510,33512],{"class":148,"line":373},[146,33509,6565],{"class":701},[146,33511,267],{"class":259},[146,33513,1864],{"class":263},[146,33515,33516,33518,33520,33522],{"class":148,"line":379},[146,33517,1303],{"class":160},[146,33519,437],{"class":263},[146,33521,1308],{"class":160},[146,33523,452],{"class":263},[146,33525,33526,33528],{"class":148,"line":385},[146,33527,1319],{"class":160},[146,33529,1322],{"class":263},[146,33531,33532,33535,33537],{"class":148,"line":409},[146,33533,33534],{"class":160},"            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.",[146,33536,1670],{"class":156},[146,33538,950],{"class":160},[146,33540,33541,33544,33546],{"class":148,"line":420},[146,33542,33543],{"class":160},"            \"【Duration】12 seconds",[146,33545,12126],{"class":156},[146,33547,950],{"class":160},[146,33549,33550,33553,33555],{"class":148,"line":431},[146,33551,33552],{"class":160},"            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).",[146,33554,1670],{"class":156},[146,33556,950],{"class":160},[146,33558,33559],{"class":148,"line":455},[146,33560,33561],{"class":160},"            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n",[146,33563,33564],{"class":148,"line":466},[146,33565,33566],{"class":160},"            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n",[146,33568,33569],{"class":148,"line":600},[146,33570,33571],{"class":160},"            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n",[146,33573,33574,33577,33579],{"class":148,"line":605},[146,33575,33576],{"class":160},"            \"light through the cafe window. Subtle ear twitch.",[146,33578,12126],{"class":156},[146,33580,950],{"class":160},[146,33582,33583,33586,33588],{"class":148,"line":611},[146,33584,33585],{"class":160},"            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).",[146,33587,1670],{"class":156},[146,33589,950],{"class":160},[146,33591,33592],{"class":148,"line":617},[146,33593,33594],{"class":160},"            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n",[146,33596,33597],{"class":148,"line":623},[146,33598,33599],{"class":160},"            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n",[146,33601,33602],{"class":148,"line":628},[146,33603,33604],{"class":160},"            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n",[146,33606,33607,33610,33612],{"class":148,"line":639},[146,33608,33609],{"class":160},"            \"gesture wildly, nearly knocking over a pastry plate.",[146,33611,12126],{"class":156},[146,33613,950],{"class":160},[146,33615,33616,33619,33621],{"class":148,"line":654},[146,33617,33618],{"class":160},"            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).",[146,33620,1670],{"class":156},[146,33622,950],{"class":160},[146,33624,33625],{"class":148,"line":660},[146,33626,33627],{"class":160},"            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n",[146,33629,33630],{"class":148,"line":671},[146,33631,33632],{"class":160},"            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n",[146,33634,33635,33638,33640],{"class":148,"line":698},[146,33636,33637],{"class":160},"            \"drops in amazement. Beat of silence. Both burst into laughter.",[146,33639,12126],{"class":156},[146,33641,950],{"class":160},[146,33643,33644],{"class":148,"line":710},[146,33645,33646],{"class":160},"            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n",[146,33648,33649],{"class":148,"line":716},[146,33650,33651],{"class":160},"            \"Warm cafe lighting with bokeh background.\"\n",[146,33653,33654],{"class":148,"line":722},[146,33655,1342],{"class":263},[146,33657,33658,33660,33662,33664],{"class":148,"line":728},[146,33659,1347],{"class":160},[146,33661,437],{"class":263},[146,33663,16416],{"class":156},[146,33665,452],{"class":263},[146,33667,33668,33670,33672],{"class":148,"line":739},[146,33669,1363],{"class":160},[146,33671,437],{"class":263},[146,33673,32789],{"class":160},[146,33675,33676],{"class":148,"line":744},[146,33677,1407],{"class":263},[146,33679,33680],{"class":148,"line":750},[146,33681,406],{"class":263},[146,33683,33684],{"class":148,"line":767},[146,33685,33686],{"class":175},"# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[32395,33688,33690],{"id":33689},"t2-스타일-변환-살아-숨-쉬는-반-고흐-그림","T2: 스타일 변환 — 살아 숨 쉬는 반 고흐 그림",[11,33692,33693,33695],{},[23,33694,33448],{}," 고전적인 후기 인상파 장면을 숨 쉬고 움직이는 세계로 변환하며, 프롬프트 엔지니어링을 통한 정밀한 예술적 스타일 제어를 보여줍니다.",[56,33697,60,33698],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33699],{"src":24417,"type":65},[137,33701,33703],{"className":338,"code":33702,"language":340,"meta":142,"style":142},"# T2: 스타일 변환 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n            \"swirling brushstrokes, dreamy high-saturation.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).\\n\"\n            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n            \"and flowing paint. Everything moves — the sky itself breathes.\\n\\n\"\n            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).\\n\"\n            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n            \"and flowing hair. The village behind her shifts with painted texture, \"\n            \"windows glowing with warm yellow-orange light.\\n\\n\"\n            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).\\n\"\n            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n            \"the woman, through the village streets. Paint texture becomes visible at \"\n            \"close range. The entire world is alive with flowing brushstrokes.\\n\\n\"\n            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n            \"oil paint. Blue-yellow-orange palette dominant.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,33704,33705,33710,33718,33730,33752,33760,33770,33776,33781,33790,33798,33807,33812,33817,33822,33831,33840,33845,33850,33855,33864,33873,33878,33883,33892,33897,33902,33906,33916,33924,33928,33932],{"__ignoreMap":142},[146,33706,33707],{"class":148,"line":149},[146,33708,33709],{"class":175},"# T2: 스타일 변환 — 위 첫 번째 예제의 설정 사용\n",[146,33711,33712,33714,33716],{"class":148,"line":167},[146,33713,6532],{"class":263},[146,33715,267],{"class":259},[146,33717,1432],{"class":263},[146,33719,33720,33722,33724,33726,33728],{"class":148,"line":179},[146,33721,6541],{"class":259},[146,33723,449],{"class":160},[146,33725,679],{"class":156},[146,33727,1444],{"class":160},[146,33729,452],{"class":263},[146,33731,33732,33734,33736,33738,33740,33742,33744,33746,33748,33750],{"class":148,"line":188},[146,33733,6554],{"class":701},[146,33735,267],{"class":259},[146,33737,685],{"class":263},[146,33739,31550],{"class":160},[146,33741,437],{"class":263},[146,33743,440],{"class":259},[146,33745,443],{"class":160},[146,33747,446],{"class":156},[146,33749,449],{"class":160},[146,33751,19596],{"class":263},[146,33753,33754,33756,33758],{"class":148,"line":373},[146,33755,6565],{"class":701},[146,33757,267],{"class":259},[146,33759,1864],{"class":263},[146,33761,33762,33764,33766,33768],{"class":148,"line":379},[146,33763,1303],{"class":160},[146,33765,437],{"class":263},[146,33767,1308],{"class":160},[146,33769,452],{"class":263},[146,33771,33772,33774],{"class":148,"line":385},[146,33773,1319],{"class":160},[146,33775,1322],{"class":263},[146,33777,33778],{"class":148,"line":409},[146,33779,33780],{"class":160},"            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n",[146,33782,33783,33786,33788],{"class":148,"line":420},[146,33784,33785],{"class":160},"            \"swirling brushstrokes, dreamy high-saturation.",[146,33787,1670],{"class":156},[146,33789,950],{"class":160},[146,33791,33792,33794,33796],{"class":148,"line":431},[146,33793,32650],{"class":160},[146,33795,12126],{"class":156},[146,33797,950],{"class":160},[146,33799,33800,33803,33805],{"class":148,"line":455},[146,33801,33802],{"class":160},"            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).",[146,33804,1670],{"class":156},[146,33806,950],{"class":160},[146,33808,33809],{"class":148,"line":466},[146,33810,33811],{"class":160},"            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n",[146,33813,33814],{"class":148,"line":600},[146,33815,33816],{"class":160},"            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n",[146,33818,33819],{"class":148,"line":605},[146,33820,33821],{"class":160},"            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n",[146,33823,33824,33827,33829],{"class":148,"line":611},[146,33825,33826],{"class":160},"            \"and flowing paint. Everything moves — the sky itself breathes.",[146,33828,12126],{"class":156},[146,33830,950],{"class":160},[146,33832,33833,33836,33838],{"class":148,"line":617},[146,33834,33835],{"class":160},"            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).",[146,33837,1670],{"class":156},[146,33839,950],{"class":160},[146,33841,33842],{"class":148,"line":623},[146,33843,33844],{"class":160},"            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n",[146,33846,33847],{"class":148,"line":628},[146,33848,33849],{"class":160},"            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n",[146,33851,33852],{"class":148,"line":639},[146,33853,33854],{"class":160},"            \"and flowing hair. The village behind her shifts with painted texture, \"\n",[146,33856,33857,33860,33862],{"class":148,"line":654},[146,33858,33859],{"class":160},"            \"windows glowing with warm yellow-orange light.",[146,33861,12126],{"class":156},[146,33863,950],{"class":160},[146,33865,33866,33869,33871],{"class":148,"line":660},[146,33867,33868],{"class":160},"            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).",[146,33870,1670],{"class":156},[146,33872,950],{"class":160},[146,33874,33875],{"class":148,"line":671},[146,33876,33877],{"class":160},"            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n",[146,33879,33880],{"class":148,"line":698},[146,33881,33882],{"class":160},"            \"the woman, through the village streets. Paint texture becomes visible at \"\n",[146,33884,33885,33888,33890],{"class":148,"line":710},[146,33886,33887],{"class":160},"            \"close range. The entire world is alive with flowing brushstrokes.",[146,33889,12126],{"class":156},[146,33891,950],{"class":160},[146,33893,33894],{"class":148,"line":716},[146,33895,33896],{"class":160},"            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n",[146,33898,33899],{"class":148,"line":722},[146,33900,33901],{"class":160},"            \"oil paint. Blue-yellow-orange palette dominant.\"\n",[146,33903,33904],{"class":148,"line":728},[146,33905,1342],{"class":263},[146,33907,33908,33910,33912,33914],{"class":148,"line":739},[146,33909,1347],{"class":160},[146,33911,437],{"class":263},[146,33913,537],{"class":156},[146,33915,452],{"class":263},[146,33917,33918,33920,33922],{"class":148,"line":744},[146,33919,1363],{"class":160},[146,33921,437],{"class":263},[146,33923,32789],{"class":160},[146,33925,33926],{"class":148,"line":750},[146,33927,1407],{"class":263},[146,33929,33930],{"class":148,"line":767},[146,33931,406],{"class":263},[146,33933,33934],{"class":148,"line":788},[146,33935,33686],{"class":175},[32395,33937,33939],{"id":33938},"t3-감정-표현-애니메이션-캐릭터-연기","T3: 감정 표현 — 애니메이션 캐릭터 연기",[11,33941,33942,33944],{},[23,33943,33448],{}," 편지를 읽는 애니메이션 스타일 캐릭터의 세밀한 감정 변화를 보여주며, 텍스트 전용 프롬프트만으로도 섬세한 캐릭터 연기를 만들 수 있음을 보여줍니다.",[56,33946,60,33947],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33948],{"src":33949,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%8A%A8%E6%BC%AB%E4%BA%BA%E7%89%A9%E8%AF%BB%E4%BF%A1%E8%A1%A8%E6%83%85.mp4",[137,33951,33953],{"className":338,"code":33952,"language":340,"meta":142,"style":142},"# T3: 감정 표현 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n            \"detailed facial expressions.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).\\n\"\n            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).\\n\"\n            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n            \"Every micro-expression is clearly animated.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).\\n\"\n            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n            \"the window behind her. Camera holds on her peaceful, radiant expression.\\n\\n\"\n            \"Consistent anime character design. Detailed emotional facial animation. \"\n            \"Natural lighting transitions.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,33954,33955,33960,33968,33980,34002,34010,34020,34026,34031,34040,34048,34057,34062,34067,34076,34085,34090,34095,34100,34109,34118,34123,34128,34137,34142,34147,34151,34161,34169,34173,34177],{"__ignoreMap":142},[146,33956,33957],{"class":148,"line":149},[146,33958,33959],{"class":175},"# T3: 감정 표현 — 위 첫 번째 예제의 설정 사용\n",[146,33961,33962,33964,33966],{"class":148,"line":167},[146,33963,6532],{"class":263},[146,33965,267],{"class":259},[146,33967,1432],{"class":263},[146,33969,33970,33972,33974,33976,33978],{"class":148,"line":179},[146,33971,6541],{"class":259},[146,33973,449],{"class":160},[146,33975,679],{"class":156},[146,33977,1444],{"class":160},[146,33979,452],{"class":263},[146,33981,33982,33984,33986,33988,33990,33992,33994,33996,33998,34000],{"class":148,"line":188},[146,33983,6554],{"class":701},[146,33985,267],{"class":259},[146,33987,685],{"class":263},[146,33989,31550],{"class":160},[146,33991,437],{"class":263},[146,33993,440],{"class":259},[146,33995,443],{"class":160},[146,33997,446],{"class":156},[146,33999,449],{"class":160},[146,34001,19596],{"class":263},[146,34003,34004,34006,34008],{"class":148,"line":373},[146,34005,6565],{"class":701},[146,34007,267],{"class":259},[146,34009,1864],{"class":263},[146,34011,34012,34014,34016,34018],{"class":148,"line":379},[146,34013,1303],{"class":160},[146,34015,437],{"class":263},[146,34017,1308],{"class":160},[146,34019,452],{"class":263},[146,34021,34022,34024],{"class":148,"line":385},[146,34023,1319],{"class":160},[146,34025,1322],{"class":263},[146,34027,34028],{"class":148,"line":409},[146,34029,34030],{"class":160},"            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n",[146,34032,34033,34036,34038],{"class":148,"line":420},[146,34034,34035],{"class":160},"            \"detailed facial expressions.",[146,34037,1670],{"class":156},[146,34039,950],{"class":160},[146,34041,34042,34044,34046],{"class":148,"line":431},[146,34043,33543],{"class":160},[146,34045,12126],{"class":156},[146,34047,950],{"class":160},[146,34049,34050,34053,34055],{"class":148,"line":455},[146,34051,34052],{"class":160},"            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).",[146,34054,1670],{"class":156},[146,34056,950],{"class":160},[146,34058,34059],{"class":148,"line":466},[146,34060,34061],{"class":160},"            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n",[146,34063,34064],{"class":148,"line":600},[146,34065,34066],{"class":160},"            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n",[146,34068,34069,34072,34074],{"class":148,"line":605},[146,34070,34071],{"class":160},"            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.",[146,34073,12126],{"class":156},[146,34075,950],{"class":160},[146,34077,34078,34081,34083],{"class":148,"line":611},[146,34079,34080],{"class":160},"            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).",[146,34082,1670],{"class":156},[146,34084,950],{"class":160},[146,34086,34087],{"class":148,"line":617},[146,34088,34089],{"class":160},"            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n",[146,34091,34092],{"class":148,"line":623},[146,34093,34094],{"class":160},"            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n",[146,34096,34097],{"class":148,"line":628},[146,34098,34099],{"class":160},"            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n",[146,34101,34102,34105,34107],{"class":148,"line":639},[146,34103,34104],{"class":160},"            \"Every micro-expression is clearly animated.",[146,34106,12126],{"class":156},[146,34108,950],{"class":160},[146,34110,34111,34114,34116],{"class":148,"line":654},[146,34112,34113],{"class":160},"            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).",[146,34115,1670],{"class":156},[146,34117,950],{"class":160},[146,34119,34120],{"class":148,"line":660},[146,34121,34122],{"class":160},"            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n",[146,34124,34125],{"class":148,"line":671},[146,34126,34127],{"class":160},"            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n",[146,34129,34130,34133,34135],{"class":148,"line":698},[146,34131,34132],{"class":160},"            \"the window behind her. Camera holds on her peaceful, radiant expression.",[146,34134,12126],{"class":156},[146,34136,950],{"class":160},[146,34138,34139],{"class":148,"line":710},[146,34140,34141],{"class":160},"            \"Consistent anime character design. Detailed emotional facial animation. \"\n",[146,34143,34144],{"class":148,"line":716},[146,34145,34146],{"class":160},"            \"Natural lighting transitions.\"\n",[146,34148,34149],{"class":148,"line":722},[146,34150,1342],{"class":263},[146,34152,34153,34155,34157,34159],{"class":148,"line":728},[146,34154,1347],{"class":160},[146,34156,437],{"class":263},[146,34158,16416],{"class":156},[146,34160,452],{"class":263},[146,34162,34163,34165,34167],{"class":148,"line":739},[146,34164,1363],{"class":160},[146,34166,437],{"class":263},[146,34168,32789],{"class":160},[146,34170,34171],{"class":148,"line":744},[146,34172,1407],{"class":263},[146,34174,34175],{"class":148,"line":750},[146,34176,406],{"class":263},[146,34178,34179],{"class":148,"line":767},[146,34180,33686],{"class":175},[92,34182,34184],{"id":34183},"이미지-비디오-프롬프트-템플릿","이미지-비디오 프롬프트 템플릿",[32395,34186,34188],{"id":34187},"i1-제품-광고-프리미엄-헤드폰","I1: 제품 광고 — 프리미엄 헤드폰",[11,34190,34191,34193,34194,34196,34197,18420],{},[23,34192,33448],{}," 제품 사진을 역동적인 색상 쇼케이스와 스튜디오급 조명이 결합된 프리미엄 광고로 변환합니다. ",[28,34195,2911],{},"을 첫 프레임으로 사용합니다. 배치 생성을 포함한 더 많은 제품 비디오 워크플로우는 ",[37,34198,34199],{"href":3384},"이미지-비디오 튜토리얼",[56,34201,60,34202],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34203],{"src":18435,"type":65},[137,34205,34207],{"className":338,"code":34206,"language":340,"meta":142,"style":142},"# I1: 제품 광고 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/premium_headphones.jpg\"],\n        \"prompt\": (\n            \"@Image1 as first frame.\\n\"\n            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n            \"texture and premium finish. Voiceover: 'Sound that moves you.'\\n\\n\"\n            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n            \"highlights on the metal surface.\\n\\n\"\n            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n            \"artist in creative studio, athlete training — each wearing different colored \"\n            \"headphones that match their aesthetic.\\n\\n\"\n            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.\\n\\n\"\n            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n            \"lighting. Clean, premium aesthetic throughout.\"\n        ),\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,34208,34209,34214,34222,34234,34256,34264,34274,34285,34291,34300,34309,34318,34323,34328,34337,34342,34347,34356,34361,34366,34375,34380,34389,34394,34399,34403,34413,34421,34425,34429],{"__ignoreMap":142},[146,34210,34211],{"class":148,"line":149},[146,34212,34213],{"class":175},"# I1: 제품 광고 — 위 첫 번째 예제의 설정 사용\n",[146,34215,34216,34218,34220],{"class":148,"line":167},[146,34217,6532],{"class":263},[146,34219,267],{"class":259},[146,34221,1432],{"class":263},[146,34223,34224,34226,34228,34230,34232],{"class":148,"line":179},[146,34225,6541],{"class":259},[146,34227,449],{"class":160},[146,34229,679],{"class":156},[146,34231,1444],{"class":160},[146,34233,452],{"class":263},[146,34235,34236,34238,34240,34242,34244,34246,34248,34250,34252,34254],{"class":148,"line":188},[146,34237,6554],{"class":701},[146,34239,267],{"class":259},[146,34241,685],{"class":263},[146,34243,31550],{"class":160},[146,34245,437],{"class":263},[146,34247,440],{"class":259},[146,34249,443],{"class":160},[146,34251,446],{"class":156},[146,34253,449],{"class":160},[146,34255,19596],{"class":263},[146,34257,34258,34260,34262],{"class":148,"line":373},[146,34259,6565],{"class":701},[146,34261,267],{"class":259},[146,34263,1864],{"class":263},[146,34265,34266,34268,34270,34272],{"class":148,"line":379},[146,34267,1303],{"class":160},[146,34269,437],{"class":263},[146,34271,1308],{"class":160},[146,34273,452],{"class":263},[146,34275,34276,34278,34280,34283],{"class":148,"line":385},[146,34277,2690],{"class":160},[146,34279,10846],{"class":263},[146,34281,34282],{"class":160},"\"https://example.com/premium_headphones.jpg\"",[146,34284,10852],{"class":263},[146,34286,34287,34289],{"class":148,"line":409},[146,34288,1319],{"class":160},[146,34290,1322],{"class":263},[146,34292,34293,34296,34298],{"class":148,"line":420},[146,34294,34295],{"class":160},"            \"@Image1 as first frame.",[146,34297,1670],{"class":156},[146,34299,950],{"class":160},[146,34301,34302,34305,34307],{"class":148,"line":431},[146,34303,34304],{"class":160},"            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.",[146,34306,1670],{"class":156},[146,34308,950],{"class":160},[146,34310,34311,34314,34316],{"class":148,"line":455},[146,34312,34313],{"class":160},"            \"【Duration】15 seconds",[146,34315,12126],{"class":156},[146,34317,950],{"class":160},[146,34319,34320],{"class":148,"line":466},[146,34321,34322],{"class":160},"            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n",[146,34324,34325],{"class":148,"line":600},[146,34326,34327],{"class":160},"            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n",[146,34329,34330,34333,34335],{"class":148,"line":605},[146,34331,34332],{"class":160},"            \"texture and premium finish. Voiceover: 'Sound that moves you.'",[146,34334,12126],{"class":156},[146,34336,950],{"class":160},[146,34338,34339],{"class":148,"line":611},[146,34340,34341],{"class":160},"            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n",[146,34343,34344],{"class":148,"line":617},[146,34345,34346],{"class":160},"            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n",[146,34348,34349,34352,34354],{"class":148,"line":623},[146,34350,34351],{"class":160},"            \"highlights on the metal surface.",[146,34353,12126],{"class":156},[146,34355,950],{"class":160},[146,34357,34358],{"class":148,"line":628},[146,34359,34360],{"class":160},"            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n",[146,34362,34363],{"class":148,"line":639},[146,34364,34365],{"class":160},"            \"artist in creative studio, athlete training — each wearing different colored \"\n",[146,34367,34368,34371,34373],{"class":148,"line":654},[146,34369,34370],{"class":160},"            \"headphones that match their aesthetic.",[146,34372,12126],{"class":156},[146,34374,950],{"class":160},[146,34376,34377],{"class":148,"line":660},[146,34378,34379],{"class":160},"            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n",[146,34381,34382,34385,34387],{"class":148,"line":671},[146,34383,34384],{"class":160},"            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.",[146,34386,12126],{"class":156},[146,34388,950],{"class":160},[146,34390,34391],{"class":148,"line":698},[146,34392,34393],{"class":160},"            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n",[146,34395,34396],{"class":148,"line":710},[146,34397,34398],{"class":160},"            \"lighting. Clean, premium aesthetic throughout.\"\n",[146,34400,34401],{"class":148,"line":716},[146,34402,1342],{"class":263},[146,34404,34405,34407,34409,34411],{"class":148,"line":722},[146,34406,1347],{"class":160},[146,34408,437],{"class":263},[146,34410,3909],{"class":156},[146,34412,452],{"class":263},[146,34414,34415,34417,34419],{"class":148,"line":728},[146,34416,1363],{"class":160},[146,34418,437],{"class":263},[146,34420,32789],{"class":160},[146,34422,34423],{"class":148,"line":739},[146,34424,1407],{"class":263},[146,34426,34427],{"class":148,"line":744},[146,34428,406],{"class":263},[146,34430,34431],{"class":148,"line":750},[146,34432,33686],{"class":175},[32395,34434,34436],{"id":34435},"i2-캐릭터-애니메이션-그림-속-여인의-커피-모험","I2: 캐릭터 애니메이션 — 그림 속 여인의 커피 모험",[11,34438,34439,34441,34442,34444],{},[23,34440,33448],{}," 그림 속 캐릭터가 매혹적인 커피 도둑질 장면에서 살아나며, ",[28,34443,2911],{},"이 마법 같은 내러티브 순간 전반에 걸쳐 캐릭터 외형을 어떻게 유지하는지 보여줍니다.",[56,34446,60,34447],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34448],{"src":18795,"type":65},[137,34450,34452],{"className":338,"code":34451,"language":340,"meta":142,"style":142},"# I2: 캐릭터 애니메이션 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/painted_noblewoman.jpg\"],\n        \"prompt\": (\n            \"@Image1 as character reference.\\n\"\n            \"【Style】Cinematic realism with magical elements, warm practical lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).\\n\"\n            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n            \"left and right nervously. Her painted hand animates and pushes forward through \"\n            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n            \"cup sitting on the table in front of the frame.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).\\n\"\n            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n            \"gallery lighting.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).\\n\"\n            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n            \"The woman freezes back into painting pose.\\n\\n\"\n            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).\\n\"\n            \"Camera pushes forward as the scene fades to a pure black background with a \"\n            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n            \"bottom: 'Good coffee is worth the wait.'\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n            \"painted and living states. Realistic coffee physics.\"\n        ),\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,34453,34454,34459,34467,34479,34501,34509,34519,34530,34536,34545,34554,34562,34571,34576,34581,34586,34595,34604,34609,34614,34623,34632,34637,34642,34651,34660,34665,34670,34679,34684,34689,34693,34703,34711,34715,34719],{"__ignoreMap":142},[146,34455,34456],{"class":148,"line":149},[146,34457,34458],{"class":175},"# I2: 캐릭터 애니메이션 — 위 첫 번째 예제의 설정 사용\n",[146,34460,34461,34463,34465],{"class":148,"line":167},[146,34462,6532],{"class":263},[146,34464,267],{"class":259},[146,34466,1432],{"class":263},[146,34468,34469,34471,34473,34475,34477],{"class":148,"line":179},[146,34470,6541],{"class":259},[146,34472,449],{"class":160},[146,34474,679],{"class":156},[146,34476,1444],{"class":160},[146,34478,452],{"class":263},[146,34480,34481,34483,34485,34487,34489,34491,34493,34495,34497,34499],{"class":148,"line":188},[146,34482,6554],{"class":701},[146,34484,267],{"class":259},[146,34486,685],{"class":263},[146,34488,31550],{"class":160},[146,34490,437],{"class":263},[146,34492,440],{"class":259},[146,34494,443],{"class":160},[146,34496,446],{"class":156},[146,34498,449],{"class":160},[146,34500,19596],{"class":263},[146,34502,34503,34505,34507],{"class":148,"line":373},[146,34504,6565],{"class":701},[146,34506,267],{"class":259},[146,34508,1864],{"class":263},[146,34510,34511,34513,34515,34517],{"class":148,"line":379},[146,34512,1303],{"class":160},[146,34514,437],{"class":263},[146,34516,1308],{"class":160},[146,34518,452],{"class":263},[146,34520,34521,34523,34525,34528],{"class":148,"line":385},[146,34522,2690],{"class":160},[146,34524,10846],{"class":263},[146,34526,34527],{"class":160},"\"https://example.com/painted_noblewoman.jpg\"",[146,34529,10852],{"class":263},[146,34531,34532,34534],{"class":148,"line":409},[146,34533,1319],{"class":160},[146,34535,1322],{"class":263},[146,34537,34538,34541,34543],{"class":148,"line":420},[146,34539,34540],{"class":160},"            \"@Image1 as character reference.",[146,34542,1670],{"class":156},[146,34544,950],{"class":160},[146,34546,34547,34550,34552],{"class":148,"line":431},[146,34548,34549],{"class":160},"            \"【Style】Cinematic realism with magical elements, warm practical lighting.",[146,34551,1670],{"class":156},[146,34553,950],{"class":160},[146,34555,34556,34558,34560],{"class":148,"line":455},[146,34557,34313],{"class":160},[146,34559,12126],{"class":156},[146,34561,950],{"class":160},[146,34563,34564,34567,34569],{"class":148,"line":466},[146,34565,34566],{"class":160},"            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).",[146,34568,1670],{"class":156},[146,34570,950],{"class":160},[146,34572,34573],{"class":148,"line":600},[146,34574,34575],{"class":160},"            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n",[146,34577,34578],{"class":148,"line":605},[146,34579,34580],{"class":160},"            \"left and right nervously. Her painted hand animates and pushes forward through \"\n",[146,34582,34583],{"class":148,"line":611},[146,34584,34585],{"class":160},"            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n",[146,34587,34588,34591,34593],{"class":148,"line":617},[146,34589,34590],{"class":160},"            \"cup sitting on the table in front of the frame.",[146,34592,12126],{"class":156},[146,34594,950],{"class":160},[146,34596,34597,34600,34602],{"class":148,"line":623},[146,34598,34599],{"class":160},"            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).",[146,34601,1670],{"class":156},[146,34603,950],{"class":160},[146,34605,34606],{"class":148,"line":628},[146,34607,34608],{"class":160},"            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n",[146,34610,34611],{"class":148,"line":639},[146,34612,34613],{"class":160},"            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n",[146,34615,34616,34619,34621],{"class":148,"line":654},[146,34617,34618],{"class":160},"            \"gallery lighting.",[146,34620,12126],{"class":156},[146,34622,950],{"class":160},[146,34624,34625,34628,34630],{"class":148,"line":660},[146,34626,34627],{"class":160},"            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).",[146,34629,1670],{"class":156},[146,34631,950],{"class":160},[146,34633,34634],{"class":148,"line":671},[146,34635,34636],{"class":160},"            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n",[146,34638,34639],{"class":148,"line":698},[146,34640,34641],{"class":160},"            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n",[146,34643,34644,34647,34649],{"class":148,"line":710},[146,34645,34646],{"class":160},"            \"The woman freezes back into painting pose.",[146,34648,12126],{"class":156},[146,34650,950],{"class":160},[146,34652,34653,34656,34658],{"class":148,"line":716},[146,34654,34655],{"class":160},"            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).",[146,34657,1670],{"class":156},[146,34659,950],{"class":160},[146,34661,34662],{"class":148,"line":722},[146,34663,34664],{"class":160},"            \"Camera pushes forward as the scene fades to a pure black background with a \"\n",[146,34666,34667],{"class":148,"line":728},[146,34668,34669],{"class":160},"            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n",[146,34671,34672,34675,34677],{"class":148,"line":739},[146,34673,34674],{"class":160},"            \"bottom: 'Good coffee is worth the wait.'",[146,34676,12126],{"class":156},[146,34678,950],{"class":160},[146,34680,34681],{"class":148,"line":744},[146,34682,34683],{"class":160},"            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n",[146,34685,34686],{"class":148,"line":750},[146,34687,34688],{"class":160},"            \"painted and living states. Realistic coffee physics.\"\n",[146,34690,34691],{"class":148,"line":767},[146,34692,1342],{"class":263},[146,34694,34695,34697,34699,34701],{"class":148,"line":788},[146,34696,1347],{"class":160},[146,34698,437],{"class":263},[146,34700,3909],{"class":156},[146,34702,452],{"class":263},[146,34704,34705,34707,34709],{"class":148,"line":834},[146,34706,1363],{"class":160},[146,34708,437],{"class":263},[146,34710,32789],{"class":160},[146,34712,34713],{"class":148,"line":839},[146,34714,1407],{"class":263},[146,34716,34717],{"class":148,"line":845},[146,34718,406],{"class":263},[146,34720,34721],{"class":148,"line":863},[146,34722,33686],{"class":175},[32395,34724,34726],{"id":34725},"i3-스타일-전환-사실적-사진에서-수묵화로","I3: 스타일 전환 — 사실적 사진에서 수묵화로",[11,34728,34729,34731,34732,34734],{},[23,34730,33448],{}," 사실적인 풍경 사진을 살아 움직이는 전통 중국 수묵화(水墨画)로 변환하며, ",[28,34733,2911],{},"을 장면 구도 레퍼런스로 사용한 스타일 전환을 보여줍니다.",[56,34736,60,34737],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34738],{"src":25146,"type":65},[137,34740,34742],{"className":338,"code":34741,"language":340,"meta":142,"style":142},"# I3: 스타일 전환 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/realistic_landscape.jpg\"],\n        \"prompt\": (\n            \"@Image1 as scene composition reference.\\n\"\n            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).\\n\"\n            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n            \"fade as traditional ink wash aesthetics take over.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).\\n\"\n            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n            \"trails across the sky. Water effects spread ink at mountain bases.\\n\\n\"\n            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).\\n\"\n            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.\\n\\n\"\n            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n            \"No photorealism. Pure traditional ink wash aesthetic.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,34743,34744,34749,34757,34769,34791,34799,34809,34820,34826,34835,34844,34852,34861,34866,34871,34880,34889,34894,34899,34908,34917,34922,34927,34936,34941,34946,34950,34960,34968,34972,34976],{"__ignoreMap":142},[146,34745,34746],{"class":148,"line":149},[146,34747,34748],{"class":175},"# I3: 스타일 전환 — 위 첫 번째 예제의 설정 사용\n",[146,34750,34751,34753,34755],{"class":148,"line":167},[146,34752,6532],{"class":263},[146,34754,267],{"class":259},[146,34756,1432],{"class":263},[146,34758,34759,34761,34763,34765,34767],{"class":148,"line":179},[146,34760,6541],{"class":259},[146,34762,449],{"class":160},[146,34764,679],{"class":156},[146,34766,1444],{"class":160},[146,34768,452],{"class":263},[146,34770,34771,34773,34775,34777,34779,34781,34783,34785,34787,34789],{"class":148,"line":188},[146,34772,6554],{"class":701},[146,34774,267],{"class":259},[146,34776,685],{"class":263},[146,34778,31550],{"class":160},[146,34780,437],{"class":263},[146,34782,440],{"class":259},[146,34784,443],{"class":160},[146,34786,446],{"class":156},[146,34788,449],{"class":160},[146,34790,19596],{"class":263},[146,34792,34793,34795,34797],{"class":148,"line":373},[146,34794,6565],{"class":701},[146,34796,267],{"class":259},[146,34798,1864],{"class":263},[146,34800,34801,34803,34805,34807],{"class":148,"line":379},[146,34802,1303],{"class":160},[146,34804,437],{"class":263},[146,34806,1308],{"class":160},[146,34808,452],{"class":263},[146,34810,34811,34813,34815,34818],{"class":148,"line":385},[146,34812,2690],{"class":160},[146,34814,10846],{"class":263},[146,34816,34817],{"class":160},"\"https://example.com/realistic_landscape.jpg\"",[146,34819,10852],{"class":263},[146,34821,34822,34824],{"class":148,"line":409},[146,34823,1319],{"class":160},[146,34825,1322],{"class":263},[146,34827,34828,34831,34833],{"class":148,"line":420},[146,34829,34830],{"class":160},"            \"@Image1 as scene composition reference.",[146,34832,1670],{"class":156},[146,34834,950],{"class":160},[146,34836,34837,34840,34842],{"class":148,"line":431},[146,34838,34839],{"class":160},"            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.",[146,34841,1670],{"class":156},[146,34843,950],{"class":160},[146,34845,34846,34848,34850],{"class":148,"line":455},[146,34847,33543],{"class":160},[146,34849,12126],{"class":156},[146,34851,950],{"class":160},[146,34853,34854,34857,34859],{"class":148,"line":466},[146,34855,34856],{"class":160},"            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).",[146,34858,1670],{"class":156},[146,34860,950],{"class":160},[146,34862,34863],{"class":148,"line":600},[146,34864,34865],{"class":160},"            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n",[146,34867,34868],{"class":148,"line":605},[146,34869,34870],{"class":160},"            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n",[146,34872,34873,34876,34878],{"class":148,"line":611},[146,34874,34875],{"class":160},"            \"fade as traditional ink wash aesthetics take over.",[146,34877,12126],{"class":156},[146,34879,950],{"class":160},[146,34881,34882,34885,34887],{"class":148,"line":617},[146,34883,34884],{"class":160},"            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).",[146,34886,1670],{"class":156},[146,34888,950],{"class":160},[146,34890,34891],{"class":148,"line":623},[146,34892,34893],{"class":160},"            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n",[146,34895,34896],{"class":148,"line":628},[146,34897,34898],{"class":160},"            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n",[146,34900,34901,34904,34906],{"class":148,"line":639},[146,34902,34903],{"class":160},"            \"trails across the sky. Water effects spread ink at mountain bases.",[146,34905,12126],{"class":156},[146,34907,950],{"class":160},[146,34909,34910,34913,34915],{"class":148,"line":654},[146,34911,34912],{"class":160},"            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).",[146,34914,1670],{"class":156},[146,34916,950],{"class":160},[146,34918,34919],{"class":148,"line":660},[146,34920,34921],{"class":160},"            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n",[146,34923,34924],{"class":148,"line":671},[146,34925,34926],{"class":160},"            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n",[146,34928,34929,34932,34934],{"class":148,"line":698},[146,34930,34931],{"class":160},"            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.",[146,34933,12126],{"class":156},[146,34935,950],{"class":160},[146,34937,34938],{"class":148,"line":710},[146,34939,34940],{"class":160},"            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n",[146,34942,34943],{"class":148,"line":716},[146,34944,34945],{"class":160},"            \"No photorealism. Pure traditional ink wash aesthetic.\"\n",[146,34947,34948],{"class":148,"line":722},[146,34949,1342],{"class":263},[146,34951,34952,34954,34956,34958],{"class":148,"line":728},[146,34953,1347],{"class":160},[146,34955,437],{"class":263},[146,34957,16416],{"class":156},[146,34959,452],{"class":263},[146,34961,34962,34964,34966],{"class":148,"line":739},[146,34963,1363],{"class":160},[146,34965,437],{"class":263},[146,34967,32789],{"class":160},[146,34969,34970],{"class":148,"line":744},[146,34971,1407],{"class":263},[146,34973,34974],{"class":148,"line":750},[146,34975,406],{"class":263},[146,34977,34978],{"class":148,"line":767},[146,34979,33686],{"class":175},[32395,34981,34983],{"id":34982},"i4-다중-이미지-원샷-내러티브-도시-파쿠르","I4: 다중 이미지 원샷 내러티브 — 도시 파쿠르",[11,34985,34986,34988,34989,34992],{},[23,34987,33448],{}," 여러 장소 이미지를 파쿠르 러너의 ��나의 연속 트래킹 샷으로 자연스럽게 연결하여, 정밀한 타이밍을 위한 샷 스크립트 형식으로 웅장한 도시 여정을 만듭니다. 이 기법은 ",[37,34990,34991],{"href":3860},"카메라 무브먼트 복제"," 패턴을 기반으로 합니다.",[56,34994,60,34995],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34996],{"src":12259,"type":65},[137,34998,35000],{"className":338,"code":34999,"language":340,"meta":142,"style":142},"# I4: 다중 이미지 원샷 내러티브 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\n            \"https://example.com/city_street.jpg\",\n            \"https://example.com/staircase.jpg\",\n            \"https://example.com/pedestrian_bridge.jpg\",\n            \"https://example.com/rooftop_building.jpg\",\n            \"https://example.com/city_skyline.jpg\"\n        ],\n        \"prompt\": (\n            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n            \"following a parkour runner sprinting through city streets leaping up staircases \"\n            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n            \"the frame. Dynamic powerful full of freedom and energy.\\n\"\n            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:03] Urban Sprint (@Image1 as environment).\\n\"\n            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.\\n\\n\"\n            \"[00:03-00:06] Staircase Vault (@Image2 as environment).\\n\"\n            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n            \"architectural details sharp in focus.\\n\\n\"\n            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).\\n\"\n            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n            \"the runner's clothing.\\n\\n\"\n            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).\\n\"\n            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n            \"to follow the vertical movement. Urban landscape spreads out below.\\n\\n\"\n            \"[00:12-00:15] Victory Moment (@Image5 as environment).\\n\"\n            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n            \"reveal the epic scale of the journey completed.\\n\\n\"\n            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n            \"Realistic parkour physics. Golden hour lighting throughout.\"\n        ),\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,35001,35002,35007,35015,35027,35049,35057,35067,35073,35080,35087,35094,35101,35106,35110,35116,35121,35126,35131,35136,35145,35154,35162,35171,35176,35181,35190,35199,35204,35209,35218,35227,35232,35237,35246,35255,35260,35269,35278,35283,35288,35297,35302,35307,35311,35321,35329,35333,35337],{"__ignoreMap":142},[146,35003,35004],{"class":148,"line":149},[146,35005,35006],{"class":175},"# I4: 다중 이미지 원샷 내러티브 — 위 첫 번째 예제의 설정 사용\n",[146,35008,35009,35011,35013],{"class":148,"line":167},[146,35010,6532],{"class":263},[146,35012,267],{"class":259},[146,35014,1432],{"class":263},[146,35016,35017,35019,35021,35023,35025],{"class":148,"line":179},[146,35018,6541],{"class":259},[146,35020,449],{"class":160},[146,35022,679],{"class":156},[146,35024,1444],{"class":160},[146,35026,452],{"class":263},[146,35028,35029,35031,35033,35035,35037,35039,35041,35043,35045,35047],{"class":148,"line":188},[146,35030,6554],{"class":701},[146,35032,267],{"class":259},[146,35034,685],{"class":263},[146,35036,31550],{"class":160},[146,35038,437],{"class":263},[146,35040,440],{"class":259},[146,35042,443],{"class":160},[146,35044,446],{"class":156},[146,35046,449],{"class":160},[146,35048,19596],{"class":263},[146,35050,35051,35053,35055],{"class":148,"line":373},[146,35052,6565],{"class":701},[146,35054,267],{"class":259},[146,35056,1864],{"class":263},[146,35058,35059,35061,35063,35065],{"class":148,"line":379},[146,35060,1303],{"class":160},[146,35062,437],{"class":263},[146,35064,1308],{"class":160},[146,35066,452],{"class":263},[146,35068,35069,35071],{"class":148,"line":385},[146,35070,2690],{"class":160},[146,35072,2693],{"class":263},[146,35074,35075,35078],{"class":148,"line":409},[146,35076,35077],{"class":160},"            \"https://example.com/city_street.jpg\"",[146,35079,452],{"class":263},[146,35081,35082,35085],{"class":148,"line":420},[146,35083,35084],{"class":160},"            \"https://example.com/staircase.jpg\"",[146,35086,452],{"class":263},[146,35088,35089,35092],{"class":148,"line":431},[146,35090,35091],{"class":160},"            \"https://example.com/pedestrian_bridge.jpg\"",[146,35093,452],{"class":263},[146,35095,35096,35099],{"class":148,"line":455},[146,35097,35098],{"class":160},"            \"https://example.com/rooftop_building.jpg\"",[146,35100,452],{"class":263},[146,35102,35103],{"class":148,"line":466},[146,35104,35105],{"class":160},"            \"https://example.com/city_skyline.jpg\"\n",[146,35107,35108],{"class":148,"line":600},[146,35109,2703],{"class":263},[146,35111,35112,35114],{"class":148,"line":605},[146,35113,1319],{"class":160},[146,35115,1322],{"class":263},[146,35117,35118],{"class":148,"line":611},[146,35119,35120],{"class":160},"            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n",[146,35122,35123],{"class":148,"line":617},[146,35124,35125],{"class":160},"            \"following a parkour runner sprinting through city streets leaping up staircases \"\n",[146,35127,35128],{"class":148,"line":623},[146,35129,35130],{"class":160},"            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n",[146,35132,35133],{"class":148,"line":628},[146,35134,35135],{"class":160},"            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n",[146,35137,35138,35141,35143],{"class":148,"line":639},[146,35139,35140],{"class":160},"            \"the frame. Dynamic powerful full of freedom and energy.",[146,35142,1670],{"class":156},[146,35144,950],{"class":160},[146,35146,35147,35150,35152],{"class":148,"line":654},[146,35148,35149],{"class":160},"            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.",[146,35151,1670],{"class":156},[146,35153,950],{"class":160},[146,35155,35156,35158,35160],{"class":148,"line":660},[146,35157,34313],{"class":160},[146,35159,12126],{"class":156},[146,35161,950],{"class":160},[146,35163,35164,35167,35169],{"class":148,"line":671},[146,35165,35166],{"class":160},"            \"[00:00-00:03] Urban Sprint (@Image1 as environment).",[146,35168,1670],{"class":156},[146,35170,950],{"class":160},[146,35172,35173],{"class":148,"line":698},[146,35174,35175],{"class":160},"            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n",[146,35177,35178],{"class":148,"line":710},[146,35179,35180],{"class":160},"            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n",[146,35182,35183,35186,35188],{"class":148,"line":716},[146,35184,35185],{"class":160},"            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.",[146,35187,12126],{"class":156},[146,35189,950],{"class":160},[146,35191,35192,35195,35197],{"class":148,"line":722},[146,35193,35194],{"class":160},"            \"[00:03-00:06] Staircase Vault (@Image2 as environment).",[146,35196,1670],{"class":156},[146,35198,950],{"class":160},[146,35200,35201],{"class":148,"line":728},[146,35202,35203],{"class":160},"            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n",[146,35205,35206],{"class":148,"line":739},[146,35207,35208],{"class":160},"            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n",[146,35210,35211,35214,35216],{"class":148,"line":744},[146,35212,35213],{"class":160},"            \"architectural details sharp in focus.",[146,35215,12126],{"class":156},[146,35217,950],{"class":160},[146,35219,35220,35223,35225],{"class":148,"line":750},[146,35221,35222],{"class":160},"            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).",[146,35224,1670],{"class":156},[146,35226,950],{"class":160},[146,35228,35229],{"class":148,"line":767},[146,35230,35231],{"class":160},"            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n",[146,35233,35234],{"class":148,"line":788},[146,35235,35236],{"class":160},"            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n",[146,35238,35239,35242,35244],{"class":148,"line":834},[146,35240,35241],{"class":160},"            \"the runner's clothing.",[146,35243,12126],{"class":156},[146,35245,950],{"class":160},[146,35247,35248,35251,35253],{"class":148,"line":839},[146,35249,35250],{"class":160},"            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).",[146,35252,1670],{"class":156},[146,35254,950],{"class":160},[146,35256,35257],{"class":148,"line":845},[146,35258,35259],{"class":160},"            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n",[146,35261,35262,35265,35267],{"class":148,"line":863},[146,35263,35264],{"class":160},"            \"to follow the vertical movement. Urban landscape spreads out below.",[146,35266,12126],{"class":156},[146,35268,950],{"class":160},[146,35270,35271,35274,35276],{"class":148,"line":872},[146,35272,35273],{"class":160},"            \"[00:12-00:15] Victory Moment (@Image5 as environment).",[146,35275,1670],{"class":156},[146,35277,950],{"class":160},[146,35279,35280],{"class":148,"line":887},[146,35281,35282],{"class":160},"            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n",[146,35284,35285],{"class":148,"line":903},[146,35286,35287],{"class":160},"            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n",[146,35289,35290,35293,35295],{"class":148,"line":915},[146,35291,35292],{"class":160},"            \"reveal the epic scale of the journey completed.",[146,35294,12126],{"class":156},[146,35296,950],{"class":160},[146,35298,35299],{"class":148,"line":953},[146,35300,35301],{"class":160},"            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n",[146,35303,35304],{"class":148,"line":959},[146,35305,35306],{"class":160},"            \"Realistic parkour physics. Golden hour lighting throughout.\"\n",[146,35308,35309],{"class":148,"line":964},[146,35310,1342],{"class":263},[146,35312,35313,35315,35317,35319],{"class":148,"line":970},[146,35314,1347],{"class":160},[146,35316,437],{"class":263},[146,35318,3909],{"class":156},[146,35320,452],{"class":263},[146,35322,35323,35325,35327],{"class":148,"line":976},[146,35324,1363],{"class":160},[146,35326,437],{"class":263},[146,35328,32789],{"class":160},[146,35330,35331],{"class":148,"line":988},[146,35332,1407],{"class":263},[146,35334,35335],{"class":148,"line":993},[146,35336,406],{"class":263},[146,35338,35339],{"class":148,"line":5534},[146,35340,33686],{"class":175},[92,35342,35344],{"id":35343},"멀티모달-tag-템플릿","멀티모달 @Tag 템플릿",[32395,35346,35348],{"id":35347},"m1-고급-카메라-무브먼트-복제-크리스탈-던전-탐험","M1: 고급 카메라 무브먼트 복제 — 크리스탈 던전 탐험",[11,35350,35351,35353,35354,35357],{},[23,35352,33448],{}," 참조 비디오의 복잡한 카메라 움직임을 정밀하게 복제하면서 여러 이미지 레퍼런스와 함께 완전히 새로운 판타지 콘텐츠에 적용합니다. 전체 카메라 복제 워크플로우는 ",[37,35355,35356],{"href":3860},"전용 카메라 무브먼트 가이드","에서 배울 수 있습니다.",[56,35359,60,35360],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35361],{"src":35362,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%B0%B4%E6%99%B6%E6%8E%A2%E9%99%A9.mp4",[137,35364,35366],{"className":338,"code":35365,"language":340,"meta":142,"style":142},"# M1: 카메라 무브먼트 복제 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\n            \"https://example.com/dungeon_entrance.png\",\n            \"https://example.com/crystal_ceiling.png\",\n            \"https://example.com/left_passage.png\",\n            \"https://example.com/right_chamber.png\"\n        ],\n        \"video_urls\": [\"https://example.com/camera_movement_ref.mp4\"],\n        \"prompt\": (\n            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n            \"Reference @Video1 camera movement style exactly. The scene above references \"\n            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n            \"flickers across stone walls, casting dancing shadows.\\n\"\n            \"【Style】Fantasy adventure, realistic lighting, atmospheric.\\n\"\n            \"【Duration】9 seconds\\n\\n\"\n            \"[00:00-00:03] Entrance Discovery.\\n\"\n            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n            \"motion with subtle tilts to examine details.\\n\\n\"\n            \"[00:03-00:06] Chamber Exploration.\\n\"\n            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n            \"light creates dynamic shadows on dungeon walls.\\n\\n\"\n            \"[00:06-00:09] Final Discovery.\\n\"\n            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n            \"Golden light from treasures mingles with lantern glow.\\n\\n\"\n            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n            \"and shadow casting. Atmospheric dungeon ambiance.\"\n        ),\n        \"duration\": 9,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,35367,35368,35373,35381,35393,35415,35423,35433,35439,35446,35453,35460,35465,35469,35480,35486,35491,35496,35501,35506,35515,35524,35533,35542,35547,35552,35561,35570,35575,35580,35589,35598,35603,35608,35617,35622,35627,35631,35642,35650,35654,35658],{"__ignoreMap":142},[146,35369,35370],{"class":148,"line":149},[146,35371,35372],{"class":175},"# M1: 카메라 무브먼트 복제 — 위 첫 번째 예제의 설정 사용\n",[146,35374,35375,35377,35379],{"class":148,"line":167},[146,35376,6532],{"class":263},[146,35378,267],{"class":259},[146,35380,1432],{"class":263},[146,35382,35383,35385,35387,35389,35391],{"class":148,"line":179},[146,35384,6541],{"class":259},[146,35386,449],{"class":160},[146,35388,679],{"class":156},[146,35390,1444],{"class":160},[146,35392,452],{"class":263},[146,35394,35395,35397,35399,35401,35403,35405,35407,35409,35411,35413],{"class":148,"line":188},[146,35396,6554],{"class":701},[146,35398,267],{"class":259},[146,35400,685],{"class":263},[146,35402,31550],{"class":160},[146,35404,437],{"class":263},[146,35406,440],{"class":259},[146,35408,443],{"class":160},[146,35410,446],{"class":156},[146,35412,449],{"class":160},[146,35414,19596],{"class":263},[146,35416,35417,35419,35421],{"class":148,"line":373},[146,35418,6565],{"class":701},[146,35420,267],{"class":259},[146,35422,1864],{"class":263},[146,35424,35425,35427,35429,35431],{"class":148,"line":379},[146,35426,1303],{"class":160},[146,35428,437],{"class":263},[146,35430,1308],{"class":160},[146,35432,452],{"class":263},[146,35434,35435,35437],{"class":148,"line":385},[146,35436,2690],{"class":160},[146,35438,2693],{"class":263},[146,35440,35441,35444],{"class":148,"line":409},[146,35442,35443],{"class":160},"            \"https://example.com/dungeon_entrance.png\"",[146,35445,452],{"class":263},[146,35447,35448,35451],{"class":148,"line":420},[146,35449,35450],{"class":160},"            \"https://example.com/crystal_ceiling.png\"",[146,35452,452],{"class":263},[146,35454,35455,35458],{"class":148,"line":431},[146,35456,35457],{"class":160},"            \"https://example.com/left_passage.png\"",[146,35459,452],{"class":263},[146,35461,35462],{"class":148,"line":455},[146,35463,35464],{"class":160},"            \"https://example.com/right_chamber.png\"\n",[146,35466,35467],{"class":148,"line":466},[146,35468,2703],{"class":263},[146,35470,35471,35473,35475,35478],{"class":148,"line":600},[146,35472,12162],{"class":160},[146,35474,10846],{"class":263},[146,35476,35477],{"class":160},"\"https://example.com/camera_movement_ref.mp4\"",[146,35479,10852],{"class":263},[146,35481,35482,35484],{"class":148,"line":605},[146,35483,1319],{"class":160},[146,35485,1322],{"class":263},[146,35487,35488],{"class":148,"line":611},[146,35489,35490],{"class":160},"            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n",[146,35492,35493],{"class":148,"line":617},[146,35494,35495],{"class":160},"            \"Reference @Video1 camera movement style exactly. The scene above references \"\n",[146,35497,35498],{"class":148,"line":623},[146,35499,35500],{"class":160},"            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n",[146,35502,35503],{"class":148,"line":628},[146,35504,35505],{"class":160},"            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n",[146,35507,35508,35511,35513],{"class":148,"line":639},[146,35509,35510],{"class":160},"            \"flickers across stone walls, casting dancing shadows.",[146,35512,1670],{"class":156},[146,35514,950],{"class":160},[146,35516,35517,35520,35522],{"class":148,"line":654},[146,35518,35519],{"class":160},"            \"【Style】Fantasy adventure, realistic lighting, atmospheric.",[146,35521,1670],{"class":156},[146,35523,950],{"class":160},[146,35525,35526,35529,35531],{"class":148,"line":660},[146,35527,35528],{"class":160},"            \"【Duration】9 seconds",[146,35530,12126],{"class":156},[146,35532,950],{"class":160},[146,35534,35535,35538,35540],{"class":148,"line":671},[146,35536,35537],{"class":160},"            \"[00:00-00:03] Entrance Discovery.",[146,35539,1670],{"class":156},[146,35541,950],{"class":160},[146,35543,35544],{"class":148,"line":698},[146,35545,35546],{"class":160},"            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n",[146,35548,35549],{"class":148,"line":710},[146,35550,35551],{"class":160},"            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n",[146,35553,35554,35557,35559],{"class":148,"line":716},[146,35555,35556],{"class":160},"            \"motion with subtle tilts to examine details.",[146,35558,12126],{"class":156},[146,35560,950],{"class":160},[146,35562,35563,35566,35568],{"class":148,"line":722},[146,35564,35565],{"class":160},"            \"[00:03-00:06] Chamber Exploration.",[146,35567,1670],{"class":156},[146,35569,950],{"class":160},[146,35571,35572],{"class":148,"line":728},[146,35573,35574],{"class":160},"            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n",[146,35576,35577],{"class":148,"line":739},[146,35578,35579],{"class":160},"            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n",[146,35581,35582,35585,35587],{"class":148,"line":744},[146,35583,35584],{"class":160},"            \"light creates dynamic shadows on dungeon walls.",[146,35586,12126],{"class":156},[146,35588,950],{"class":160},[146,35590,35591,35594,35596],{"class":148,"line":750},[146,35592,35593],{"class":160},"            \"[00:06-00:09] Final Discovery.",[146,35595,1670],{"class":156},[146,35597,950],{"class":160},[146,35599,35600],{"class":148,"line":767},[146,35601,35602],{"class":160},"            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n",[146,35604,35605],{"class":148,"line":788},[146,35606,35607],{"class":160},"            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n",[146,35609,35610,35613,35615],{"class":148,"line":834},[146,35611,35612],{"class":160},"            \"Golden light from treasures mingles with lantern glow.",[146,35614,12126],{"class":156},[146,35616,950],{"class":160},[146,35618,35619],{"class":148,"line":839},[146,35620,35621],{"class":160},"            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n",[146,35623,35624],{"class":148,"line":845},[146,35625,35626],{"class":160},"            \"and shadow casting. Atmospheric dungeon ambiance.\"\n",[146,35628,35629],{"class":148,"line":863},[146,35630,1342],{"class":263},[146,35632,35633,35635,35637,35640],{"class":148,"line":872},[146,35634,1347],{"class":160},[146,35636,437],{"class":263},[146,35638,35639],{"class":156},"9",[146,35641,452],{"class":263},[146,35643,35644,35646,35648],{"class":148,"line":887},[146,35645,1363],{"class":160},[146,35647,437],{"class":263},[146,35649,32789],{"class":160},[146,35651,35652],{"class":148,"line":903},[146,35653,1407],{"class":263},[146,35655,35656],{"class":148,"line":915},[146,35657,406],{"class":263},[146,35659,35660],{"class":148,"line":953},[146,35661,33686],{"class":175},[32395,35663,35665],{"id":35664},"m2-캐릭터-카메라-무브먼트-동기화-무대-댄스-공연","M2: 캐릭터 + 카메라 무브먼트 동기화 — 무대 댄스 공연",[11,35667,35668,35670],{},[23,35669,33448],{}," 이미지의 캐릭터 레퍼런스와 비디오 레퍼런스의 카메라 무브먼트 및 댄스 안무를 결합하여 동기화된 퍼포먼스 아트를 만듭니다.",[56,35672,60,35673],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35674],{"src":35675,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%A5%B3%E7%94%9F%E8%B7%B3%E8%88%9E.mp4",[137,35677,35679],{"className":338,"code":35678,"language":340,"meta":142,"style":142},"# M2: 캐릭터 + 카메라 동기화 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/stage_dancer.png\"],\n        \"video_urls\": [\"https://example.com/dance_movement_ref.mp4\"],\n        \"prompt\": (\n            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n            \"references @Video1 dance moves. Performing energetically on a colorful \"\n            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.\\n\"\n            \"【Style】Concert performance, dynamic stage lighting, high energy.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Opening Sequence.\\n\"\n            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.\\n\\n\"\n            \"[00:04-00:08] Dynamic Performance.\\n\"\n            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n            \"colored lighting, creating atmospheric depth.\\n\\n\"\n            \"[00:08-00:12] Finale Moment.\\n\"\n            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n            \"Sparkle effects cascade down around the performer.\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n            \"choreography timing from @Video1. Professional stage lighting effects.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,35680,35681,35686,35694,35706,35728,35736,35746,35757,35768,35774,35779,35784,35789,35798,35807,35815,35824,35829,35834,35843,35852,35857,35862,35871,35880,35885,35890,35899,35904,35909,35913,35923,35931,35935,35939],{"__ignoreMap":142},[146,35682,35683],{"class":148,"line":149},[146,35684,35685],{"class":175},"# M2: 캐릭터 + 카메라 동기화 — 위 첫 번째 예제의 설정 사용\n",[146,35687,35688,35690,35692],{"class":148,"line":167},[146,35689,6532],{"class":263},[146,35691,267],{"class":259},[146,35693,1432],{"class":263},[146,35695,35696,35698,35700,35702,35704],{"class":148,"line":179},[146,35697,6541],{"class":259},[146,35699,449],{"class":160},[146,35701,679],{"class":156},[146,35703,1444],{"class":160},[146,35705,452],{"class":263},[146,35707,35708,35710,35712,35714,35716,35718,35720,35722,35724,35726],{"class":148,"line":188},[146,35709,6554],{"class":701},[146,35711,267],{"class":259},[146,35713,685],{"class":263},[146,35715,31550],{"class":160},[146,35717,437],{"class":263},[146,35719,440],{"class":259},[146,35721,443],{"class":160},[146,35723,446],{"class":156},[146,35725,449],{"class":160},[146,35727,19596],{"class":263},[146,35729,35730,35732,35734],{"class":148,"line":373},[146,35731,6565],{"class":701},[146,35733,267],{"class":259},[146,35735,1864],{"class":263},[146,35737,35738,35740,35742,35744],{"class":148,"line":379},[146,35739,1303],{"class":160},[146,35741,437],{"class":263},[146,35743,1308],{"class":160},[146,35745,452],{"class":263},[146,35747,35748,35750,35752,35755],{"class":148,"line":385},[146,35749,2690],{"class":160},[146,35751,10846],{"class":263},[146,35753,35754],{"class":160},"\"https://example.com/stage_dancer.png\"",[146,35756,10852],{"class":263},[146,35758,35759,35761,35763,35766],{"class":148,"line":409},[146,35760,12162],{"class":160},[146,35762,10846],{"class":263},[146,35764,35765],{"class":160},"\"https://example.com/dance_movement_ref.mp4\"",[146,35767,10852],{"class":263},[146,35769,35770,35772],{"class":148,"line":420},[146,35771,1319],{"class":160},[146,35773,1322],{"class":263},[146,35775,35776],{"class":148,"line":431},[146,35777,35778],{"class":160},"            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n",[146,35780,35781],{"class":148,"line":455},[146,35782,35783],{"class":160},"            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n",[146,35785,35786],{"class":148,"line":466},[146,35787,35788],{"class":160},"            \"references @Video1 dance moves. Performing energetically on a colorful \"\n",[146,35790,35791,35794,35796],{"class":148,"line":600},[146,35792,35793],{"class":160},"            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.",[146,35795,1670],{"class":156},[146,35797,950],{"class":160},[146,35799,35800,35803,35805],{"class":148,"line":605},[146,35801,35802],{"class":160},"            \"【Style】Concert performance, dynamic stage lighting, high energy.",[146,35804,1670],{"class":156},[146,35806,950],{"class":160},[146,35808,35809,35811,35813],{"class":148,"line":611},[146,35810,33543],{"class":160},[146,35812,12126],{"class":156},[146,35814,950],{"class":160},[146,35816,35817,35820,35822],{"class":148,"line":617},[146,35818,35819],{"class":160},"            \"[00:00-00:04] Opening Sequence.",[146,35821,1670],{"class":156},[146,35823,950],{"class":160},[146,35825,35826],{"class":148,"line":623},[146,35827,35828],{"class":160},"            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n",[146,35830,35831],{"class":148,"line":628},[146,35832,35833],{"class":160},"            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n",[146,35835,35836,35839,35841],{"class":148,"line":639},[146,35837,35838],{"class":160},"            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.",[146,35840,12126],{"class":156},[146,35842,950],{"class":160},[146,35844,35845,35848,35850],{"class":148,"line":654},[146,35846,35847],{"class":160},"            \"[00:04-00:08] Dynamic Performance.",[146,35849,1670],{"class":156},[146,35851,950],{"class":160},[146,35853,35854],{"class":148,"line":660},[146,35855,35856],{"class":160},"            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n",[146,35858,35859],{"class":148,"line":671},[146,35860,35861],{"class":160},"            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n",[146,35863,35864,35867,35869],{"class":148,"line":698},[146,35865,35866],{"class":160},"            \"colored lighting, creating atmospheric depth.",[146,35868,12126],{"class":156},[146,35870,950],{"class":160},[146,35872,35873,35876,35878],{"class":148,"line":710},[146,35874,35875],{"class":160},"            \"[00:08-00:12] Finale Moment.",[146,35877,1670],{"class":156},[146,35879,950],{"class":160},[146,35881,35882],{"class":148,"line":716},[146,35883,35884],{"class":160},"            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n",[146,35886,35887],{"class":148,"line":722},[146,35888,35889],{"class":160},"            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n",[146,35891,35892,35895,35897],{"class":148,"line":728},[146,35893,35894],{"class":160},"            \"Sparkle effects cascade down around the performer.",[146,35896,12126],{"class":156},[146,35898,950],{"class":160},[146,35900,35901],{"class":148,"line":739},[146,35902,35903],{"class":160},"            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n",[146,35905,35906],{"class":148,"line":744},[146,35907,35908],{"class":160},"            \"choreography timing from @Video1. Professional stage lighting effects.\"\n",[146,35910,35911],{"class":148,"line":750},[146,35912,1342],{"class":263},[146,35914,35915,35917,35919,35921],{"class":148,"line":767},[146,35916,1347],{"class":160},[146,35918,437],{"class":263},[146,35920,16416],{"class":156},[146,35922,452],{"class":263},[146,35924,35925,35927,35929],{"class":148,"line":788},[146,35926,1363],{"class":160},[146,35928,437],{"class":263},[146,35930,32789],{"class":160},[146,35932,35933],{"class":148,"line":834},[146,35934,1407],{"class":263},[146,35936,35937],{"class":148,"line":839},[146,35938,406],{"class":263},[146,35940,35941],{"class":148,"line":845},[146,35942,33686],{"class":175},[32395,35944,35946],{"id":35945},"m3-추격-장면-빨간-코트의-신비로운-인물","M3: 추격 장면 — 빨간 코트의 신비로운 인물",[11,35948,35949,35951],{},[23,35950,33448],{}," 빨간 코트를 입은 신비로운 인물이 도시 거리를 질주하는 긴박한 추격 시퀀스를 만들며, 스릴러 촬영 기법과 극적인 긴장감 구축을 보여줍니다.",[56,35953,60,35954],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35955],{"src":25986,"type":65},[137,35957,35959],{"className":338,"code":35958,"language":340,"meta":142,"style":142},"# M3: 추격 장면 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/red_coat_figure.jpg\"],\n        \"prompt\": (\n            \"@Image1 as character reference — mysterious figure in distinctive red coat.\\n\"\n            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).\\n\"\n            \"The red-coated figure sprints through narrow city alleyways at night. \"\n            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n            \"Tension-building audio undertones.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).\\n\"\n            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n            \"follows from the side, maintaining speed. Red coat stands out against the \"\n            \"monochrome urban environment. Breathing is audible and labored.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).\\n\"\n            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n            \"the figure disappears into the night.\\n\\n\"\n            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n            \"preserved throughout.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,35960,35961,35966,35974,35986,36008,36016,36026,36037,36043,36052,36061,36069,36078,36083,36088,36093,36102,36111,36116,36121,36130,36139,36144,36149,36154,36163,36168,36173,36178,36182,36192,36200,36204,36208],{"__ignoreMap":142},[146,35962,35963],{"class":148,"line":149},[146,35964,35965],{"class":175},"# M3: 추격 장면 — 위 첫 번째 예제의 설정 사용\n",[146,35967,35968,35970,35972],{"class":148,"line":167},[146,35969,6532],{"class":263},[146,35971,267],{"class":259},[146,35973,1432],{"class":263},[146,35975,35976,35978,35980,35982,35984],{"class":148,"line":179},[146,35977,6541],{"class":259},[146,35979,449],{"class":160},[146,35981,679],{"class":156},[146,35983,1444],{"class":160},[146,35985,452],{"class":263},[146,35987,35988,35990,35992,35994,35996,35998,36000,36002,36004,36006],{"class":148,"line":188},[146,35989,6554],{"class":701},[146,35991,267],{"class":259},[146,35993,685],{"class":263},[146,35995,31550],{"class":160},[146,35997,437],{"class":263},[146,35999,440],{"class":259},[146,36001,443],{"class":160},[146,36003,446],{"class":156},[146,36005,449],{"class":160},[146,36007,19596],{"class":263},[146,36009,36010,36012,36014],{"class":148,"line":373},[146,36011,6565],{"class":701},[146,36013,267],{"class":259},[146,36015,1864],{"class":263},[146,36017,36018,36020,36022,36024],{"class":148,"line":379},[146,36019,1303],{"class":160},[146,36021,437],{"class":263},[146,36023,1308],{"class":160},[146,36025,452],{"class":263},[146,36027,36028,36030,36032,36035],{"class":148,"line":385},[146,36029,2690],{"class":160},[146,36031,10846],{"class":263},[146,36033,36034],{"class":160},"\"https://example.com/red_coat_figure.jpg\"",[146,36036,10852],{"class":263},[146,36038,36039,36041],{"class":148,"line":409},[146,36040,1319],{"class":160},[146,36042,1322],{"class":263},[146,36044,36045,36048,36050],{"class":148,"line":420},[146,36046,36047],{"class":160},"            \"@Image1 as character reference — mysterious figure in distinctive red coat.",[146,36049,1670],{"class":156},[146,36051,950],{"class":160},[146,36053,36054,36057,36059],{"class":148,"line":431},[146,36055,36056],{"class":160},"            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.",[146,36058,1670],{"class":156},[146,36060,950],{"class":160},[146,36062,36063,36065,36067],{"class":148,"line":455},[146,36064,33543],{"class":160},[146,36066,12126],{"class":156},[146,36068,950],{"class":160},[146,36070,36071,36074,36076],{"class":148,"line":466},[146,36072,36073],{"class":160},"            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).",[146,36075,1670],{"class":156},[146,36077,950],{"class":160},[146,36079,36080],{"class":148,"line":600},[146,36081,36082],{"class":160},"            \"The red-coated figure sprints through narrow city alleyways at night. \"\n",[146,36084,36085],{"class":148,"line":605},[146,36086,36087],{"class":160},"            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n",[146,36089,36090],{"class":148,"line":611},[146,36091,36092],{"class":160},"            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n",[146,36094,36095,36098,36100],{"class":148,"line":617},[146,36096,36097],{"class":160},"            \"Tension-building audio undertones.",[146,36099,12126],{"class":156},[146,36101,950],{"class":160},[146,36103,36104,36107,36109],{"class":148,"line":623},[146,36105,36106],{"class":160},"            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).",[146,36108,1670],{"class":156},[146,36110,950],{"class":160},[146,36112,36113],{"class":148,"line":628},[146,36114,36115],{"class":160},"            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n",[146,36117,36118],{"class":148,"line":639},[146,36119,36120],{"class":160},"            \"follows from the side, maintaining speed. Red coat stands out against the \"\n",[146,36122,36123,36126,36128],{"class":148,"line":654},[146,36124,36125],{"class":160},"            \"monochrome urban environment. Breathing is audible and labored.",[146,36127,12126],{"class":156},[146,36129,950],{"class":160},[146,36131,36132,36135,36137],{"class":148,"line":660},[146,36133,36134],{"class":160},"            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).",[146,36136,1670],{"class":156},[146,36138,950],{"class":160},[146,36140,36141],{"class":148,"line":671},[146,36142,36143],{"class":160},"            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n",[146,36145,36146],{"class":148,"line":698},[146,36147,36148],{"class":160},"            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n",[146,36150,36151],{"class":148,"line":710},[146,36152,36153],{"class":160},"            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n",[146,36155,36156,36159,36161],{"class":148,"line":716},[146,36157,36158],{"class":160},"            \"the figure disappears into the night.",[146,36160,12126],{"class":156},[146,36162,950],{"class":160},[146,36164,36165],{"class":148,"line":722},[146,36166,36167],{"class":160},"            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n",[146,36169,36170],{"class":148,"line":728},[146,36171,36172],{"class":160},"            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n",[146,36174,36175],{"class":148,"line":739},[146,36176,36177],{"class":160},"            \"preserved throughout.\"\n",[146,36179,36180],{"class":148,"line":744},[146,36181,1342],{"class":263},[146,36183,36184,36186,36188,36190],{"class":148,"line":750},[146,36185,1347],{"class":160},[146,36187,437],{"class":263},[146,36189,16416],{"class":156},[146,36191,452],{"class":263},[146,36193,36194,36196,36198],{"class":148,"line":767},[146,36195,1363],{"class":160},[146,36197,437],{"class":263},[146,36199,32789],{"class":160},[146,36201,36202],{"class":148,"line":788},[146,36203,1407],{"class":263},[146,36205,36206],{"class":148,"line":834},[146,36207,406],{"class":263},[146,36209,36210],{"class":148,"line":839},[146,36211,33686],{"class":175},[32395,36213,36215],{"id":36214},"보너스-거리-군중-추격-장면","보너스: 거리 군중 추격 장면",[11,36217,36218,36220],{},[23,36219,33448],{}," 군중이 달리는 장면을 보여주는 추가 예제로, 여러 캐릭터와 도시의 에너지가 필요한 액션 시퀀스에 적합합니다.",[56,36222,60,36223],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,36224],{"src":36225,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%A1%97%E5%A4%B4%E4%B8%80%E5%A0%86%E4%BA%BA%E5%9C%A8%E8%B7%91.mp4",[137,36227,36229],{"className":338,"code":36228,"language":340,"meta":142,"style":142},"# 보너스: 거리 군중 추격 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://example.com/street_crowd.jpg\"],\n        \"prompt\": (\n            \"@Image1 as scene reference for crowd composition and urban environment.\\n\"\n            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.\\n\"\n            \"【Duration】8 seconds\\n\\n\"\n            \"[00:00-00:03] Mass Movement Begins.\\n\"\n            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n            \"is handheld, in the middle of the action. Multiple individuals in different \"\n            \"clothing all moving in the same direction with urgent purpose.\\n\\n\"\n            \"[00:03-00:06] Chaos and Urgency.\\n\"\n            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n            \"flying hair, scattered personal items. People help each other maintain \"\n            \"pace. Urban storefronts blur past in the background.\\n\\n\"\n            \"[00:06-00:08] Dispersal.\\n\"\n            \"The crowd reaches an intersection and scatters in different directions. \"\n            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n            \"as people disappear down various streets.\\n\\n\"\n            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n            \"for authenticity. Urban street environment based on @Image1.\"\n        ),\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,36230,36231,36236,36244,36256,36278,36286,36296,36307,36313,36322,36331,36340,36349,36354,36359,36368,36377,36382,36387,36396,36405,36410,36415,36424,36429,36434,36438,36448,36456,36460,36464],{"__ignoreMap":142},[146,36232,36233],{"class":148,"line":149},[146,36234,36235],{"class":175},"# 보너스: 거리 군중 추격 — 위 첫 번째 예제의 설정 사용\n",[146,36237,36238,36240,36242],{"class":148,"line":167},[146,36239,6532],{"class":263},[146,36241,267],{"class":259},[146,36243,1432],{"class":263},[146,36245,36246,36248,36250,36252,36254],{"class":148,"line":179},[146,36247,6541],{"class":259},[146,36249,449],{"class":160},[146,36251,679],{"class":156},[146,36253,1444],{"class":160},[146,36255,452],{"class":263},[146,36257,36258,36260,36262,36264,36266,36268,36270,36272,36274,36276],{"class":148,"line":188},[146,36259,6554],{"class":701},[146,36261,267],{"class":259},[146,36263,685],{"class":263},[146,36265,31550],{"class":160},[146,36267,437],{"class":263},[146,36269,440],{"class":259},[146,36271,443],{"class":160},[146,36273,446],{"class":156},[146,36275,449],{"class":160},[146,36277,19596],{"class":263},[146,36279,36280,36282,36284],{"class":148,"line":373},[146,36281,6565],{"class":701},[146,36283,267],{"class":259},[146,36285,1864],{"class":263},[146,36287,36288,36290,36292,36294],{"class":148,"line":379},[146,36289,1303],{"class":160},[146,36291,437],{"class":263},[146,36293,1308],{"class":160},[146,36295,452],{"class":263},[146,36297,36298,36300,36302,36305],{"class":148,"line":385},[146,36299,2690],{"class":160},[146,36301,10846],{"class":263},[146,36303,36304],{"class":160},"\"https://example.com/street_crowd.jpg\"",[146,36306,10852],{"class":263},[146,36308,36309,36311],{"class":148,"line":409},[146,36310,1319],{"class":160},[146,36312,1322],{"class":263},[146,36314,36315,36318,36320],{"class":148,"line":420},[146,36316,36317],{"class":160},"            \"@Image1 as scene reference for crowd composition and urban environment.",[146,36319,1670],{"class":156},[146,36321,950],{"class":160},[146,36323,36324,36327,36329],{"class":148,"line":431},[146,36325,36326],{"class":160},"            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.",[146,36328,1670],{"class":156},[146,36330,950],{"class":160},[146,36332,36333,36336,36338],{"class":148,"line":455},[146,36334,36335],{"class":160},"            \"【Duration】8 seconds",[146,36337,12126],{"class":156},[146,36339,950],{"class":160},[146,36341,36342,36345,36347],{"class":148,"line":466},[146,36343,36344],{"class":160},"            \"[00:00-00:03] Mass Movement Begins.",[146,36346,1670],{"class":156},[146,36348,950],{"class":160},[146,36350,36351],{"class":148,"line":600},[146,36352,36353],{"class":160},"            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n",[146,36355,36356],{"class":148,"line":605},[146,36357,36358],{"class":160},"            \"is handheld, in the middle of the action. Multiple individuals in different \"\n",[146,36360,36361,36364,36366],{"class":148,"line":611},[146,36362,36363],{"class":160},"            \"clothing all moving in the same direction with urgent purpose.",[146,36365,12126],{"class":156},[146,36367,950],{"class":160},[146,36369,36370,36373,36375],{"class":148,"line":617},[146,36371,36372],{"class":160},"            \"[00:03-00:06] Chaos and Urgency.",[146,36374,1670],{"class":156},[146,36376,950],{"class":160},[146,36378,36379],{"class":148,"line":623},[146,36380,36381],{"class":160},"            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n",[146,36383,36384],{"class":148,"line":628},[146,36385,36386],{"class":160},"            \"flying hair, scattered personal items. People help each other maintain \"\n",[146,36388,36389,36392,36394],{"class":148,"line":639},[146,36390,36391],{"class":160},"            \"pace. Urban storefronts blur past in the background.",[146,36393,12126],{"class":156},[146,36395,950],{"class":160},[146,36397,36398,36401,36403],{"class":148,"line":654},[146,36399,36400],{"class":160},"            \"[00:06-00:08] Dispersal.",[146,36402,1670],{"class":156},[146,36404,950],{"class":160},[146,36406,36407],{"class":148,"line":660},[146,36408,36409],{"class":160},"            \"The crowd reaches an intersection and scatters in different directions. \"\n",[146,36411,36412],{"class":148,"line":671},[146,36413,36414],{"class":160},"            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n",[146,36416,36417,36420,36422],{"class":148,"line":698},[146,36418,36419],{"class":160},"            \"as people disappear down various streets.",[146,36421,12126],{"class":156},[146,36423,950],{"class":160},[146,36425,36426],{"class":148,"line":710},[146,36427,36428],{"class":160},"            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n",[146,36430,36431],{"class":148,"line":716},[146,36432,36433],{"class":160},"            \"for authenticity. Urban street environment based on @Image1.\"\n",[146,36435,36436],{"class":148,"line":722},[146,36437,1342],{"class":263},[146,36439,36440,36442,36444,36446],{"class":148,"line":728},[146,36441,1347],{"class":160},[146,36443,437],{"class":263},[146,36445,3702],{"class":156},[146,36447,452],{"class":263},[146,36449,36450,36452,36454],{"class":148,"line":739},[146,36451,1363],{"class":160},[146,36453,437],{"class":263},[146,36455,32789],{"class":160},[146,36457,36458],{"class":148,"line":744},[146,36459,1407],{"class":263},[146,36461,36462],{"class":148,"line":750},[146,36463,406],{"class":263},[146,36465,36466],{"class":148,"line":767},[146,36467,33686],{"class":175},[92,36469,36471],{"id":36470},"비디오-확장-템플릿","비디오 확장 템플릿",[32395,36473,36475],{"id":36474},"e1-브랜드-피날레를-포함한-정방향-확장","E1: 브랜드 피날레를 포함한 정방향 확장",[11,36477,36478,36480],{},[23,36479,33448],{}," 기존 비디오에 새로운 장면과 로고 및 태그라인이 포함된 전문적인 브랜드 마무리를 추가하여 확장합니다.",[137,36482,36484],{"className":338,"code":36483,"language":340,"meta":142,"style":142},"# E1: 정방향 확장 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"video_urls\": [\"https://example.com/existing_video.mp4\"],\n        \"prompt\": (\n            \"Extend @Video1 forward with 8 additional seconds.\\n\"\n            \"【Style】Match @Video1 style exactly.\\n\"\n            \"【Duration】8 seconds extension\\n\\n\"\n            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n            \"Show the product being used in natural environment with satisfied users. \"\n            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n            \"Maintain consistent lighting and color grading throughout. \"\n            \"Smooth transition from original content to extension.\"\n        ),\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,36485,36486,36491,36499,36511,36533,36541,36551,36562,36568,36577,36586,36595,36600,36605,36610,36615,36620,36624,36634,36642,36646,36650],{"__ignoreMap":142},[146,36487,36488],{"class":148,"line":149},[146,36489,36490],{"class":175},"# E1: 정방향 확장 — 위 첫 번째 예제의 설정 사용\n",[146,36492,36493,36495,36497],{"class":148,"line":167},[146,36494,6532],{"class":263},[146,36496,267],{"class":259},[146,36498,1432],{"class":263},[146,36500,36501,36503,36505,36507,36509],{"class":148,"line":179},[146,36502,6541],{"class":259},[146,36504,449],{"class":160},[146,36506,679],{"class":156},[146,36508,1444],{"class":160},[146,36510,452],{"class":263},[146,36512,36513,36515,36517,36519,36521,36523,36525,36527,36529,36531],{"class":148,"line":188},[146,36514,6554],{"class":701},[146,36516,267],{"class":259},[146,36518,685],{"class":263},[146,36520,31550],{"class":160},[146,36522,437],{"class":263},[146,36524,440],{"class":259},[146,36526,443],{"class":160},[146,36528,446],{"class":156},[146,36530,449],{"class":160},[146,36532,19596],{"class":263},[146,36534,36535,36537,36539],{"class":148,"line":373},[146,36536,6565],{"class":701},[146,36538,267],{"class":259},[146,36540,1864],{"class":263},[146,36542,36543,36545,36547,36549],{"class":148,"line":379},[146,36544,1303],{"class":160},[146,36546,437],{"class":263},[146,36548,1308],{"class":160},[146,36550,452],{"class":263},[146,36552,36553,36555,36557,36560],{"class":148,"line":385},[146,36554,12162],{"class":160},[146,36556,10846],{"class":263},[146,36558,36559],{"class":160},"\"https://example.com/existing_video.mp4\"",[146,36561,10852],{"class":263},[146,36563,36564,36566],{"class":148,"line":409},[146,36565,1319],{"class":160},[146,36567,1322],{"class":263},[146,36569,36570,36573,36575],{"class":148,"line":420},[146,36571,36572],{"class":160},"            \"Extend @Video1 forward with 8 additional seconds.",[146,36574,1670],{"class":156},[146,36576,950],{"class":160},[146,36578,36579,36582,36584],{"class":148,"line":431},[146,36580,36581],{"class":160},"            \"【Style】Match @Video1 style exactly.",[146,36583,1670],{"class":156},[146,36585,950],{"class":160},[146,36587,36588,36591,36593],{"class":148,"line":455},[146,36589,36590],{"class":160},"            \"【Duration】8 seconds extension",[146,36592,12126],{"class":156},[146,36594,950],{"class":160},[146,36596,36597],{"class":148,"line":466},[146,36598,36599],{"class":160},"            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n",[146,36601,36602],{"class":148,"line":600},[146,36603,36604],{"class":160},"            \"Show the product being used in natural environment with satisfied users. \"\n",[146,36606,36607],{"class":148,"line":605},[146,36608,36609],{"class":160},"            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n",[146,36611,36612],{"class":148,"line":611},[146,36613,36614],{"class":160},"            \"Maintain consistent lighting and color grading throughout. \"\n",[146,36616,36617],{"class":148,"line":617},[146,36618,36619],{"class":160},"            \"Smooth transition from original content to extension.\"\n",[146,36621,36622],{"class":148,"line":623},[146,36623,1342],{"class":263},[146,36625,36626,36628,36630,36632],{"class":148,"line":628},[146,36627,1347],{"class":160},[146,36629,437],{"class":263},[146,36631,3702],{"class":156},[146,36633,452],{"class":263},[146,36635,36636,36638,36640],{"class":148,"line":639},[146,36637,1363],{"class":160},[146,36639,437],{"class":263},[146,36641,32789],{"class":160},[146,36643,36644],{"class":148,"line":654},[146,36645,1407],{"class":263},[146,36647,36648],{"class":148,"line":660},[146,36649,406],{"class":263},[146,36651,36652],{"class":148,"line":671},[146,36653,33686],{"class":175},[32395,36655,36657],{"id":36656},"e2-배경-스토리를-포함한-역방향-확장","E2: 배경 스토리를 포함한 역방향 확장",[11,36659,36660,36662],{},[23,36661,33448],{}," 기존 비디오 콘텐츠 앞에 맥락과 설정을 추가하여 더 완성도 높은 내러티브를 만듭니다.",[137,36664,36666],{"className":338,"code":36665,"language":340,"meta":142,"style":142},"# E2: 역방향 확장 — 위 첫 번째 예제의 설정 사용\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"video_urls\": [\"https://example.com/main_video.mp4\"],\n        \"prompt\": (\n            \"Create 6 seconds of backstory before @Video1 begins.\\n\"\n            \"【Style】Match @Video1 visual style exactly.\\n\"\n            \"【Duration】6 seconds extension\\n\\n\"\n            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n            \"Match the visual style, lighting, and character appearances exactly. \"\n            \"Create narrative tension that builds toward the existing video's opening moment. \"\n            \"Seamless transition into original content.\"\n        ),\n        \"duration\": 6,\n        \"quality\": \"1080p\"\n    }\n)\n# 위 첫 번째 예제와 동일한 폴링 루프 사용\n",[28,36667,36668,36673,36681,36693,36715,36723,36733,36744,36750,36759,36768,36777,36782,36787,36792,36797,36802,36806,36816,36824,36828,36832],{"__ignoreMap":142},[146,36669,36670],{"class":148,"line":149},[146,36671,36672],{"class":175},"# E2: 역방향 확장 — 위 첫 번째 예제의 설정 사용\n",[146,36674,36675,36677,36679],{"class":148,"line":167},[146,36676,6532],{"class":263},[146,36678,267],{"class":259},[146,36680,1432],{"class":263},[146,36682,36683,36685,36687,36689,36691],{"class":148,"line":179},[146,36684,6541],{"class":259},[146,36686,449],{"class":160},[146,36688,679],{"class":156},[146,36690,1444],{"class":160},[146,36692,452],{"class":263},[146,36694,36695,36697,36699,36701,36703,36705,36707,36709,36711,36713],{"class":148,"line":188},[146,36696,6554],{"class":701},[146,36698,267],{"class":259},[146,36700,685],{"class":263},[146,36702,31550],{"class":160},[146,36704,437],{"class":263},[146,36706,440],{"class":259},[146,36708,443],{"class":160},[146,36710,446],{"class":156},[146,36712,449],{"class":160},[146,36714,19596],{"class":263},[146,36716,36717,36719,36721],{"class":148,"line":373},[146,36718,6565],{"class":701},[146,36720,267],{"class":259},[146,36722,1864],{"class":263},[146,36724,36725,36727,36729,36731],{"class":148,"line":379},[146,36726,1303],{"class":160},[146,36728,437],{"class":263},[146,36730,1308],{"class":160},[146,36732,452],{"class":263},[146,36734,36735,36737,36739,36742],{"class":148,"line":385},[146,36736,12162],{"class":160},[146,36738,10846],{"class":263},[146,36740,36741],{"class":160},"\"https://example.com/main_video.mp4\"",[146,36743,10852],{"class":263},[146,36745,36746,36748],{"class":148,"line":409},[146,36747,1319],{"class":160},[146,36749,1322],{"class":263},[146,36751,36752,36755,36757],{"class":148,"line":420},[146,36753,36754],{"class":160},"            \"Create 6 seconds of backstory before @Video1 begins.",[146,36756,1670],{"class":156},[146,36758,950],{"class":160},[146,36760,36761,36764,36766],{"class":148,"line":431},[146,36762,36763],{"class":160},"            \"【Style】Match @Video1 visual style exactly.",[146,36765,1670],{"class":156},[146,36767,950],{"class":160},[146,36769,36770,36773,36775],{"class":148,"line":455},[146,36771,36772],{"class":160},"            \"【Duration】6 seconds extension",[146,36774,12126],{"class":156},[146,36776,950],{"class":160},[146,36778,36779],{"class":148,"line":466},[146,36780,36781],{"class":160},"            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n",[146,36783,36784],{"class":148,"line":600},[146,36785,36786],{"class":160},"            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n",[146,36788,36789],{"class":148,"line":605},[146,36790,36791],{"class":160},"            \"Match the visual style, lighting, and character appearances exactly. \"\n",[146,36793,36794],{"class":148,"line":611},[146,36795,36796],{"class":160},"            \"Create narrative tension that builds toward the existing video's opening moment. \"\n",[146,36798,36799],{"class":148,"line":617},[146,36800,36801],{"class":160},"            \"Seamless transition into original content.\"\n",[146,36803,36804],{"class":148,"line":623},[146,36805,1342],{"class":263},[146,36807,36808,36810,36812,36814],{"class":148,"line":628},[146,36809,1347],{"class":160},[146,36811,437],{"class":263},[146,36813,33360],{"class":156},[146,36815,452],{"class":263},[146,36817,36818,36820,36822],{"class":148,"line":639},[146,36819,1363],{"class":160},[146,36821,437],{"class":263},[146,36823,32789],{"class":160},[146,36825,36826],{"class":148,"line":654},[146,36827,1407],{"class":263},[146,36829,36830],{"class":148,"line":660},[146,36831,406],{"class":263},[146,36833,36834],{"class":148,"line":671},[146,36835,33686],{"class":175},[18,36837,36838],{},[11,36839,36840],{},[37,36841,36843],{"href":212,"rel":36842},[41],"EvoLink API 키로 이 고급 템플릿을 실행해 보세요. 무료 가입하기 ->",[45,36845],{},[48,36847,36849],{"id":36848},"흔한-seedance-프롬프트-실수와-해결-방법","흔한 Seedance 프롬프트 실수와 해결 방법",[2035,36851,36852,36868],{},[2038,36853,36854],{},[2041,36855,36856,36859,36862,36865],{},[2044,36857,36858],{},"#",[2044,36860,36861],{},"실수",[2044,36863,36864],{},"실패 원인",[2044,36866,36867],{},"해결 방법",[2051,36869,36870,36886,36905,36927,36943,36959,36975,36991,37007,37023],{},[2041,36871,36872,36874,36880,36883],{},[2056,36873,5440],{},[2056,36875,36876,36879],{},[23,36877,36878],{},"너무 모호함"," — \"개 영상 하나 만들어줘\"",[2056,36881,36882],{},"모델이 견종, 행동, 카메라, 스타일을 추측해야 함",[2056,36884,36885],{},"\"골든 리트리버가 공중에서 프리스비를 잡는 장면, 슬로모션 측면 앵글, 공원 배경, 화창한 날씨\"",[2041,36887,36888,36890,36899,36902],{},[2056,36889,5421],{},[2056,36891,36892,36895,36896,36898],{},[23,36893,36894],{},"잘못된 @tag 번호"," — 이미지 2장만 업로드했는데 ",[28,36897,2923],{}," 사용",[2056,36900,36901],{},"존재하지 않는 파일을 참조하여 생성 실패 또는 무시됨",[2056,36903,36904],{},"업로드 순서를 재확인하세요. 태그는 유형별로 1부터 시작하여 증가합니다",[2041,36906,36907,36909,36915,36918],{},[2056,36908,5059],{},[2056,36910,36911,36914],{},[23,36912,36913],{},"제약 조건 누락"," — 길이나 해상도 미지정",[2056,36916,36917],{},"모델 기본값이 원하는 결과와 맞지 않을 수 있음",[2056,36919,36920,36921,3624,36923,36926],{},"프롬프트 텍스트와 API 파라미터 모두에 항상 ",[28,36922,1774],{},[28,36924,36925],{},"resolution","을 지정하세요",[2041,36928,36929,36931,36937,36940],{},[2056,36930,4002],{},[2056,36932,36933,36936],{},[23,36934,36935],{},"모달리티 충돌"," — 이미지는 낮인데 프롬프트에 \"어두운 야간 장면\" 지시",[2056,36938,36939],{},"모델이 혼합 신호를 받아 일관성 없는 조명이 됨",[2056,36941,36942],{},"프롬프트 설명을 레퍼런스 콘텐츠와 일치시키세요",[2041,36944,36945,36947,36953,36956],{},[2056,36946,1352],{},[2056,36948,36949,36952],{},[23,36950,36951],{},"프롬프트 과부하"," — 200단어 이상으로 모든 미세 디테일을 서술",[2056,36954,36955],{},"모델이 우선순위를 제대로 잡지 못하고 핵심 지시가 희석됨",[2056,36957,36958],{},"프롬프트를 150단어 이내로 유지하세요. 시각적 디테일은 텍스트 대신 레퍼런스를 사용하세요",[2041,36960,36961,36963,36969,36972],{},[2056,36962,33360],{},[2056,36964,36965,36968],{},[23,36966,36967],{},"카메라 디렉션 없음"," — 장면만 묘사하고 카메라 움직임은 없음",[2056,36970,36971],{},"정적이거나 무작위로 움직이는 결과물",[2056,36973,36974],{},"명시적인 카메라 지시를 추가하세요: \"느린 돌리인\" 또는 \"고정 와이드 샷\"",[2041,36976,36977,36979,36985,36988],{},[2056,36978,33392],{},[2056,36980,36981,36984],{},[23,36982,36983],{},"사실적 얼굴 업로드"," — 실제 인물 얼굴 사진 업로드",[2056,36986,36987],{},"규정 필터에 의해 차단되어 요청이 거부됨",[2056,36989,36990],{},"일러스트, 양식화된, 비사실적 캐릭터 레퍼런스를 사용하세요",[2041,36992,36993,36995,37001,37004],{},[2056,36994,3702],{},[2056,36996,36997,37000],{},[23,36998,36999],{},"파일 제한 초과"," — 이미지 10장 업로드",[2056,37002,37003],{},"최대 9장이므로 요청이 거부됨",[2056,37005,37006],{},"제한을 준수하세요: 이미지 9장 이하, 비디오 3개 이하, 오디오 3개 이하, 총 12개 이하",[2041,37008,37009,37011,37017,37020],{},[2056,37010,35639],{},[2056,37012,37013,37016],{},[23,37014,37015],{},"스타일 앵커 없음"," — 구체적인 레퍼런스 대신 일반적인 \"시네마틱\" 사용",[2056,37018,37019],{},"결과물이 일반적이고 초점 없이 나옴",[2056,37021,37022],{},"특정 감독, 영화, 예술 스타일에 고정하세요: \"드니 빌뇌브 SF 서사시\" 또는 \"반 고흐 후기 인상파\"",[2041,37024,37025,37027,37033,37036],{},[2056,37026,537],{},[2056,37028,37029,37032],{},[23,37030,37031],{},"타임코드 없음"," — 구조화된 샷 스크립트 대신 산문 형태로 작성",[2056,37034,37035],{},"행동이 전체 길이에 걸쳐 예측 불가능하게 분배됨",[2056,37037,37038,37040],{},[28,37039,32371],{}," 타임코드를 사용하여 각 행동이 일어나는 시점을 정확히 제어하세요",[11,37042,37043,37044,1260],{},"자세한 에러 처리 패턴과 재시도 로직은 ",[37,37045,37046],{"href":14392},"API 문서",[45,37048],{},[48,37050,37052],{"id":37051},"api-개발자를-위한-프롬프트-엔지니어링-모범-사례","API 개발자를 위한 프롬프트 엔지니어링 모범 사례",[92,37054,37056],{"id":37055},"대량-생성을-위한-프롬프트-템플릿화","대량 생성을 위한 프롬프트 템플릿화",[11,37058,37059],{},"대규모로 비디오를 생성할 때 변수가 포함된 재사용 가능한 프롬프트 템플릿을 정의하세요:",[137,37061,37063],{"className":338,"code":37062,"language":340,"meta":142,"style":142},"PRODUCT_TEMPLATE = (\n    \"@Image1 as first frame.\\n\"\n    \"【Style】{style}\\n\"\n    \"【Duration】{duration} seconds\\n\\n\"\n    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n    \"{lighting_description}. Every texture detail remains razor-sharp.\\n\\n\"\n    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n    \"to reveal the product's profile.\\n\\n\"\n    \"[00:06-{end_tc}] Rotation slows to a stop at the most photogenic angle. \"\n    \"Clean, minimal, premium.\\n\\n\"\n    \"Maintain exact product proportions from @Image1. {background}. Commercial-grade lighting.\"\n)\n\n# Generate multiple product videos\nproducts = [\n    {\"style\": \"Clean white infinity cove, premium commercial\",\n     \"duration\": 8, \"end_tc\": \"00:08\",\n     \"lighting_description\": \"Soft studio lighting creates a gentle gradient\",\n     \"background\": \"White background throughout\"},\n    {\"style\": \"Warm wooden surface, artisan craft aesthetic\",\n     \"duration\": 10, \"end_tc\": \"00:10\",\n     \"lighting_description\": \"Warm golden spotlight from above\",\n     \"background\": \"Natural wood grain texture visible\"},\n]\n\nfor product in products:\n    prompt = PRODUCT_TEMPLATE.format(**product)\n    # Submit to API using the prompt...\n",[28,37064,37065,37074,37083,37093,37108,37113,37128,37133,37142,37153,37162,37173,37177,37181,37186,37194,37207,37228,37240,37252,37265,37284,37295,37306,37310,37314,37325,37343],{"__ignoreMap":142},[146,37066,37067,37070,37072],{"class":148,"line":149},[146,37068,37069],{"class":156},"PRODUCT_TEMPLATE",[146,37071,391],{"class":259},[146,37073,19702],{"class":263},[146,37075,37076,37079,37081],{"class":148,"line":167},[146,37077,37078],{"class":160},"    \"@Image1 as first frame.",[146,37080,1670],{"class":156},[146,37082,950],{"class":160},[146,37084,37085,37088,37091],{"class":148,"line":179},[146,37086,37087],{"class":160},"    \"【Style】",[146,37089,37090],{"class":156},"{style}\\n",[146,37092,950],{"class":160},[146,37094,37095,37098,37101,37104,37106],{"class":148,"line":188},[146,37096,37097],{"class":160},"    \"【Duration】",[146,37099,37100],{"class":156},"{duration}",[146,37102,37103],{"class":160}," seconds",[146,37105,12126],{"class":156},[146,37107,950],{"class":160},[146,37109,37110],{"class":148,"line":373},[146,37111,37112],{"class":160},"    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n",[146,37114,37115,37118,37121,37124,37126],{"class":148,"line":379},[146,37116,37117],{"class":160},"    \"",[146,37119,37120],{"class":156},"{lighting_description}",[146,37122,37123],{"class":160},". Every texture detail remains razor-sharp.",[146,37125,12126],{"class":156},[146,37127,950],{"class":160},[146,37129,37130],{"class":148,"line":385},[146,37131,37132],{"class":160},"    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n",[146,37134,37135,37138,37140],{"class":148,"line":409},[146,37136,37137],{"class":160},"    \"to reveal the product's profile.",[146,37139,12126],{"class":156},[146,37141,950],{"class":160},[146,37143,37144,37147,37150],{"class":148,"line":420},[146,37145,37146],{"class":160},"    \"[00:06-",[146,37148,37149],{"class":156},"{end_tc}",[146,37151,37152],{"class":160},"] Rotation slows to a stop at the most photogenic angle. \"\n",[146,37154,37155,37158,37160],{"class":148,"line":431},[146,37156,37157],{"class":160},"    \"Clean, minimal, premium.",[146,37159,12126],{"class":156},[146,37161,950],{"class":160},[146,37163,37164,37167,37170],{"class":148,"line":455},[146,37165,37166],{"class":160},"    \"Maintain exact product proportions from @Image1. ",[146,37168,37169],{"class":156},"{background}",[146,37171,37172],{"class":160},". Commercial-grade lighting.\"\n",[146,37174,37175],{"class":148,"line":466},[146,37176,406],{"class":263},[146,37178,37179],{"class":148,"line":600},[146,37180,376],{"emptyLinePlaceholder":58},[146,37182,37183],{"class":148,"line":605},[146,37184,37185],{"class":175},"# Generate multiple product videos\n",[146,37187,37188,37190,37192],{"class":148,"line":611},[146,37189,28891],{"class":263},[146,37191,267],{"class":259},[146,37193,8868],{"class":263},[146,37195,37196,37198,37200,37202,37205],{"class":148,"line":617},[146,37197,19568],{"class":263},[146,37199,21240],{"class":160},[146,37201,437],{"class":263},[146,37203,37204],{"class":160},"\"Clean white infinity cove, premium commercial\"",[146,37206,452],{"class":263},[146,37208,37209,37212,37214,37216,37218,37221,37223,37226],{"class":148,"line":623},[146,37210,37211],{"class":160},"     \"duration\"",[146,37213,437],{"class":263},[146,37215,3702],{"class":156},[146,37217,400],{"class":263},[146,37219,37220],{"class":160},"\"end_tc\"",[146,37222,437],{"class":263},[146,37224,37225],{"class":160},"\"00:08\"",[146,37227,452],{"class":263},[146,37229,37230,37233,37235,37238],{"class":148,"line":628},[146,37231,37232],{"class":160},"     \"lighting_description\"",[146,37234,437],{"class":263},[146,37236,37237],{"class":160},"\"Soft studio lighting creates a gentle gradient\"",[146,37239,452],{"class":263},[146,37241,37242,37245,37247,37250],{"class":148,"line":639},[146,37243,37244],{"class":160},"     \"background\"",[146,37246,437],{"class":263},[146,37248,37249],{"class":160},"\"White background throughout\"",[146,37251,19596],{"class":263},[146,37253,37254,37256,37258,37260,37263],{"class":148,"line":654},[146,37255,19568],{"class":263},[146,37257,21240],{"class":160},[146,37259,437],{"class":263},[146,37261,37262],{"class":160},"\"Warm wooden surface, artisan craft aesthetic\"",[146,37264,452],{"class":263},[146,37266,37267,37269,37271,37273,37275,37277,37279,37282],{"class":148,"line":660},[146,37268,37211],{"class":160},[146,37270,437],{"class":263},[146,37272,537],{"class":156},[146,37274,400],{"class":263},[146,37276,37220],{"class":160},[146,37278,437],{"class":263},[146,37280,37281],{"class":160},"\"00:10\"",[146,37283,452],{"class":263},[146,37285,37286,37288,37290,37293],{"class":148,"line":671},[146,37287,37232],{"class":160},[146,37289,437],{"class":263},[146,37291,37292],{"class":160},"\"Warm golden spotlight from above\"",[146,37294,452],{"class":263},[146,37296,37297,37299,37301,37304],{"class":148,"line":698},[146,37298,37244],{"class":160},[146,37300,437],{"class":263},[146,37302,37303],{"class":160},"\"Natural wood grain texture visible\"",[146,37305,19596],{"class":263},[146,37307,37308],{"class":148,"line":710},[146,37309,764],{"class":263},[146,37311,37312],{"class":148,"line":716},[146,37313,376],{"emptyLinePlaceholder":58},[146,37315,37316,37318,37321,37323],{"class":148,"line":722},[146,37317,8231],{"class":259},[146,37319,37320],{"class":263}," product ",[146,37322,1180],{"class":259},[146,37324,28981],{"class":263},[146,37326,37327,37330,37332,37335,37338,37340],{"class":148,"line":728},[146,37328,37329],{"class":263},"    prompt ",[146,37331,267],{"class":259},[146,37333,37334],{"class":156}," PRODUCT_TEMPLATE",[146,37336,37337],{"class":263},".format(",[146,37339,16806],{"class":259},[146,37341,37342],{"class":263},"product)\n",[146,37344,37345],{"class":148,"line":739},[146,37346,37347],{"class":175},"    # Submit to API using the prompt...\n",[11,37349,37350],{},"이 접근 방식은 프롬프트의 일관성을 유지하고 A/B 테스트를 간편하게 만들어줍니다.",[92,37352,37354],{"id":37353},"복잡한-장면에는-샷-스크립트-형식-사용","복잡한 장면에는 샷 스크립트 형식 사용",[11,37356,37357],{},"5초 이상이거나 여러 행동이 포함된 비디오에는 샷 스크립트 형식을 사용하세요:",[70,37359,37360,37373,37381,37387,37393],{},[73,37361,37362,37365,37366,3624,37369,37372],{},[23,37363,37364],{},"스타일과 길이를 선언하세요"," — 상단에 ",[28,37367,37368],{},"【Style】",[28,37370,37371],{},"【Duration】","을 사용합니다",[73,37374,37375,1061,37378,37380],{},[23,37376,37377],{},"3~5초 단위로 나누세요",[28,37379,32371],{}," 타임코드를 사용합니다",[73,37382,37383,37386],{},[23,37384,37385],{},"각 샷에 이름을 붙이세요"," — 기능과 함께: \"Shot 1: The Reveal\"",[73,37388,37389,37392],{},[23,37390,37391],{},"물리적 디테일을 추가하세요"," — 추상적 개념이 아닌 물리적으로 일어나는 일(물이 튀는, 먼지가 일어나는)을 서술합니다",[73,37394,37395,37398],{},[23,37396,37397],{},"제약 조건으로 마무리하세요"," — 일관성 규칙, 팔레트 참고사항, 물리 요구사항을 포함합니다",[92,37400,37402],{"id":37401},"여러-생성에-걸쳐-캐릭터-일관성-유지","여러 생성에 걸쳐 캐릭터 일관성 유지",[11,37404,37405],{},"여러 비디오에서 같은 캐릭터를 유지하려면:",[70,37407,37408,37415,37421],{},[73,37409,37410,1061,37413,36898],{},[23,37411,37412],{},"모든 요청에서 같은 레퍼런스 이미지를 사용하세요",[28,37414,3023],{},[73,37416,37417,37420],{},[23,37418,37419],{},"프롬프트에 명시적인 외형 서술을 포함하세요"," — 이미지 레퍼런스를 사용하더라도 \"같은 빨간 재킷, 짧은 검은 머리\"와 같이 작성합니다",[73,37422,37423,37426],{},[23,37424,37425],{},"순차적으로 생성하세요"," — 비디오 N의 마지막 프레임을 비디오 N+1의 첫 프레임 이미지로 사용합니다",[11,37428,37429,37430,14106],{},"배치 생성과 캐릭터 잠금을 포함한 고급 멀티샷 일관성 패턴은 ",[37,37431,37432],{"href":3384},"이미지-비디오 가이드",[92,37434,37436],{"id":37435},"비용-최적화","비용 최적화",[11,37438,37439],{},"비디오 레퍼런스는 텍스트 전용 또는 이미지 전용 프롬프트에 비해 생성 비용이 높습니다. 다음 의사결정 트리를 사용하세요:",[97,37441,37442,37448,37453],{},[73,37443,37444,37447],{},[23,37445,37446],{},"텍스트 전용"," — 가장 저렴함. 일반적인 장면이 필요하거나 참조 자료가 없을 때 사용합니다",[73,37449,37450,37452],{},[23,37451,13107],{}," — 중간 비용. 캐릭터/장면 일관성이 필요할 때 사용합니다",[73,37454,37455,37457],{},[23,37456,13104],{}," — 가장 높은 비용. 카메라 복제나 모션 전달이 구체적으로 필요할 때만 사용합니다",[18,37459,37460],{},[11,37461,37462,37463,37467],{},"정확한 가격은 해상도와 길이에 따라 달라집니다. 현재 요금은 ",[37,37464,22934],{"href":37465,"rel":37466},"https://evolink.ai/#pricing",[41],"에서 확인하세요 (2026년 2월 기준).",[92,37469,37471],{"id":37470},"프롬프트-버전-관리","프롬프트 버전 관리",[11,37473,37474],{},"프롬프트를 코드처럼 취급하세요. 메타데이터와 함께 버전 관리에 저장합니다:",[137,37476,37478],{"className":338,"code":37477,"language":340,"meta":142,"style":142},"PROMPT_REGISTRY = {\n    \"product_hero_v3\": {\n        \"version\": \"3.0\",\n        \"prompt\": \"【Style】Clean white infinity cove...\",\n        \"model\": \"seedance-2.0\",\n        \"duration\": 10,\n        \"test_results\": {\"ctr\": 0.24, \"conversion\": 0.087},\n        \"created\": \"2026-02-19\"\n    }\n}\n",[28,37479,37480,37489,37496,37508,37519,37529,37539,37566,37576,37580],{"__ignoreMap":142},[146,37481,37482,37485,37487],{"class":148,"line":149},[146,37483,37484],{"class":156},"PROMPT_REGISTRY",[146,37486,391],{"class":259},[146,37488,428],{"class":263},[146,37490,37491,37494],{"class":148,"line":167},[146,37492,37493],{"class":160},"    \"product_hero_v3\"",[146,37495,1942],{"class":263},[146,37497,37498,37501,37503,37506],{"class":148,"line":179},[146,37499,37500],{"class":160},"        \"version\"",[146,37502,437],{"class":263},[146,37504,37505],{"class":160},"\"3.0\"",[146,37507,452],{"class":263},[146,37509,37510,37512,37514,37517],{"class":148,"line":188},[146,37511,1319],{"class":160},[146,37513,437],{"class":263},[146,37515,37516],{"class":160},"\"【Style】Clean white infinity cove...\"",[146,37518,452],{"class":263},[146,37520,37521,37523,37525,37527],{"class":148,"line":373},[146,37522,1303],{"class":160},[146,37524,437],{"class":263},[146,37526,1308],{"class":160},[146,37528,452],{"class":263},[146,37530,37531,37533,37535,37537],{"class":148,"line":379},[146,37532,1347],{"class":160},[146,37534,437],{"class":263},[146,37536,537],{"class":156},[146,37538,452],{"class":263},[146,37540,37541,37544,37546,37549,37551,37554,37556,37559,37561,37564],{"class":148,"line":385},[146,37542,37543],{"class":160},"        \"test_results\"",[146,37545,20487],{"class":263},[146,37547,37548],{"class":160},"\"ctr\"",[146,37550,437],{"class":263},[146,37552,37553],{"class":156},"0.24",[146,37555,400],{"class":263},[146,37557,37558],{"class":160},"\"conversion\"",[146,37560,437],{"class":263},[146,37562,37563],{"class":156},"0.087",[146,37565,19596],{"class":263},[146,37567,37568,37571,37573],{"class":148,"line":409},[146,37569,37570],{"class":160},"        \"created\"",[146,37572,437],{"class":263},[146,37574,37575],{"class":160},"\"2026-02-19\"\n",[146,37577,37578],{"class":148,"line":420},[146,37579,1407],{"class":263},[146,37581,37582],{"class":148,"line":431},[146,37583,469],{"class":263},[11,37585,37586],{},"이를 통해 프롬프트 A/B 테스트와 필요시 이전 버전으로의 롤백이 가능합니다.",[92,37588,37590],{"id":37589},"생성-실패를-우아하게-처리","생성 실패를 우아하게 처리",[11,37592,37593],{},"모든 프롬프트가 성공하는 것은 아닙니다. 지수 백오프를 사용한 재시도 로직을 구축하세요:",[137,37595,37597],{"className":338,"code":37596,"language":340,"meta":142,"style":142},"import time\nimport random\n\ndef generate_with_retry(prompt_data, max_retries=3):\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(f\"{BASE_URL}/videos/generations\",\n                                   json=prompt_data, headers=headers)\n            if response.status_code == 200:\n                return response.json()\n        except Exception as e:\n            if attempt == max_retries - 1:\n                raise e\n            time.sleep(2 ** attempt + random.uniform(0, 1))\n    return None\n",[28,37598,37599,37605,37611,37615,37631,37643,37649,37667,37683,37695,37701,37711,37729,37736,37759],{"__ignoreMap":142},[146,37600,37601,37603],{"class":148,"line":149},[146,37602,347],{"class":259},[146,37604,356],{"class":263},[146,37606,37607,37609],{"class":148,"line":167},[146,37608,347],{"class":259},[146,37610,5040],{"class":263},[146,37612,37613],{"class":148,"line":179},[146,37614,376],{"emptyLinePlaceholder":58},[146,37616,37617,37619,37622,37625,37627,37629],{"class":148,"line":188},[146,37618,526],{"class":259},[146,37620,37621],{"class":152}," generate_with_retry",[146,37623,37624],{"class":263},"(prompt_data, max_retries",[146,37626,267],{"class":259},[146,37628,5059],{"class":156},[146,37630,548],{"class":263},[146,37632,37633,37635,37637,37639,37641],{"class":148,"line":373},[146,37634,5122],{"class":259},[146,37636,5125],{"class":263},[146,37638,1180],{"class":259},[146,37640,5130],{"class":156},[146,37642,5133],{"class":263},[146,37644,37645,37647],{"class":148,"line":379},[146,37646,5138],{"class":259},[146,37648,860],{"class":263},[146,37650,37651,37653,37655,37657,37659,37661,37663,37665],{"class":148,"line":385},[146,37652,5145],{"class":263},[146,37654,267],{"class":259},[146,37656,27055],{"class":263},[146,37658,440],{"class":259},[146,37660,449],{"class":160},[146,37662,679],{"class":156},[146,37664,1444],{"class":160},[146,37666,452],{"class":263},[146,37668,37669,37672,37674,37677,37679,37681],{"class":148,"line":409},[146,37670,37671],{"class":701},"                                   json",[146,37673,267],{"class":259},[146,37675,37676],{"class":263},"prompt_data, ",[146,37678,17836],{"class":701},[146,37680,267],{"class":259},[146,37682,17841],{"class":263},[146,37684,37685,37687,37689,37691,37693],{"class":148,"line":420},[146,37686,5213],{"class":259},[146,37688,2511],{"class":263},[146,37690,854],{"class":259},[146,37692,2516],{"class":156},[146,37694,860],{"class":263},[146,37696,37697,37699],{"class":148,"line":431},[146,37698,5226],{"class":259},[146,37700,736],{"class":263},[146,37702,37703,37705,37707,37709],{"class":148,"line":455},[146,37704,5537],{"class":259},[146,37706,7065],{"class":156},[146,37708,7068],{"class":259},[146,37710,5655],{"class":263},[146,37712,37713,37715,37717,37719,37722,37725,37727],{"class":148,"line":466},[146,37714,5213],{"class":259},[146,37716,5125],{"class":263},[146,37718,854],{"class":259},[146,37720,37721],{"class":263}," max_retries ",[146,37723,37724],{"class":259},"-",[146,37726,21268],{"class":156},[146,37728,860],{"class":263},[146,37730,37731,37733],{"class":148,"line":600},[146,37732,5338],{"class":259},[146,37734,37735],{"class":263}," e\n",[146,37737,37738,37741,37743,37745,37747,37749,37751,37753,37755,37757],{"class":148,"line":605},[146,37739,37740],{"class":263},"            time.sleep(",[146,37742,5421],{"class":156},[146,37744,5424],{"class":259},[146,37746,5125],{"class":263},[146,37748,5430],{"class":259},[146,37750,5433],{"class":263},[146,37752,783],{"class":156},[146,37754,400],{"class":263},[146,37756,5440],{"class":156},[146,37758,8802],{"class":263},[146,37760,37761,37763],{"class":148,"line":611},[146,37762,1703],{"class":259},[146,37764,11958],{"class":156},[11,37766,37767],{},"일반적인 실패 모드:",[97,37769,37770,37776,37782],{},[73,37771,37772,37775],{},[23,37773,37774],{},"콘텐츠 정책 위반"," — 대부분 사실적인 인물 얼굴로 인해 발생합니다",[73,37777,37778,37781],{},[23,37779,37780],{},"리소스 소진"," — 더 긴 딜레이 후 재시도합니다",[73,37783,37784,37787],{},[23,37785,37786],{},"잘못된 @tag 참조"," — 파일 업로드 순서를 확인합니다",[45,37789],{},[48,37791,37793],{"id":37792},"프로-사용자를-위한-고급-기법","프로 사용자를 위한 고급 기법",[92,37795,37797],{"id":37796},"다중-생성-체이닝","다중 생성 체이닝",[11,37799,37800],{},"한 비디오의 마지막 프레임을 다음 비디오의 첫 프레임으로 사용하여 더 긴 내러티브를 만드세요:",[137,37802,37804],{"className":338,"code":37803,"language":340,"meta":142,"style":142},"# Step 1: Generate opening scene\nscene1_result = generate_video({\n    \"prompt\": \"A detective enters a dark office...\",\n    \"duration\": 8\n})\n\n# Step 2: Extract last frame and use as first frame for scene 2\nlast_frame = extract_frame(scene1_result[\"video_url\"], timestamp=-1)\n\nscene2_result = generate_video({\n    \"files\": [(\"references\", last_frame)],\n    \"prompt\": \"@Image1 as first frame. The detective discovers a clue...\",\n    \"duration\": 10\n})\n",[28,37805,37806,37811,37821,37832,37840,37845,37849,37854,37878,37882,37891,37905,37916,37924],{"__ignoreMap":142},[146,37807,37808],{"class":148,"line":149},[146,37809,37810],{"class":175},"# Step 1: Generate opening scene\n",[146,37812,37813,37816,37818],{"class":148,"line":167},[146,37814,37815],{"class":263},"scene1_result ",[146,37817,267],{"class":259},[146,37819,37820],{"class":263}," generate_video({\n",[146,37822,37823,37825,37827,37830],{"class":148,"line":179},[146,37824,3685],{"class":160},[146,37826,437],{"class":263},[146,37828,37829],{"class":160},"\"A detective enters a dark office...\"",[146,37831,452],{"class":263},[146,37833,37834,37836,37838],{"class":148,"line":188},[146,37835,3697],{"class":160},[146,37837,437],{"class":263},[146,37839,26108],{"class":156},[146,37841,37842],{"class":148,"line":373},[146,37843,37844],{"class":263},"})\n",[146,37846,37847],{"class":148,"line":379},[146,37848,376],{"emptyLinePlaceholder":58},[146,37850,37851],{"class":148,"line":385},[146,37852,37853],{"class":175},"# Step 2: Extract last frame and use as first frame for scene 2\n",[146,37855,37856,37859,37861,37864,37866,37868,37871,37874,37876],{"class":148,"line":409},[146,37857,37858],{"class":263},"last_frame ",[146,37860,267],{"class":259},[146,37862,37863],{"class":263}," extract_frame(scene1_result[",[146,37865,14959],{"class":160},[146,37867,10760],{"class":263},[146,37869,37870],{"class":701},"timestamp",[146,37872,37873],{"class":259},"=-",[146,37875,5440],{"class":156},[146,37877,406],{"class":263},[146,37879,37880],{"class":148,"line":420},[146,37881,376],{"emptyLinePlaceholder":58},[146,37883,37884,37887,37889],{"class":148,"line":431},[146,37885,37886],{"class":263},"scene2_result ",[146,37888,267],{"class":259},[146,37890,37820],{"class":263},[146,37892,37893,37896,37899,37902],{"class":148,"line":455},[146,37894,37895],{"class":160},"    \"files\"",[146,37897,37898],{"class":263},": [(",[146,37900,37901],{"class":160},"\"references\"",[146,37903,37904],{"class":263},", last_frame)],\n",[146,37906,37907,37909,37911,37914],{"class":148,"line":466},[146,37908,3685],{"class":160},[146,37910,437],{"class":263},[146,37912,37913],{"class":160},"\"@Image1 as first frame. The detective discovers a clue...\"",[146,37915,452],{"class":263},[146,37917,37918,37920,37922],{"class":148,"line":600},[146,37919,3697],{"class":160},[146,37921,437],{"class":263},[146,37923,26156],{"class":156},[146,37925,37926],{"class":148,"line":605},[146,37927,37844],{"class":263},[92,37929,37931],{"id":37930},"동적-프롬프트-생성","동적 프롬프트 생성",[11,37933,37934],{},"AI를 사용하여 성공한 프롬프트의 변형을 생성하세요:",[137,37936,37938],{"className":338,"code":37937,"language":340,"meta":142,"style":142},"def generate_prompt_variations(base_prompt, num_variations=3):\n    variations = []\n    for i in range(num_variations):\n        # Use OpenAI/Claude to generate stylistic variations\n        variation = ai_rephrase(base_prompt, style=f\"variation_{i}\")\n        variations.append(variation)\n    return variations\n\n# Test multiple versions for A/B optimization\nbase = \"【Style】Cinematic product showcase...\"\nfor variation in generate_prompt_variations(base):\n    result = generate_video({\"prompt\": variation})\n    # Track performance metrics...\n",[28,37939,37940,37956,37965,37979,37984,38013,38018,38025,38029,38034,38044,38056,38070],{"__ignoreMap":142},[146,37941,37942,37944,37947,37950,37952,37954],{"class":148,"line":149},[146,37943,526],{"class":259},[146,37945,37946],{"class":152}," generate_prompt_variations",[146,37948,37949],{"class":263},"(base_prompt, num_variations",[146,37951,267],{"class":259},[146,37953,5059],{"class":156},[146,37955,548],{"class":263},[146,37957,37958,37961,37963],{"class":148,"line":167},[146,37959,37960],{"class":263},"    variations ",[146,37962,267],{"class":259},[146,37964,5879],{"class":263},[146,37966,37967,37969,37972,37974,37976],{"class":148,"line":179},[146,37968,5122],{"class":259},[146,37970,37971],{"class":263}," i ",[146,37973,1180],{"class":259},[146,37975,5130],{"class":156},[146,37977,37978],{"class":263},"(num_variations):\n",[146,37980,37981],{"class":148,"line":188},[146,37982,37983],{"class":175},"        # Use OpenAI/Claude to generate stylistic variations\n",[146,37985,37986,37989,37991,37994,37996,37998,38000,38003,38005,38007,38009,38011],{"class":148,"line":373},[146,37987,37988],{"class":263},"        variation ",[146,37990,267],{"class":259},[146,37992,37993],{"class":263}," ai_rephrase(base_prompt, ",[146,37995,11222],{"class":701},[146,37997,267],{"class":259},[146,37999,440],{"class":259},[146,38001,38002],{"class":160},"\"variation_",[146,38004,685],{"class":156},[146,38006,6332],{"class":263},[146,38008,691],{"class":156},[146,38010,449],{"class":160},[146,38012,406],{"class":263},[146,38014,38015],{"class":148,"line":379},[146,38016,38017],{"class":263},"        variations.append(variation)\n",[146,38019,38020,38022],{"class":148,"line":385},[146,38021,1703],{"class":259},[146,38023,38024],{"class":263}," variations\n",[146,38026,38027],{"class":148,"line":409},[146,38028,376],{"emptyLinePlaceholder":58},[146,38030,38031],{"class":148,"line":420},[146,38032,38033],{"class":175},"# Test multiple versions for A/B optimization\n",[146,38035,38036,38039,38041],{"class":148,"line":431},[146,38037,38038],{"class":263},"base ",[146,38040,267],{"class":259},[146,38042,38043],{"class":160}," \"【Style】Cinematic product showcase...\"\n",[146,38045,38046,38048,38051,38053],{"class":148,"line":455},[146,38047,8231],{"class":259},[146,38049,38050],{"class":263}," variation ",[146,38052,1180],{"class":259},[146,38054,38055],{"class":263}," generate_prompt_variations(base):\n",[146,38057,38058,38060,38062,38065,38067],{"class":148,"line":466},[146,38059,1618],{"class":263},[146,38061,267],{"class":259},[146,38063,38064],{"class":263}," generate_video({",[146,38066,5924],{"class":160},[146,38068,38069],{"class":263},": variation})\n",[146,38071,38072],{"class":148,"line":600},[146,38073,38074],{"class":175},"    # Track performance metrics...\n",[92,38076,38078],{"id":38077},"자동-품질-평가","자동 품질 평가",[11,38080,38081],{},"수동 검토 전에 생성된 비디오를 자동으로 점수화하세요:",[137,38083,38085],{"className":338,"code":38084,"language":340,"meta":142,"style":142},"def assess_video_quality(video_url):\n    scores = {}\n\n    # Motion smoothness (analyze frame-to-frame changes)\n    scores[\"motion\"] = calculate_motion_smoothness(video_url)\n\n    # Visual consistency (check for flickering/artifacts)\n    scores[\"consistency\"] = detect_visual_artifacts(video_url)\n\n    # Prompt adherence (use CLIP to compare with text description)\n    scores[\"adherence\"] = measure_prompt_alignment(video_url, prompt)\n\n    return scores\n\n# Only proceed with high-quality generations\nresult = generate_video(prompt_data)\nif assess_video_quality(result[\"video_url\"])[\"overall\"] > 0.8:\n    publish_video(result[\"video_url\"])\n",[28,38086,38087,38097,38106,38110,38115,38130,38134,38139,38153,38157,38162,38176,38180,38187,38191,38196,38205,38229],{"__ignoreMap":142},[146,38088,38089,38091,38094],{"class":148,"line":149},[146,38090,526],{"class":259},[146,38092,38093],{"class":152}," assess_video_quality",[146,38095,38096],{"class":263},"(video_url):\n",[146,38098,38099,38102,38104],{"class":148,"line":167},[146,38100,38101],{"class":263},"    scores ",[146,38103,267],{"class":259},[146,38105,16823],{"class":263},[146,38107,38108],{"class":148,"line":179},[146,38109,376],{"emptyLinePlaceholder":58},[146,38111,38112],{"class":148,"line":188},[146,38113,38114],{"class":175},"    # Motion smoothness (analyze frame-to-frame changes)\n",[146,38116,38117,38120,38123,38125,38127],{"class":148,"line":373},[146,38118,38119],{"class":263},"    scores[",[146,38121,38122],{"class":160},"\"motion\"",[146,38124,14937],{"class":263},[146,38126,267],{"class":259},[146,38128,38129],{"class":263}," calculate_motion_smoothness(video_url)\n",[146,38131,38132],{"class":148,"line":379},[146,38133,376],{"emptyLinePlaceholder":58},[146,38135,38136],{"class":148,"line":385},[146,38137,38138],{"class":175},"    # Visual consistency (check for flickering/artifacts)\n",[146,38140,38141,38143,38146,38148,38150],{"class":148,"line":409},[146,38142,38119],{"class":263},[146,38144,38145],{"class":160},"\"consistency\"",[146,38147,14937],{"class":263},[146,38149,267],{"class":259},[146,38151,38152],{"class":263}," detect_visual_artifacts(video_url)\n",[146,38154,38155],{"class":148,"line":420},[146,38156,376],{"emptyLinePlaceholder":58},[146,38158,38159],{"class":148,"line":431},[146,38160,38161],{"class":175},"    # Prompt adherence (use CLIP to compare with text description)\n",[146,38163,38164,38166,38169,38171,38173],{"class":148,"line":455},[146,38165,38119],{"class":263},[146,38167,38168],{"class":160},"\"adherence\"",[146,38170,14937],{"class":263},[146,38172,267],{"class":259},[146,38174,38175],{"class":263}," measure_prompt_alignment(video_url, prompt)\n",[146,38177,38178],{"class":148,"line":466},[146,38179,376],{"emptyLinePlaceholder":58},[146,38181,38182,38184],{"class":148,"line":600},[146,38183,1703],{"class":259},[146,38185,38186],{"class":263}," scores\n",[146,38188,38189],{"class":148,"line":605},[146,38190,376],{"emptyLinePlaceholder":58},[146,38192,38193],{"class":148,"line":611},[146,38194,38195],{"class":175},"# Only proceed with high-quality generations\n",[146,38197,38198,38200,38202],{"class":148,"line":617},[146,38199,12238],{"class":263},[146,38201,267],{"class":259},[146,38203,38204],{"class":263}," generate_video(prompt_data)\n",[146,38206,38207,38209,38212,38214,38217,38220,38222,38224,38227],{"class":148,"line":623},[146,38208,1719],{"class":259},[146,38210,38211],{"class":263}," assess_video_quality(result[",[146,38213,14959],{"class":160},[146,38215,38216],{"class":263},"])[",[146,38218,38219],{"class":160},"\"overall\"",[146,38221,14937],{"class":263},[146,38223,5995],{"class":259},[146,38225,38226],{"class":156}," 0.8",[146,38228,860],{"class":263},[146,38230,38231,38234,38236],{"class":148,"line":628},[146,38232,38233],{"class":263},"    publish_video(result[",[146,38235,14959],{"class":160},[146,38237,1629],{"class":263},[18,38239,38240],{},[11,38241,38242],{},[37,38243,38245],{"href":212,"rel":38244},[41],"EvoLink Pro 플랜으로 고급 Seedance 기능에 접근하세요",[45,38247],{},[48,38249,9067],{"id":9066},[92,38251,38253],{"id":38252},"seedance-10과-20의-차이점은-무엇인가요","Seedance 1.0과 2.0의 차이점은 무엇인가요?",[11,38255,38256],{},"Seedance 2.0은 멀티모달 입력(@tag 참조), 더 긴 생성 지원(4~15초), 크게 개선된 시간적 일관성을 도입했습니다. 프롬프트 구조는 비슷하지만, 2.0은 복잡한 장면을 훨씬 더 잘 처리합니다.",[92,38258,38260],{"id":38259},"tag-참조가-가끔-무시되는-이유는-무엇인가요","@tag 참조가 가끔 무시되는 이유는 무엇인가요?",[11,38262,38263],{},"일반적인 원인:",[70,38265,38266,38274,38283,38289],{},[73,38267,38268,38271,38272,36898],{},[23,38269,38270],{},"잘못된 번호"," — 이미지를 2장만 업로드했는데 ",[28,38273,2923],{},[73,38275,38276,38279,38280,38282],{},[23,38277,38278],{},"파일 유형 불일치"," — 이미지를 업로드했는데 ",[28,38281,16541],{},"로 참조",[73,38284,38285,38288],{},[23,38286,38287],{},"지시 충돌"," — 밝은 낮 이미지와 함께 \"어두운 야간 장면\" 요청",[73,38290,38291,38294],{},[23,38292,38293],{},"업로드 순서 혼동"," — 태그는 각 유형 내에서 업로드 순서로 할당됩니다",[92,38296,38298],{"id":38297},"여러-비디오에서-캐릭터-일관성을-어떻게-유지하나요","여러 비디오에서 캐릭터 일관성을 어떻게 유지하나요?",[70,38300,38301,38304,38307,38310],{},[73,38302,38303],{},"모든 생성에서 정확히 같은 레퍼런스 이미지를 사용합니다",[73,38305,38306],{},"텍스트에 명시적인 캐릭터 서술을 포함합니다 (\"같은 파란 재킷, 어깨길이 갈색 머리\")",[73,38308,38309],{},"비디오 N의 마지막 프레임을 비디오 N+1의 첫 프레임으로 사용합니다",[73,38311,38312],{},"프롬프트 간에 캐릭터 설명을 동일하게 유지합니다",[92,38314,38316],{"id":38315},"기존-비디오를-수정할-수-있나요","기존 비디오를 수정할 수 있나요?",[11,38318,38319],{},"네! video_urls를 통해 기존 비디오를 업로드하고 프롬프트에서 @Video1 레퍼런스를 사용하여 편집할 수 있습니다 — 캐릭터 교체, 장면 수정, 길이 연장 또는 스토리라인 변경이 가능합니다.",[11,38321,38322],{},"또한 다음과 같은 방법도 사용할 수 있습니다:",[97,38324,38325,38328,38331],{},[73,38326,38327],{},"@Video1로 원본을 참조하고 프롬프트에서 편집 내용을 설명합니다",[73,38329,38330],{},"image_urls로 참조 이미지를 업로드하여 캐릭터를 교체하거나 요소를 추가합니다",[73,38332,38333],{},"확장 프롬프트를 사용하여 원본 비디오 전후에 콘텐츠를 추가합니다",[11,38335,38336,38337,1260],{},"전체 편집 파라미터 사양은 ",[37,38338,38339],{"href":22989},"멀티모달 레퍼런스 문서",[92,38341,38343],{"id":38342},"최대-비디오-길이는-얼마인가요","최대 비디오 길이는 얼마인가요?",[11,38345,38346],{},"Seedance 2.0은 1회 생성당 4~15초를 지원합니다. 15초 제한을 넘는 더 긴 콘텐츠의 경우 다음을 고려하세요:",[97,38348,38349,38352,38355],{},[73,38350,38351],{},"여러 장면으로 나누어 체이닝하기",[73,38353,38354],{},"명확한 타임코드가 포함된 샷 스크립트 형식 사용하기",[73,38356,38357],{},"생성당 하나의 콘셉트에 집중하기",[92,38359,38361],{"id":38360},"콘텐츠-정책-위반을-어떻게-방지하나요","콘텐츠 정책 위반을 어떻게 방지하나요?",[97,38363,38364,38367,38370,38373],{},[73,38365,38366],{},"사실적인 인물 얼굴 사진을 업로드하지 마세요",[73,38368,38369],{},"저작권이 있는 캐릭터나 유명인을 피하세요",[73,38371,38372],{},"사진 대신 일러스트/양식화된 캐릭터 레퍼런스를 사용하세요",[73,38374,38375],{},"기존 미디어를 재현하기보다 오리지널 콘셉트에 집중하세요",[92,38377,38379],{"id":38378},"어떤-프롬프트는-왜-비용이-더-비싼가요","어떤 프롬프트는 왜 비용이 더 비싼가요?",[11,38381,38382],{},"생성 비용 요인:",[70,38384,38385,38391,38397,38403],{},[73,38386,38387,38390],{},[23,38388,38389],{},"길이"," — 더 긴 비디오일수록 비용이 높습니다",[73,38392,38393,38396],{},[23,38394,38395],{},"해상도"," — 1080p는 720p보다 비용이 높습니다",[73,38398,38399,38402],{},[23,38400,38401],{},"레퍼런스 수"," — 비디오 참조가 이미지 참조보다 비용이 높습니다",[73,38404,38405,38408],{},[23,38406,38407],{},"복잡도"," — 다중 캐릭터 장면은 더 많은 컴퓨팅을 사용할 수 있습니다",[92,38410,38412],{"id":38411},"샷-스크립트-형식에서-최상의-결과를-얻으려면-어떻게-해야-하나요","샷 스크립트 형식에서 최상의 결과를 얻으려면 어떻게 해야 하나요?",[70,38414,38415,38418,38421,38424,38427],{},[73,38416,38417],{},"각 샷 구간을 최대 3~5초로 유지하세요",[73,38419,38420],{},"구체적인 스타일 앵커를 사용하세요 (\"시네마틱\" 대신 \"크리스토퍼 놀란 스릴러\")",[73,38422,38423],{},"추상적 개념이 아닌 물리적 행동을 서술하세요",[73,38425,38426],{},"각 샷에 카메라 움직임 지시를 포함하세요",[73,38428,38429],{},"일관성 제약 조건과 물리 요구사항으로 마무리하세요",[92,38431,38433],{"id":38432},"seedance를-상업-프로젝트에-사용할-수-있나요","Seedance를 상업 프로젝트에 사용할 수 있나요?",[11,38435,38436,38437,4142],{},"네, 적절한 라이선스 하에 가능합니다. 정책은 구독 등급에 따라 다를 수 있으므로 현재 약관을 ",[37,38438,214],{"href":212,"rel":38439},[41],[92,38441,38443],{"id":38442},"생성-실패는-어떻게-문제를-해결하나요","생성 실패는 어떻게 문제를 해결하나요?",[70,38445,38446,38452,38457,38463,38469],{},[73,38447,38448,38451],{},[23,38449,38450],{},"파일 제한을 확인하세요"," — 이미지 9장 이하, 비디오 3개 이하, 오디오 3개 이하",[73,38453,38454],{},[23,38455,38456],{},"@tag 번호가 업로드된 파일과 일치하는지 확인하세요",[73,38458,38459,38460],{},"200단어 이상이면 ",[23,38461,38462],{},"프롬프트를 간소화하세요",[73,38464,38465,38466],{},"텍스트와 레퍼런스 간의 ",[23,38467,38468],{},"충돌하는 지시를 제거하세요",[73,38470,38471,38472,38475],{},"먼저 ",[23,38473,38474],{},"텍스트 전용으로 시도한 후"," 레퍼런스를 점진적으로 추가하세요",[92,38477,38479],{"id":38478},"전문가-수준-프롬프트란-무엇인가요","\"전문가 수준\" 프롬프트란 무엇인가요?",[11,38481,38482],{},"전문가 수준의 프롬프트는 일반적으로 다음을 포함합니다:",[97,38484,38485,38488,38491,38494,38497],{},[73,38486,38487],{},"타임코드가 포함된 샷 스크립트 형식",[73,38489,38490],{},"구체적인 스타일 앵커 (감독명, 예술 사조)",[73,38492,38493],{},"추상적 개념 대신 물리적 행동 서술",[73,38495,38496],{},"일관성 제약 조건과 물리 요구사항",[73,38498,38499],{},"적절한 레퍼런스 파일 선택과 @tag 사용",[45,38501],{},[48,38503,38504],{"id":38504},"결론",[11,38506,38507],{},"Seedance 2.0 프롬프트를 마스터하는 것은 텍스트 설명과 멀티모달 레퍼런스 간의 균형을 이해하는 것입니다. 샷 스크립트 형식은 시네마틱한 제어를 제공하고, @tag 레퍼런스는 시각적 일관성을 보장합니다.",[11,38509,38510],{},"이 가이드의 텍스트 전용 템플릿부터 시작한 후, 구문에 익숙해지면 점차 이미지와 비디오 레퍼런스를 추가하세요. 지나치게 복잡한 설명보다 명확하고 구체적인 지시에 집중하세요.",[11,38512,38513],{},"여기에 포함된 템플릿은 제품 광고부터 캐릭터 애니메이션, 스타일 변환까지 가장 일반적인 사용 사례를 다룹니다. 스타일 앵커, 타임코드, 레퍼런스 파일을 변경하여 여러분의 구체적인 요구에 맞게 적용하세요.",[11,38515,38516,38517,38520,38521,38524],{},"가장 중요한 것은 ",[23,38518,38519],{},"실험하는 것","입니다. 각 프롬프트는 Seedance 2.0이 지시를 어떻게 해석하는지에 대해 무언가를 가르쳐줍니다. ",[37,38522,32461],{"href":32459,"rel":38523},[41]," 커뮤니티에서 성공적인 프롬프트 패턴과 혁신적인 기법을 공유하고 있습니다.",[11,38526,38527,2424,38530,38534],{},[23,38528,38529],{},"지금 바로 창작을 시작할 준비가 되셨나요?",[37,38531,38533],{"href":212,"rel":38532},[41],"무료 EvoLink API 키를 받으세요",". 이 가이드의 모든 템플릿을 직접 실행해 보세요. 비디오 창작의 미래는 멀티모달이며 — 바로 오늘부터 사용할 수 있습니다.",[11,38536,38537,38540,38541,38544,38545,38547,38548,38550],{},[23,38538,38539],{},"다음 단계:"," @tag 참조 시스템 마스터하기 → ",[37,38542,38543],{"href":2969},"멀티모달 가이드"," | ",[37,38546,34199],{"href":3384}," | 완전한 Python 예제로 ",[37,38549,34991],{"href":3860}," 배우기",[45,38552],{},[11,38554,38555],{},[2621,38556,38557],{},"최종 업데이트: 2026년 2월 19일 | Written by J, Growth Lead at EvoLink",[11222,38559,38560],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":142,"searchDepth":167,"depth":167,"links":38562},[38563,38569,38576,38582,38583,38591,38596,38609],{"id":32238,"depth":167,"text":32212,"children":38564},[38565,38566,38567,38568],{"id":32328,"depth":179,"text":32329},{"id":32349,"depth":179,"text":32350},{"id":32472,"depth":179,"text":32473},{"id":32503,"depth":179,"text":32504},{"id":33019,"depth":167,"text":33020,"children":38570},[38571,38572,38573,38574,38575],{"id":33028,"depth":179,"text":33029},{"id":33092,"depth":179,"text":33093},{"id":33182,"depth":179,"text":33183},{"id":33260,"depth":179,"text":33261},{"id":33322,"depth":179,"text":33323},{"id":33434,"depth":167,"text":33435,"children":38577},[38578,38579,38580,38581],{"id":33438,"depth":179,"text":33439},{"id":34183,"depth":179,"text":34184},{"id":35343,"depth":179,"text":35344},{"id":36470,"depth":179,"text":36471},{"id":36848,"depth":167,"text":36849},{"id":37051,"depth":167,"text":37052,"children":38584},[38585,38586,38587,38588,38589,38590],{"id":37055,"depth":179,"text":37056},{"id":37353,"depth":179,"text":37354},{"id":37401,"depth":179,"text":37402},{"id":37435,"depth":179,"text":37436},{"id":37470,"depth":179,"text":37471},{"id":37589,"depth":179,"text":37590},{"id":37792,"depth":167,"text":37793,"children":38592},[38593,38594,38595],{"id":37796,"depth":179,"text":37797},{"id":37930,"depth":179,"text":37931},{"id":38077,"depth":179,"text":38078},{"id":9066,"depth":167,"text":9067,"children":38597},[38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608],{"id":38252,"depth":179,"text":38253},{"id":38259,"depth":179,"text":38260},{"id":38297,"depth":179,"text":38298},{"id":38315,"depth":179,"text":38316},{"id":38342,"depth":179,"text":38343},{"id":38360,"depth":179,"text":38361},{"id":38378,"depth":179,"text":38379},{"id":38411,"depth":179,"text":38412},{"id":38432,"depth":179,"text":38433},{"id":38442,"depth":179,"text":38443},{"id":38478,"depth":179,"text":38479},{"id":38504,"depth":167,"text":38504},"@tag 구문, 멀티모달 레퍼런스, 15개 이상의 즉시 사용 가능한 템플릿으로 Seedance 2.0 프롬프트를 마스터하세요. Python API 코드 예제를 포함합니다.",{"date":38612,"image":38613,"pinned":58},"2026-02-19","/111.png","/ko/blog/seedance-2-prompt-guide",{"title":13419,"description":38610},"ko/blog/seedance-2-prompt-guide","JjLdMXX6nYtdWGWf0zPrcLR8KmISrPUNq6DaKpb6Vm4",{"id":38619,"title":38620,"body":38621,"description":41509,"extension":11284,"meta":41510,"navigation":58,"path":41531,"seo":41532,"stem":41533,"__hash__":41534},"content/ko/blog/seedance-2-vs-sora-2-api-comparison.md","Seedance 2.0 vs Sora 2: 동일 프롬프트로 진행한 실제 API 테스트 (2026)",{"type":8,"value":38622,"toc":41466},[38623,38626,38629,38645,38658,38662,38665,38685,38691,38697,38700,38706,38773,38776,38779,38783,38788,38793,38796,38801,38862,38868,38871,38877,38880,38885,38936,38941,38944,38949,38953,38959,38965,38968,38973,39036,39039,39043,39047,39052,39055,39060,39114,39119,39125,39128,39131,39134,39139,39193,39199,39202,39208,39212,39218,39221,39228,39233,39292,39295,39298,39302,39306,39311,39314,39319,39373,39378,39381,39384,39387,39392,39442,39448,39451,39455,39461,39464,39469,39529,39532,39535,39541,39545,39548,39717,39722,39740,39744,39747,39751,39754,40332,40338,40471,40477,40481,40682,40685,40691,40697,40703,40709,40720,40724,40727,40731,40792,40803,40814,40818,40824,40827,40897,40904,40910,40914,40960,40964,40967,40971,41011,41015,41041,41045,41048,41051,41279,41282,41286,41289,41291,41295,41298,41302,41313,41317,41320,41324,41330,41334,41341,41345,41352,41354,41358,41435,41438,41451,41463],[23115,38624,38620],{"id":38625},"seedance-20-vs-sora-2-동일-프롬프트로-진행한-실제-api-테스트-2026",[11,38627,38628],{},"대부분의 \"Seedance vs Sora\" 글은 스펙 시트만 비교합니다. 우리는 두 모델에 동일한 세 가지 프롬프트를 입력하고, 출력을 녹화한 뒤 프레임별로 점수를 매겼습니다. 비디오 증거, 복사 가능한 API 코드, 그리고 어떤 모델을 선택할지 바꿀 수 있는 가격 분석을 함께 확인하세요.",[11,38630,32201,38631,38636,38637,38640,38641,38644],{},[37,38632,38635],{"href":38633,"rel":38634},"https://seed.bytedance.com/en",[41],"Seed 팀","이 개발한 Seedance 2.0은 테스트에서 ",[23,38638,38639],{},"전체 8.5/10점","을 기록했고, Sora 2는 ",[23,38642,38643],{},"8.0/10점","을 받았습니다. 격차는 예상과 다른 곳에서 발생했습니다.",[38646,38647,38649],"callout",{"type":38648},"info",[11,38650,38651,2424,38654,38657],{},[23,38652,38653],{},"직접 테스트해보고 싶으신가요?",[37,38655,38656],{"href":16482},"무료 EvoLink API 키를 받고"," 아래의 정확한 프롬프트를 사용해보세요.",[48,38659,38661],{"id":38660},"the-test-setup","The Test Setup",[11,38663,38664],{},"We designed three prompts to stress-test different capabilities:",[70,38666,38667,38673,38679],{},[73,38668,38669,38672],{},[23,38670,38671],{},"Slow-motion physics"," — a porcelain vase shattering (particle dynamics, material rendering)",[73,38674,38675,38678],{},[23,38676,38677],{},"Dynamic human motion"," — rooftop breakdancing at night (anatomy, motion blur, neon lighting)",[73,38680,38681,38684],{},[23,38682,38683],{},"Facial expression & lighting"," — an elderly woman discovering a magical book (micro-expressions, volumetric light)",[11,38686,38687,38690],{},[23,38688,38689],{},"Methodology:"," Each prompt was submitted verbatim to both APIs. No cherry-picking — we used the first generation from each model. Videos are 15 seconds, unedited. Scoring uses six dimensions: image quality, prompt adherence, physics/anatomy realism, lighting, motion fluidity, and detail richness.",[11,38692,38693,38696],{},[23,38694,38695],{},"Why this matters:"," If you're building a product on top of an AI video API, you need to know which model handles your use case. Spec sheets won't tell you that Sora 2's human anatomy breaks down on pause, or that Seedance's 60fps makes slow-motion scenes noticeably smoother.",[11,38698,38699],{},"Every existing \"Seedance vs Sora\" article we found relies on feature-list comparisons or single cherry-picked examples. None uses controlled, identical prompts with systematic scoring. That's the gap this test fills.",[11,38701,38702,38705],{},[23,38703,38704],{},"What we didn't test:"," We didn't evaluate text-overlay quality, multi-scene narratives, or audio-sync accuracy in this round. Those deserve their own dedicated tests. We also limited ourselves to text-to-video mode — image-to-video and video-to-video comparisons are planned for a follow-up.",[2035,38707,38708,38720],{},[2038,38709,38710],{},[2041,38711,38712,38715,38717],{},[2044,38713,38714],{},"Parameter",[2044,38716,17406],{"align":13819},[2044,38718,38719],{"align":13819},"Sora 2",[2051,38721,38722,38733,38744,38752,38762],{},[2041,38723,38724,38727,38730],{},[2056,38725,38726],{},"Resolution",[2056,38728,38729],{"align":13819},"1280×720 (720p)",[2056,38731,38732],{"align":13819},"1792×1024 (~1080p)",[2041,38734,38735,38738,38741],{},[2056,38736,38737],{},"Frame Rate",[2056,38739,38740],{"align":13819},"60fps",[2056,38742,38743],{"align":13819},"30fps",[2041,38745,38746,38748,38750],{},[2056,38747,18341],{},[2056,38749,4079],{"align":13819},[2056,38751,4079],{"align":13819},[2041,38753,38754,38757,38760],{},[2056,38755,38756],{},"Codec",[2056,38758,38759],{"align":13819},"H.264",[2056,38761,38759],{"align":13819},[2041,38763,38764,38767,38770],{},[2056,38765,38766],{},"Audio",[2056,38768,38769],{"align":13819},"AAC 44.1kHz stereo",[2056,38771,38772],{"align":13819},"AAC 96kHz stereo",[11,38774,38775],{},"Seedance trades resolution for double the frame rate. Sora delivers ~2.5× more pixels per frame. Both choices have real consequences for different content types — as you'll see below.",[11,38777,38778],{},"A quick note on audio: both models generate synchronized audio (dialogue, SFX, music), but their sample rates differ. Sora's 96kHz output exceeds CD quality, while Seedance's 44.1kHz matches standard CD audio. In practice, most delivery platforms (YouTube, TikTok, Instagram) downsample to 48kHz or lower, so this difference rarely matters for final distribution.",[48,38780,38782],{"id":38781},"test-1-slow-motion-physics-porcelain-vase","Test 1 — Slow-Motion Physics (Porcelain Vase)",[11,38784,38785],{},[23,38786,38787],{},"Prompt:",[18,38789,38790],{},[11,38791,38792],{},"A porcelain vase falls from a marble table in slow motion. Camera starts with a close-up of the vase wobbling on the edge, then follows it downward with a smooth tracking shot as it shatters on a stone floor. Fragments scatter in all directions. Dust particles float in warm afternoon sunlight streaming through a window. Shallow depth of field, 24fps cinematic look",[92,38794,17406],{"id":38795},"seedance-20",[56,38797,60,38798],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38799],{"src":38800,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2035,38802,38803,38816],{},[2038,38804,38805],{},[2041,38806,38807,38810,38813],{},[2044,38808,38809],{},"Dimension",[2044,38811,38812],{"align":13819},"Score",[2044,38814,38815],{},"Notes",[2051,38817,38818,38829,38840,38851],{},[2041,38819,38820,38823,38826],{},[2056,38821,38822],{},"Image Quality",[2056,38824,38825],{"align":13819},"8.5/10",[2056,38827,38828],{},"Near-cinematic. Blue-white porcelain texture crisp, marble grain realistic",[2041,38830,38831,38834,38837],{},[2056,38832,38833],{},"Prompt Adherence",[2056,38835,38836],{"align":13819},"7.5/10",[2056,38838,38839],{},"Vase, marble table, warm light, shallow DoF — all present. Dust particles missing",[2041,38841,38842,38845,38848],{},[2056,38843,38844],{},"Physics Realism",[2056,38846,38847],{"align":13819},"7.0/10",[2056,38849,38850],{},"Fall trajectory reasonable but fragments cluster too tightly. Missing motion blur gives a \"floating\" feel",[2041,38852,38853,38856,38859],{},[2056,38854,38855],{},"Lighting",[2056,38857,38858],{"align":13819},"9.0/10",[2056,38860,38861],{},"Afternoon warmth from window is consistent. Specular highlights on glaze are accurate",[11,38863,38864,38867],{},[23,38865,38866],{},"Standout:"," The bokeh and warm-light rendering feel genuinely filmic. At 60fps, the slow-motion fall is buttery smooth — you can track individual fragments frame by frame without any judder. The blue-white porcelain glaze catches afternoon light exactly the way real celadon does, with soft specular highlights that shift naturally as the vase rotates during its fall.",[11,38869,38870],{},"The shallow depth-of-field execution deserves special mention. Background elements blur with a natural gradient, not the hard-edged mask you see in cheaper implementations. The marble table's golden edge trim stays crisp in the foreground while the room behind falls off convincingly.",[11,38872,38873,38876],{},[23,38874,38875],{},"Weakness:"," Fragments don't scatter far enough for a hard stone floor impact. Real porcelain hitting stone at that velocity would send shards several feet in all directions — here they cluster within a tight radius. There's no visible dust or ceramic powder, which the prompt specifically requested. The falling vase also lacks motion blur, creating a slight \"floating\" quality in mid-air frames.",[92,38878,38719],{"id":38879},"sora-2",[56,38881,60,38882],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38883],{"src":38884,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2035,38886,38887,38897],{},[2038,38888,38889],{},[2041,38890,38891,38893,38895],{},[2044,38892,38809],{},[2044,38894,38812],{"align":13819},[2044,38896,38815],{},[2051,38898,38899,38908,38917,38927],{},[2041,38900,38901,38903,38905],{},[2056,38902,38822],{},[2056,38904,38858],{"align":13819},[2056,38906,38907],{},"Higher resolution reveals more detail. Cross-section of broken ceramic (grey body under glaze) is impressive",[2041,38909,38910,38912,38914],{},[2056,38911,38833],{},[2056,38913,38836],{"align":13819},[2056,38915,38916],{},"Main elements present. Also missing dust particles",[2041,38918,38919,38921,38924],{},[2056,38920,38844],{},[2056,38922,38923],{"align":13819},"8.0/10",[2056,38925,38926],{},"Fracture mechanics more convincing — uneven thickness, irregular break edges match brittle fracture behavior",[2041,38928,38929,38931,38933],{},[2056,38930,38855],{},[2056,38932,38858],{"align":13819},[2056,38934,38935],{},"Warm light from right. Correct differentiation between glossy ceramic and matte stone surfaces",[11,38937,38938,38940],{},[23,38939,38866],{}," The fracture detail is superior. You can see the grey ceramic body (the bisque) beneath the glaze at break points — a subtle but physically accurate detail that most 3D renders don't even attempt. The neck staying intact while the body shatters matches real ceramic stress distribution: the neck is the thickest, most structurally reinforced part of a vase.",[11,38942,38943],{},"Fragment edges show irregular, conchoidal fracture patterns consistent with brittle material failure. Some pieces have thin edges where the glaze chipped away from the body, others show thicker cross-sections. This level of fracture variance is what separates \"convincing\" from \"obviously CG.\"",[11,38945,38946,38948],{},[23,38947,38875],{}," Despite the superior fracture physics, some fragments still exhibit a slight \"hovering\" quality — they decelerate too quickly after impact rather than bouncing and sliding on the stone. Dust particles are absent, same as Seedance. The fragment count is also lower than expected for a vase of this size hitting a hard surface.",[92,38950,38952],{"id":38951},"test-1-verdict","Test 1 Verdict",[11,38954,38955,38958],{},[23,38956,38957],{},"Sora 2 wins on fracture detail and raw resolution."," The higher pixel count and more convincing break physics make this a clear edge for static-heavy or close-up content.",[11,38960,38961,38964],{},[23,38962,38963],{},"Seedance 2.0 wins on motion smoothness."," The 60fps frame rate makes the slow-motion fall visually smoother. If your use case is actual slow-motion video (ads, product demos), that frame rate matters.",[11,38966,38967],{},"Both models failed to generate floating dust particles in sunlight — a shared limitation of current AI video generation. Volumetric particle effects (dust, smoke, mist) remain a weak point across all diffusion-based video models, likely because training data rarely isolates these subtle atmospheric elements.",[11,38969,38970],{},[23,38971,38972],{},"Score summary for Test 1:",[2035,38974,38975,38996],{},[2038,38976,38977],{},[2041,38978,38979,38982,38984,38986,38989,38991],{},[2044,38980,38981],{},"Model",[2044,38983,38822],{"align":13819},[2044,38985,38833],{"align":13819},[2044,38987,38988],{"align":13819},"Physics",[2044,38990,38855],{"align":13819},[2044,38992,38993],{"align":13819},[23,38994,38995],{},"Average",[2051,38997,38998,39019],{},[2041,38999,39000,39002,39005,39008,39011,39014],{},[2056,39001,17406],{},[2056,39003,39004],{"align":13819},"8.5",[2056,39006,39007],{"align":13819},"7.5",[2056,39009,39010],{"align":13819},"7.0",[2056,39012,39013],{"align":13819},"9.0",[2056,39015,39016],{"align":13819},[23,39017,39018],{},"8.0",[2041,39020,39021,39023,39025,39027,39029,39031],{},[2056,39022,38719],{},[2056,39024,39013],{"align":13819},[2056,39026,39007],{"align":13819},[2056,39028,39018],{"align":13819},[2056,39030,39013],{"align":13819},[2056,39032,39033],{"align":13819},[23,39034,39035],{},"8.4",[11,39037,39038],{},"Sora 2 takes this round by a narrow margin, driven by superior fracture physics and resolution. But if your use case prioritizes smooth slow-motion playback over freeze-frame detail, the 60fps advantage tips back toward Seedance.",[48,39040,39042],{"id":39041},"test-2-dynamic-human-motion-rooftop-breakdance","Test 2 — Dynamic Human Motion (Rooftop Breakdance)",[11,39044,39045],{},[23,39046,38787],{},[18,39048,39049],{},[11,39050,39051],{},"A street dancer performs an explosive breakdance routine on a rain-soaked city rooftop at night. Neon lights from surrounding buildings reflect off the wet surface. Camera circles the dancer in a dynamic 360-degree orbit. The dancer transitions from a power move into a freeze pose. Dramatic rim lighting, cinematic color grading with teal and orange tones",[92,39053,17406],{"id":39054},"seedance-20-1",[56,39056,60,39057],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39058],{"src":39059,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2035,39061,39062,39072],{},[2038,39063,39064],{},[2041,39065,39066,39068,39070],{},[2044,39067,38809],{},[2044,39069,38812],{"align":13819},[2044,39071,38815],{},[2051,39073,39074,39083,39093,39103],{},[2041,39075,39076,39078,39080],{},[2056,39077,38822],{},[2056,39079,38858],{"align":13819},[2056,39081,39082],{},"Stunning night rendering. Neon reflections on wet surfaces are almost photographic",[2041,39084,39085,39088,39090],{},[2056,39086,39087],{},"Anatomy Accuracy",[2056,39089,38825],{"align":13819},[2056,39091,39092],{},"B-boy floor work poses are recognizable. Wrist-forearm-shoulder force lines align correctly",[2041,39094,39095,39098,39100],{},[2056,39096,39097],{},"Motion Dynamics",[2056,39099,38858],{"align":13819},[2056,39101,39102],{},"Motion blur direction matches movement. Low center of gravity fits breakdance mechanics. 60fps keeps fast transitions smooth",[2041,39104,39105,39108,39111],{},[2056,39106,39107],{},"Lighting & Atmosphere",[2056,39109,39110],{"align":13819},"9.5/10",[2056,39112,39113],{},"Near-perfect neon reflections on wet ground. Rim lighting + backlit silhouette creates cinematic drama",[11,39115,39116,39118],{},[23,39117,38866],{}," This is where Seedance 2.0 truly shines. The teal-and-orange color grading is executed precisely. Neon reflections on the rain-soaked rooftop are stunning — red and cyan complementary colors map naturally onto the wet surface. The atmosphere is immersive enough for a professional music video.",[11,39120,39121,39124],{},[23,39122,39123],{},"The 60fps advantage is decisive here."," Fast arm sweeps, power moves, and transitions look fluid rather than stuttery. Clothing has weight and drapes correctly during motion — the hoodie fabric stretches and bunches at the shoulders in ways that suggest real textile physics.",[11,39126,39127],{},"The color grading deserves a closer look. Teal and orange are complementary colors, and the prompt specifically requested this combination. Seedance didn't just tint the image — it placed warm orange neon sources behind the dancer (creating rim light) and cool cyan sources in front, then let the wet rooftop surface mix both colors in reflections. This is how a cinematographer would actually light this scene.",[11,39129,39130],{},"Water behavior on the rooftop is also convincing. The surface has a thin, even layer of water that reflects the cityscape above. When the dancer moves, you can see subtle disturbance patterns radiating outward from points of contact. It's not perfect fluid simulation, but it reads as \"wet ground\" instantly.",[92,39132,38719],{"id":39133},"sora-2-1",[56,39135,60,39136],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39137],{"src":39138,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2035,39140,39141,39151],{},[2038,39142,39143],{},[2041,39144,39145,39147,39149],{},[2044,39146,38809],{},[2044,39148,38812],{"align":13819},[2044,39150,38815],{},[2051,39152,39153,39162,39175,39184],{},[2041,39154,39155,39157,39159],{},[2056,39156,38822],{},[2056,39158,38923],{"align":13819},[2056,39160,39161],{},"Strong cyberpunk aesthetic, detailed city background. But has an \"AI sheen\" — everything looks too perfectly graded",[2041,39163,39164,39166,39169],{},[2056,39165,39087],{},[2056,39167,39168],{"align":13819},"6.5/10",[2056,39170,16133,39171,39174],{},[23,39172,39173],{},"Major weakness."," Hand-ground contact is blurry, fingers indistinguishable. Torso narrows unnaturally during handstand. Feet/shoe edges have a \"melting\" quality",[2041,39176,39177,39179,39181],{},[2056,39178,39097],{},[2056,39180,38923],{"align":13819},[2056,39182,39183],{},"Water splash effects are good, rotational momentum is credible. But some water droplets look more like noise than real droplets",[2041,39185,39186,39188,39190],{},[2056,39187,39107],{},[2056,39189,38825],{"align":13819},[2056,39191,39192],{},"Dual-source contrast (warm orange backlight + cool cyan front) handled well. But immersion falls short of Seedance",[11,39194,39195,39198],{},[23,39196,39197],{},"The anatomy problem is serious."," During freeze poses and handstands, the dancer's hands dissolve into the ground contact surface — individual fingers are indistinguishable. The torso becomes tube-like rather than showing realistic ribcage-to-pelvis structure, losing the natural width variation between chest, waist, and hips. A second arm disappears entirely in some frames, creating an anatomical gap that breaks the illusion.",[11,39200,39201],{},"Foot and shoe edges exhibit a \"melting\" quality, where the boundary between footwear and air becomes soft and undefined. This is a common failure mode in diffusion-based video models when limbs overlap or contact surfaces.",[11,39203,39204,39207],{},[23,39205,39206],{},"It looks fine while playing at normal speed. Pause any frame during a freeze pose and things fall apart."," For content that will only be viewed as video (social media, ads), this may be acceptable. For anything that might be screenshotted, thumbnailed, or analyzed, it's a dealbreaker.",[92,39209,39211],{"id":39210},"test-2-verdict","Test 2 Verdict",[11,39213,39214,39217],{},[23,39215,39216],{},"Seedance 2.0 wins decisively."," The anatomy accuracy gap (8.5 vs 6.5) is the largest single-dimension difference across all three tests. For any content involving dynamic human movement — dance, sports, action sequences — Seedance is the more reliable choice right now.",[11,39219,39220],{},"The 60fps frame rate compounds this advantage. At 30fps, fast breakdance movements produce noticeable judder. At 60fps, they're smooth.",[11,39222,39223,39224,39227],{},"If you're building a product that generates human-motion content through an ",[37,39225,39226],{"href":14392},"AI video API",", this result should heavily influence your model selection.",[11,39229,39230],{},[23,39231,39232],{},"Score summary for Test 2:",[2035,39234,39235,39255],{},[2038,39236,39237],{},[2041,39238,39239,39241,39243,39246,39249,39251],{},[2044,39240,38981],{},[2044,39242,38822],{"align":13819},[2044,39244,39245],{"align":13819},"Anatomy",[2044,39247,39248],{"align":13819},"Motion",[2044,39250,38855],{"align":13819},[2044,39252,39253],{"align":13819},[23,39254,38995],{},[2051,39256,39257,39274],{},[2041,39258,39259,39261,39263,39265,39267,39270],{},[2056,39260,17406],{},[2056,39262,39013],{"align":13819},[2056,39264,39004],{"align":13819},[2056,39266,39013],{"align":13819},[2056,39268,39269],{"align":13819},"9.5",[2056,39271,39272],{"align":13819},[23,39273,39013],{},[2041,39275,39276,39278,39280,39283,39285,39287],{},[2056,39277,38719],{},[2056,39279,39018],{"align":13819},[2056,39281,39282],{"align":13819},"6.5",[2056,39284,39018],{"align":13819},[2056,39286,39004],{"align":13819},[2056,39288,39289],{"align":13819},[23,39290,39291],{},"7.75",[11,39293,39294],{},"This is the widest gap across all three tests. Seedance outperforms in every single dimension. The anatomy accuracy delta (8.5 vs 6.5) alone should be disqualifying for Sora in human-motion applications where frame-level quality matters.",[11,39296,39297],{},"For developers working on fitness apps, dance content platforms, sports highlights, or any product featuring dynamic human movement, this test provides strong evidence for defaulting to Seedance 2.0.",[48,39299,39301],{"id":39300},"test-3-facial-expression-lighting-elder-bookshop","Test 3 — Facial Expression & Lighting (Elder Bookshop)",[11,39303,39304],{},[23,39305,38787],{},[18,39307,39308],{},[11,39309,39310],{},"A wise elderly woman with silver hair and round spectacles sits in a cluttered antique bookshop. She picks up a leather-bound book, opens it, and her expression shifts from curiosity to wonder as golden light emanates from the pages. The light illuminates her face and the surrounding book spines. Camera slowly pushes in from medium shot to close-up on her face. Warm tungsten lighting mixed with the magical golden glow.",[92,39312,17406],{"id":39313},"seedance-20-2",[56,39315,60,39316],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39317],{"src":39318,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2035,39320,39321,39331],{},[2038,39322,39323],{},[2041,39324,39325,39327,39329],{},[2044,39326,38809],{},[2044,39328,38812],{"align":13819},[2044,39330,38815],{},[2051,39332,39333,39343,39353,39363],{},[2041,39334,39335,39338,39340],{},[2056,39336,39337],{},"Facial Quality",[2056,39339,38825],{"align":13819},[2056,39341,39342],{},"Wrinkles, crow's feet, nasolabial folds render naturally. Round spectacles sit correctly on nose bridge with subtle refraction",[2041,39344,39345,39348,39350],{},[2056,39346,39347],{},"Expression Transition",[2056,39349,38825],{"align":13819},[2056,39351,39352],{},"Quiet focus → wonder is conveyed through widening eyes, slightly raised brows, parting lips. Layered micro-expressions",[2041,39354,39355,39358,39360],{},[2056,39356,39357],{},"Environment Detail",[2056,39359,38858],{"align":13819},[2056,39361,39362],{},"⭐ Richest scene of all tests. Floor-to-ceiling leather book spines, rolling library ladder, globe desk lamp, ink bottles, brass instruments",[2041,39364,39365,39368,39370],{},[2056,39366,39367],{},"Golden Light Effect",[2056,39369,38858],{"align":13819},[2056,39371,39372],{},"Volumetric golden light radiates upward from pages. Correctly illuminates chin, cheeks, under-nose. Blends naturally with existing warm tungsten",[11,39374,39375,39377],{},[23,39376,38866],{}," The bookshop environment is extraordinary. It feels like a real, lived-in space — books stacked chaotically on floors and tables, period-appropriate props scattered naturally. The scene evokes a Dickensian bookshop or an Oxford study. Seedance built the entire world around the character, not just the character.",[11,39379,39380],{},"The golden light has actual volume. It interacts correctly with silver hair edges and fabric folds, creating natural rim highlights. The light doesn't just illuminate the face — it casts subtle warm reflections on the nearest book spines and creates a gentle glow on the table surface. This kind of multi-surface light interaction is what sells the \"magical\" quality of the scene.",[11,39382,39383],{},"The expression transition is worth examining in detail. It's not a simple cut from \"neutral\" to \"amazed.\" You can see a sequence: concentration as she opens the book → slight confusion as the light first appears → recognition → genuine wonder with slightly parted lips and widened eyes. This micro-expression layering is what separates AI-generated faces that feel \"alive\" from those that feel \"posed.\"",[92,39385,38719],{"id":39386},"sora-2-2",[56,39388,60,39389],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39390],{"src":39391,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2035,39393,39394,39404],{},[2038,39395,39396],{},[2041,39397,39398,39400,39402],{},[2044,39399,38809],{},[2044,39401,38812],{"align":13819},[2044,39403,38815],{},[2051,39405,39406,39415,39424,39433],{},[2041,39407,39408,39410,39412],{},[2056,39409,39337],{},[2056,39411,38836],{"align":13819},[2056,39413,39414],{},"Passable but \"waxy.\" Forehead and cheeks are too smooth. Aging inconsistent — some areas look 70+, others 50",[2041,39416,39417,39419,39421],{},[2056,39418,39347],{},[2056,39420,38923],{"align":13819},[2056,39422,39423],{},"Wonder comes through (mouth opens, eyes widen). But eyelid and brow expressiveness is less nuanced than Seedance",[2041,39425,39426,39428,39430],{},[2056,39427,39357],{},[2056,39429,38825],{"align":13819},[2056,39431,39432],{},"Good atmosphere with green banker's lamp. Depth of field handled well. But less layered — missing ladder, floor books, desk props",[2041,39434,39435,39437,39439],{},[2056,39436,39367],{},[2056,39438,38858],{"align":13819},[2056,39440,39441],{},"Upward lighting direction correct. Golden particle effects add magical feel. Good subsurface scattering on skin",[11,39443,39444,39447],{},[23,39445,39446],{},"The \"wax face\" problem:"," Sora 2 renders elderly skin that's simultaneously wrinkled and oddly smooth. The forehead lacks the texture density you'd expect — age spots, pore visibility, and the slight translucency of thin elderly skin are all muted. Some areas of the face read as 70+ years old (around the eyes), while others look closer to 50 (forehead, cheeks). This inconsistency breaks the uncanny valley in close-up shots — exactly the shot this prompt calls for.",[11,39449,39450],{},"The bookshop environment, while atmospheric, is less layered than Seedance's version. It has a green banker's lamp and well-handled depth of field, but lacks the rolling ladder, floor-level book stacks, brass instruments, ink bottles, and other period props that make Seedance's version feel like a real space rather than a set.",[92,39452,39454],{"id":39453},"test-3-verdict","Test 3 Verdict",[11,39456,39457,39460],{},[23,39458,39459],{},"Seedance 2.0 wins on facial detail and environmental richness."," For character-driven content — storytelling, narrative ads, emotional close-ups — Seedance produces more believable faces and richer worlds.",[11,39462,39463],{},"Both models nail the golden magical light effect. That's a tie.",[11,39465,39466],{},[23,39467,39468],{},"Score summary for Test 3:",[2035,39470,39471,39493],{},[2038,39472,39473],{},[2041,39474,39475,39477,39480,39483,39486,39489],{},[2044,39476,38981],{},[2044,39478,39479],{"align":13819},"Face Quality",[2044,39481,39482],{"align":13819},"Expression",[2044,39484,39485],{"align":13819},"Environment",[2044,39487,39488],{"align":13819},"Light Effect",[2044,39490,39491],{"align":13819},[23,39492,38995],{},[2051,39494,39495,39512],{},[2041,39496,39497,39499,39501,39503,39505,39507],{},[2056,39498,17406],{},[2056,39500,39004],{"align":13819},[2056,39502,39004],{"align":13819},[2056,39504,39013],{"align":13819},[2056,39506,39013],{"align":13819},[2056,39508,39509],{"align":13819},[23,39510,39511],{},"8.75",[2041,39513,39514,39516,39518,39520,39522,39524],{},[2056,39515,38719],{},[2056,39517,39007],{"align":13819},[2056,39519,39018],{"align":13819},[2056,39521,39004],{"align":13819},[2056,39523,39013],{"align":13819},[2056,39525,39526],{"align":13819},[23,39527,39528],{},"8.25",[11,39530,39531],{},"Seedance wins this round through more convincing facial aging and a richer environment. The \"wax face\" issue with Sora is particularly problematic in close-up shots, which are exactly what this prompt demands with its \"medium shot to close-up\" camera push.",[11,39533,39534],{},"For narrative content, short films, character-driven ads, or any application where emotional authenticity matters, Seedance's facial rendering is a meaningful advantage.",[11,39536,39537,39538,4516],{},"For more on getting the best results from Seedance prompts, see our ",[37,39539,39540],{"href":1766},"prompt engineering guide",[48,39542,39544],{"id":39543},"technical-specs-comparison","Technical Specs Comparison",[11,39546,39547],{},"Here's the full technical breakdown based on our actual output analysis:",[2035,39549,39550,39561],{},[2038,39551,39552],{},[2041,39553,39554,39557,39559],{},[2044,39555,39556],{},"Specification",[2044,39558,17406],{"align":13819},[2044,39560,38719],{"align":13819},[2051,39562,39563,39573,39586,39597,39610,39623,39633,39643,39656,39669,39682,39693,39705],{},[2041,39564,39565,39569,39571],{},[2056,39566,39567],{},[23,39568,38726],{},[2056,39570,38729],{"align":13819},[2056,39572,38732],{"align":13819},[2041,39574,39575,39580,39583],{},[2056,39576,39577],{},[23,39578,39579],{},"Pixels per frame",[2056,39581,39582],{"align":13819},"921,600",[2056,39584,39585],{"align":13819},"1,835,008 (~2×)",[2041,39587,39588,39593,39595],{},[2056,39589,39590],{},[23,39591,39592],{},"Frame rate",[2056,39594,38740],{"align":13819},[2056,39596,38743],{"align":13819},[2041,39598,39599,39604,39607],{},[2056,39600,39601],{},[23,39602,39603],{},"Total frames (15s)",[2056,39605,39606],{"align":13819},"900",[2056,39608,39609],{"align":13819},"450",[2041,39611,39612,39617,39620],{},[2056,39613,39614],{},[23,39615,39616],{},"Duration range",[2056,39618,39619],{"align":13819},"4–15s",[2056,39621,39622],{"align":13819},"Up to 20s",[2041,39624,39625,39629,39631],{},[2056,39626,39627],{},[23,39628,38756],{},[2056,39630,38759],{"align":13819},[2056,39632,38759],{"align":13819},[2041,39634,39635,39639,39641],{},[2056,39636,39637],{},[23,39638,38766],{},[2056,39640,38769],{"align":13819},[2056,39642,38772],{"align":13819},[2041,39644,39645,39650,39653],{},[2056,39646,39647],{},[23,39648,39649],{},"Audio generation",[2056,39651,39652],{"align":13819},"Built-in (voice, SFX, music)",[2056,39654,39655],{"align":13819},"Built-in",[2041,39657,39658,39663,39666],{},[2056,39659,39660],{},[23,39661,39662],{},"Aspect ratios",[2056,39664,39665],{"align":13819},"16:9, 9:16, 1:1, 4:3, 3:4, 21:9",[2056,39667,39668],{"align":13819},"16:9, 9:16, 1:1",[2041,39670,39671,39676,39679],{},[2056,39672,39673],{},[23,39674,39675],{},"Input modes",[2056,39677,39678],{"align":13819},"Text, image, video, audio → video",[2056,39680,39681],{"align":13819},"Text, image → video",[2041,39683,39684,39689,39691],{},[2056,39685,39686],{},[23,39687,39688],{},"Max input images",[2056,39690,35639],{"align":13819},[2056,39692,5440],{"align":13819},[2041,39694,39695,39700,39702],{},[2056,39696,39697],{},[23,39698,39699],{},"Max input videos",[2056,39701,5059],{"align":13819},[2056,39703,39704],{"align":13819},"N/A",[2041,39706,39707,39712,39715],{},[2056,39708,39709],{},[23,39710,39711],{},"@-reference system",[2056,39713,39714],{"align":13819},"✅ (multimodal tags)",[2056,39716,13842],{"align":13819},[11,39718,39719],{},[23,39720,39721],{},"Key takeaways:",[97,39723,39724,39727,39730,39737],{},[73,39725,39726],{},"Seedance's 60fps produces 2× more frames in the same duration, which is why motion looks smoother",[73,39728,39729],{},"Sora's higher resolution is better for content that will be paused or screenshotted",[73,39731,39732,39733,39736],{},"Seedance's ",[37,39734,39735],{"href":2969},"multimodal @-reference system"," allows combining image, video, and audio inputs in a single prompt — a capability Sora 2 doesn't offer",[73,39738,39739],{},"Seedance supports 1080p output as well (see API parameters below), though our tests used the default 720p",[48,39741,39743],{"id":39742},"api-access-code-examples","API Access & Code Examples",[11,39745,39746],{},"Both models are accessible via REST APIs. Here's how to call each one.",[92,39748,39750],{"id":39749},"seedance-20-via-evolink-api","Seedance 2.0 via EvoLink API",[11,39752,39753],{},"EvoLink provides unified API access to Seedance 2.0 with async task processing. Here's a complete Python example:",[137,39755,39757],{"className":338,"code":39756,"language":340,"meta":142,"style":142},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get one at evolink.ai/dashboard/keys\nBASE_URL = \"https://api.evolink.ai/v1\"\n\ndef generate_video(prompt: str, duration: int = 15, quality: str = \"720p\") -> str:\n    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n\n    # Step 1: Submit generation task\n    response = requests.post(\n        f\"{BASE_URL}/video/generations\",\n        headers={\n            \"Authorization\": f\"Bearer {API_KEY}\",\n            \"Content-Type\": \"application/json\",\n        },\n        json={\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": duration,\n            \"quality\": quality,\n            \"aspect_ratio\": \"16:9\",\n            \"generate_audio\": True,\n        },\n    )\n    response.raise_for_status()\n    task_id = response.json()[\"task_id\"]\n    print(f\"Task submitted: {task_id}\")\n\n    # Step 2: Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n        )\n        status_resp.raise_for_status()\n        task = status_resp.json()\n\n        if task[\"status\"] == \"completed\":\n            video_url = task[\"output\"][\"video_url\"]\n            print(f\"Done! Video URL (valid 24h): {video_url}\")\n            return video_url\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"Status: {task['status']}... waiting 5s\")\n        time.sleep(5)\n\n\n# Run the porcelain vase test\nvideo = generate_video(\n    prompt=(\n        \"A porcelain vase falls from a marble table in slow motion. \"\n        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n        \"then follows it downward with a smooth tracking shot as it shatters \"\n        \"on a stone floor. Fragments scatter in all directions. \"\n        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n        \"Shallow depth of field, 24fps cinematic look\"\n    ),\n    duration=15,\n    quality=\"720p\",\n)\n",[28,39758,39759,39765,39771,39775,39786,39794,39798,39833,39838,39842,39847,39855,39868,39876,39893,39905,39910,39918,39928,39934,39940,39946,39957,39968,39972,39976,39980,39992,40012,40016,40021,40029,40037,40057,40079,40083,40087,40095,40099,40115,40131,40152,40159,40175,40205,40209,40235,40243,40247,40251,40256,40266,40274,40279,40284,40289,40294,40299,40304,40308,40318,40328],{"__ignoreMap":142},[146,39760,39761,39763],{"class":148,"line":149},[146,39762,347],{"class":259},[146,39764,329],{"class":263},[146,39766,39767,39769],{"class":148,"line":167},[146,39768,347],{"class":259},[146,39770,356],{"class":263},[146,39772,39773],{"class":148,"line":179},[146,39774,376],{"emptyLinePlaceholder":58},[146,39776,39777,39779,39781,39783],{"class":148,"line":188},[146,39778,388],{"class":156},[146,39780,391],{"class":259},[146,39782,14684],{"class":160},[146,39784,39785],{"class":175},"  # Get one at evolink.ai/dashboard/keys\n",[146,39787,39788,39790,39792],{"class":148,"line":373},[146,39789,412],{"class":156},[146,39791,391],{"class":259},[146,39793,417],{"class":160},[146,39795,39796],{"class":148,"line":379},[146,39797,376],{"emptyLinePlaceholder":58},[146,39799,39800,39802,39804,39806,39808,39811,39813,39815,39817,39820,39822,39824,39827,39829,39831],{"class":148,"line":385},[146,39801,526],{"class":259},[146,39803,14742],{"class":152},[146,39805,15844],{"class":263},[146,39807,8674],{"class":156},[146,39809,39810],{"class":263},", duration: ",[146,39812,17762],{"class":156},[146,39814,391],{"class":259},[146,39816,5998],{"class":156},[146,39818,39819],{"class":263},", quality: ",[146,39821,8674],{"class":156},[146,39823,391],{"class":259},[146,39825,39826],{"class":160}," \"720p\"",[146,39828,15849],{"class":263},[146,39830,8674],{"class":156},[146,39832,860],{"class":263},[146,39834,39835],{"class":148,"line":409},[146,39836,39837],{"class":160},"    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n",[146,39839,39840],{"class":148,"line":420},[146,39841,376],{"emptyLinePlaceholder":58},[146,39843,39844],{"class":148,"line":431},[146,39845,39846],{"class":175},"    # Step 1: Submit generation task\n",[146,39848,39849,39851,39853],{"class":148,"line":455},[146,39850,1427],{"class":263},[146,39852,267],{"class":259},[146,39854,1432],{"class":263},[146,39856,39857,39859,39861,39863,39866],{"class":148,"line":466},[146,39858,1437],{"class":259},[146,39860,449],{"class":160},[146,39862,679],{"class":156},[146,39864,39865],{"class":160},"/video/generations\"",[146,39867,452],{"class":263},[146,39869,39870,39872,39874],{"class":148,"line":600},[146,39871,1455],{"class":701},[146,39873,267],{"class":259},[146,39875,1864],{"class":263},[146,39877,39878,39881,39883,39885,39887,39889,39891],{"class":148,"line":605},[146,39879,39880],{"class":160},"            \"Authorization\"",[146,39882,437],{"class":263},[146,39884,440],{"class":259},[146,39886,443],{"class":160},[146,39888,446],{"class":156},[146,39890,449],{"class":160},[146,39892,452],{"class":263},[146,39894,39895,39898,39900,39903],{"class":148,"line":611},[146,39896,39897],{"class":160},"            \"Content-Type\"",[146,39899,437],{"class":263},[146,39901,39902],{"class":160},"\"application/json\"",[146,39904,452],{"class":263},[146,39906,39907],{"class":148,"line":617},[146,39908,39909],{"class":263},"        },\n",[146,39911,39912,39914,39916],{"class":148,"line":623},[146,39913,1470],{"class":701},[146,39915,267],{"class":259},[146,39917,1864],{"class":263},[146,39919,39920,39922,39924,39926],{"class":148,"line":628},[146,39921,8478],{"class":160},[146,39923,437],{"class":263},[146,39925,1308],{"class":160},[146,39927,452],{"class":263},[146,39929,39930,39932],{"class":148,"line":639},[146,39931,8489],{"class":160},[146,39933,8492],{"class":263},[146,39935,39936,39938],{"class":148,"line":654},[146,39937,8497],{"class":160},[146,39939,16875],{"class":263},[146,39941,39942,39944],{"class":148,"line":660},[146,39943,8508],{"class":160},[146,39945,16883],{"class":263},[146,39947,39948,39951,39953,39955],{"class":148,"line":671},[146,39949,39950],{"class":160},"            \"aspect_ratio\"",[146,39952,437],{"class":263},[146,39954,1384],{"class":160},[146,39956,452],{"class":263},[146,39958,39959,39962,39964,39966],{"class":148,"line":698},[146,39960,39961],{"class":160},"            \"generate_audio\"",[146,39963,437],{"class":263},[146,39965,1139],{"class":156},[146,39967,452],{"class":263},[146,39969,39970],{"class":148,"line":710},[146,39971,39909],{"class":263},[146,39973,39974],{"class":148,"line":716},[146,39975,1483],{"class":263},[146,39977,39978],{"class":148,"line":722},[146,39979,2799],{"class":263},[146,39981,39982,39984,39986,39988,39990],{"class":148,"line":728},[146,39983,7221],{"class":263},[146,39985,267],{"class":259},[146,39987,12209],{"class":263},[146,39989,7696],{"class":160},[146,39991,764],{"class":263},[146,39993,39994,39996,39998,40000,40002,40004,40006,40008,40010],{"class":148,"line":739},[146,39995,1102],{"class":156},[146,39997,794],{"class":263},[146,39999,440],{"class":259},[146,40001,6594],{"class":160},[146,40003,685],{"class":156},[146,40005,688],{"class":263},[146,40007,691],{"class":156},[146,40009,449],{"class":160},[146,40011,406],{"class":263},[146,40013,40014],{"class":148,"line":744},[146,40015,376],{"emptyLinePlaceholder":58},[146,40017,40018],{"class":148,"line":750},[146,40019,40020],{"class":175},"    # Step 2: Poll for completion\n",[146,40022,40023,40025,40027],{"class":148,"line":767},[146,40024,642],{"class":259},[146,40026,14865],{"class":156},[146,40028,860],{"class":263},[146,40030,40031,40033,40035],{"class":148,"line":788},[146,40032,14872],{"class":263},[146,40034,267],{"class":259},[146,40036,668],{"class":263},[146,40038,40039,40041,40043,40045,40047,40049,40051,40053,40055],{"class":148,"line":834},[146,40040,674],{"class":259},[146,40042,449],{"class":160},[146,40044,679],{"class":156},[146,40046,682],{"class":160},[146,40048,685],{"class":156},[146,40050,688],{"class":263},[146,40052,691],{"class":156},[146,40054,449],{"class":160},[146,40056,452],{"class":263},[146,40058,40059,40061,40063,40065,40067,40069,40071,40073,40075,40077],{"class":148,"line":839},[146,40060,702],{"class":701},[146,40062,267],{"class":259},[146,40064,685],{"class":263},[146,40066,31550],{"class":160},[146,40068,437],{"class":263},[146,40070,440],{"class":259},[146,40072,443],{"class":160},[146,40074,446],{"class":156},[146,40076,449],{"class":160},[146,40078,19596],{"class":263},[146,40080,40081],{"class":148,"line":845},[146,40082,713],{"class":263},[146,40084,40085],{"class":148,"line":863},[146,40086,14913],{"class":263},[146,40088,40089,40091,40093],{"class":148,"line":872},[146,40090,731],{"class":263},[146,40092,267],{"class":259},[146,40094,14922],{"class":263},[146,40096,40097],{"class":148,"line":887},[146,40098,376],{"emptyLinePlaceholder":58},[146,40100,40101,40103,40105,40107,40109,40111,40113],{"class":148,"line":903},[146,40102,848],{"class":259},[146,40104,758],{"class":263},[146,40106,761],{"class":160},[146,40108,14937],{"class":263},[146,40110,854],{"class":259},[146,40112,857],{"class":160},[146,40114,860],{"class":263},[146,40116,40117,40119,40121,40123,40125,40127,40129],{"class":148,"line":915},[146,40118,7407],{"class":263},[146,40120,267],{"class":259},[146,40122,758],{"class":263},[146,40124,21546],{"class":160},[146,40126,1562],{"class":263},[146,40128,14959],{"class":160},[146,40130,764],{"class":263},[146,40132,40133,40135,40137,40139,40142,40144,40146,40148,40150],{"class":148,"line":953},[146,40134,5580],{"class":156},[146,40136,794],{"class":263},[146,40138,440],{"class":259},[146,40140,40141],{"class":160},"\"Done! Video URL (valid 24h): ",[146,40143,685],{"class":156},[146,40145,1678],{"class":263},[146,40147,691],{"class":156},[146,40149,449],{"class":160},[146,40151,406],{"class":263},[146,40153,40154,40156],{"class":148,"line":959},[146,40155,866],{"class":259},[146,40157,40158],{"class":263}," video_url\n",[146,40160,40161,40163,40165,40167,40169,40171,40173],{"class":148,"line":964},[146,40162,875],{"class":259},[146,40164,758],{"class":263},[146,40166,761],{"class":160},[146,40168,14937],{"class":263},[146,40170,854],{"class":259},[146,40172,882],{"class":160},[146,40174,860],{"class":263},[146,40176,40177,40179,40181,40183,40185,40187,40189,40191,40193,40195,40197,40199,40201,40203],{"class":148,"line":970},[146,40178,906],{"class":259},[146,40180,909],{"class":156},[146,40182,794],{"class":263},[146,40184,440],{"class":259},[146,40186,15017],{"class":160},[146,40188,685],{"class":156},[146,40190,17946],{"class":263},[146,40192,11874],{"class":160},[146,40194,400],{"class":263},[146,40196,943],{"class":160},[146,40198,118],{"class":263},[146,40200,691],{"class":156},[146,40202,449],{"class":160},[146,40204,406],{"class":263},[146,40206,40207],{"class":148,"line":976},[146,40208,376],{"emptyLinePlaceholder":58},[146,40210,40211,40213,40215,40217,40219,40221,40223,40226,40228,40230,40233],{"class":148,"line":988},[146,40212,791],{"class":156},[146,40214,794],{"class":263},[146,40216,440],{"class":259},[146,40218,11903],{"class":160},[146,40220,685],{"class":156},[146,40222,1529],{"class":263},[146,40224,40225],{"class":160},"'status'",[146,40227,1535],{"class":263},[146,40229,691],{"class":156},[146,40231,40232],{"class":160},"... waiting 5s\"",[146,40234,406],{"class":263},[146,40236,40237,40239,40241],{"class":148,"line":993},[146,40238,15074],{"class":263},[146,40240,1352],{"class":156},[146,40242,406],{"class":263},[146,40244,40245],{"class":148,"line":5534},[146,40246,376],{"emptyLinePlaceholder":58},[146,40248,40249],{"class":148,"line":5543},[146,40250,376],{"emptyLinePlaceholder":58},[146,40252,40253],{"class":148,"line":5549},[146,40254,40255],{"class":175},"# Run the porcelain vase test\n",[146,40257,40258,40261,40263],{"class":148,"line":5577},[146,40259,40260],{"class":263},"video ",[146,40262,267],{"class":259},[146,40264,40265],{"class":263}," generate_video(\n",[146,40267,40268,40270,40272],{"class":148,"line":5608},[146,40269,17048],{"class":701},[146,40271,267],{"class":259},[146,40273,912],{"class":263},[146,40275,40276],{"class":148,"line":5628},[146,40277,40278],{"class":160},"        \"A porcelain vase falls from a marble table in slow motion. \"\n",[146,40280,40281],{"class":148,"line":5634},[146,40282,40283],{"class":160},"        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[146,40285,40286],{"class":148,"line":5640},[146,40287,40288],{"class":160},"        \"then follows it downward with a smooth tracking shot as it shatters \"\n",[146,40290,40291],{"class":148,"line":5645},[146,40292,40293],{"class":160},"        \"on a stone floor. Fragments scatter in all directions. \"\n",[146,40295,40296],{"class":148,"line":5658},[146,40297,40298],{"class":160},"        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[146,40300,40301],{"class":148,"line":5664},[146,40302,40303],{"class":160},"        \"Shallow depth of field, 24fps cinematic look\"\n",[146,40305,40306],{"class":148,"line":5691},[146,40307,3808],{"class":263},[146,40309,40310,40312,40314,40316],{"class":148,"line":5731},[146,40311,17075],{"class":701},[146,40313,267],{"class":259},[146,40315,3909],{"class":156},[146,40317,452],{"class":263},[146,40319,40320,40322,40324,40326],{"class":148,"line":5750},[146,40321,17086],{"class":701},[146,40323,267],{"class":259},[146,40325,1368],{"class":160},[146,40327,452],{"class":263},[146,40329,40330],{"class":148,"line":5755},[146,40331,406],{"class":263},[11,40333,40334,40337],{},[23,40335,40336],{},"Multimodal input example"," — using an image as the first frame:",[137,40339,40341],{"className":338,"code":40340,"language":340,"meta":142,"style":142},"response = requests.post(\n    f\"{BASE_URL}/video/generations\",\n    headers={\n        \"Authorization\": f\"Bearer {API_KEY}\",\n        \"Content-Type\": \"application/json\",\n    },\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": \"@Image1 as first frame, the vase begins to wobble and fall\",\n        \"image_urls\": [\"https://example.com/porcelain-vase.jpg\"],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n    },\n)\n",[28,40342,40343,40351,40363,40371,40388,40399,40403,40411,40421,40432,40443,40453,40463,40467],{"__ignoreMap":142},[146,40344,40345,40347,40349],{"class":148,"line":149},[146,40346,6532],{"class":263},[146,40348,267],{"class":259},[146,40350,1432],{"class":263},[146,40352,40353,40355,40357,40359,40361],{"class":148,"line":167},[146,40354,6541],{"class":259},[146,40356,449],{"class":160},[146,40358,679],{"class":156},[146,40360,39865],{"class":160},[146,40362,452],{"class":263},[146,40364,40365,40367,40369],{"class":148,"line":179},[146,40366,6554],{"class":701},[146,40368,267],{"class":259},[146,40370,1864],{"class":263},[146,40372,40373,40376,40378,40380,40382,40384,40386],{"class":148,"line":188},[146,40374,40375],{"class":160},"        \"Authorization\"",[146,40377,437],{"class":263},[146,40379,440],{"class":259},[146,40381,443],{"class":160},[146,40383,446],{"class":156},[146,40385,449],{"class":160},[146,40387,452],{"class":263},[146,40389,40390,40393,40395,40397],{"class":148,"line":373},[146,40391,40392],{"class":160},"        \"Content-Type\"",[146,40394,437],{"class":263},[146,40396,39902],{"class":160},[146,40398,452],{"class":263},[146,40400,40401],{"class":148,"line":379},[146,40402,22210],{"class":263},[146,40404,40405,40407,40409],{"class":148,"line":385},[146,40406,6565],{"class":701},[146,40408,267],{"class":259},[146,40410,1864],{"class":263},[146,40412,40413,40415,40417,40419],{"class":148,"line":409},[146,40414,1303],{"class":160},[146,40416,437],{"class":263},[146,40418,1308],{"class":160},[146,40420,452],{"class":263},[146,40422,40423,40425,40427,40430],{"class":148,"line":420},[146,40424,1319],{"class":160},[146,40426,437],{"class":263},[146,40428,40429],{"class":160},"\"@Image1 as first frame, the vase begins to wobble and fall\"",[146,40431,452],{"class":263},[146,40433,40434,40436,40438,40441],{"class":148,"line":431},[146,40435,2690],{"class":160},[146,40437,10846],{"class":263},[146,40439,40440],{"class":160},"\"https://example.com/porcelain-vase.jpg\"",[146,40442,10852],{"class":263},[146,40444,40445,40447,40449,40451],{"class":148,"line":455},[146,40446,1347],{"class":160},[146,40448,437],{"class":263},[146,40450,537],{"class":156},[146,40452,452],{"class":263},[146,40454,40455,40457,40459,40461],{"class":148,"line":466},[146,40456,1363],{"class":160},[146,40458,437],{"class":263},[146,40460,3714],{"class":160},[146,40462,452],{"class":263},[146,40464,40465],{"class":148,"line":600},[146,40466,22210],{"class":263},[146,40468,40469],{"class":148,"line":605},[146,40470,406],{"class":263},[11,40472,40473,40474,4516],{},"For advanced multimodal workflows with @Image, @Video, and @Audio references, see our ",[37,40475,40476],{"href":2969},"@Tags guide",[92,40478,40480],{"id":40479},"sora-2-via-openai-api","Sora 2 via OpenAI API",[137,40482,40484],{"className":338,"code":40483,"language":340,"meta":142,"style":142},"from openai import OpenAI\n\nclient = OpenAI()  # Uses OPENAI_API_KEY env var\n\n# Submit video generation\nresponse = client.responses.create(\n    model=\"sora\",\n    input=[{\n        \"type\": \"text\",\n        \"text\": (\n            \"A porcelain vase falls from a marble table in slow motion. \"\n            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n            \"then follows it downward with a smooth tracking shot as it shatters \"\n            \"on a stone floor. Fragments scatter in all directions. \"\n            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n            \"Shallow depth of field, 24fps cinematic look\"\n        ),\n    }],\n    resolution=\"1080p\",\n    duration=15,\n)\n\n# Get the video URL from the response\nvideo_url = response.output[0].url\nprint(f\"Video URL: {video_url}\")\n",[28,40485,40486,40498,40502,40515,40519,40524,40533,40545,40555,40567,40574,40579,40584,40589,40594,40599,40604,40608,40613,40624,40634,40638,40642,40647,40661],{"__ignoreMap":142},[146,40487,40488,40490,40493,40495],{"class":148,"line":149},[146,40489,6731],{"class":259},[146,40491,40492],{"class":263}," openai ",[146,40494,347],{"class":259},[146,40496,40497],{"class":263}," OpenAI\n",[146,40499,40500],{"class":148,"line":167},[146,40501,376],{"emptyLinePlaceholder":58},[146,40503,40504,40507,40509,40512],{"class":148,"line":179},[146,40505,40506],{"class":263},"client ",[146,40508,267],{"class":259},[146,40510,40511],{"class":263}," OpenAI()  ",[146,40513,40514],{"class":175},"# Uses OPENAI_API_KEY env var\n",[146,40516,40517],{"class":148,"line":188},[146,40518,376],{"emptyLinePlaceholder":58},[146,40520,40521],{"class":148,"line":373},[146,40522,40523],{"class":175},"# Submit video generation\n",[146,40525,40526,40528,40530],{"class":148,"line":379},[146,40527,6532],{"class":263},[146,40529,267],{"class":259},[146,40531,40532],{"class":263}," client.responses.create(\n",[146,40534,40535,40538,40540,40543],{"class":148,"line":385},[146,40536,40537],{"class":701},"    model",[146,40539,267],{"class":259},[146,40541,40542],{"class":160},"\"sora\"",[146,40544,452],{"class":263},[146,40546,40547,40550,40552],{"class":148,"line":409},[146,40548,40549],{"class":701},"    input",[146,40551,267],{"class":259},[146,40553,40554],{"class":263},"[{\n",[146,40556,40557,40560,40562,40565],{"class":148,"line":420},[146,40558,40559],{"class":160},"        \"type\"",[146,40561,437],{"class":263},[146,40563,40564],{"class":160},"\"text\"",[146,40566,452],{"class":263},[146,40568,40569,40572],{"class":148,"line":431},[146,40570,40571],{"class":160},"        \"text\"",[146,40573,1322],{"class":263},[146,40575,40576],{"class":148,"line":455},[146,40577,40578],{"class":160},"            \"A porcelain vase falls from a marble table in slow motion. \"\n",[146,40580,40581],{"class":148,"line":466},[146,40582,40583],{"class":160},"            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[146,40585,40586],{"class":148,"line":600},[146,40587,40588],{"class":160},"            \"then follows it downward with a smooth tracking shot as it shatters \"\n",[146,40590,40591],{"class":148,"line":605},[146,40592,40593],{"class":160},"            \"on a stone floor. Fragments scatter in all directions. \"\n",[146,40595,40596],{"class":148,"line":611},[146,40597,40598],{"class":160},"            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[146,40600,40601],{"class":148,"line":617},[146,40602,40603],{"class":160},"            \"Shallow depth of field, 24fps cinematic look\"\n",[146,40605,40606],{"class":148,"line":623},[146,40607,1342],{"class":263},[146,40609,40610],{"class":148,"line":628},[146,40611,40612],{"class":263},"    }],\n",[146,40614,40615,40618,40620,40622],{"class":148,"line":639},[146,40616,40617],{"class":701},"    resolution",[146,40619,267],{"class":259},[146,40621,3714],{"class":160},[146,40623,452],{"class":263},[146,40625,40626,40628,40630,40632],{"class":148,"line":654},[146,40627,17075],{"class":701},[146,40629,267],{"class":259},[146,40631,3909],{"class":156},[146,40633,452],{"class":263},[146,40635,40636],{"class":148,"line":660},[146,40637,406],{"class":263},[146,40639,40640],{"class":148,"line":671},[146,40641,376],{"emptyLinePlaceholder":58},[146,40643,40644],{"class":148,"line":698},[146,40645,40646],{"class":175},"# Get the video URL from the response\n",[146,40648,40649,40651,40653,40656,40658],{"class":148,"line":710},[146,40650,29864],{"class":263},[146,40652,267],{"class":259},[146,40654,40655],{"class":263}," response.output[",[146,40657,783],{"class":156},[146,40659,40660],{"class":263},"].url\n",[146,40662,40663,40665,40667,40669,40672,40674,40676,40678,40680],{"class":148,"line":716},[146,40664,6587],{"class":156},[146,40666,794],{"class":263},[146,40668,440],{"class":259},[146,40670,40671],{"class":160},"\"Video URL: ",[146,40673,685],{"class":156},[146,40675,1678],{"class":263},[146,40677,691],{"class":156},[146,40679,449],{"class":160},[146,40681,406],{"class":263},[11,40683,40684],{},"Both APIs follow a similar pattern: submit a prompt, get back a video. But the differences go beyond just the endpoint.",[11,40686,40687,40690],{},[23,40688,40689],{},"Async vs sync:"," The EvoLink API for Seedance is asynchronous — you submit a task and poll for completion (or use a webhook callback). Sora via OpenAI returns directly. For production pipelines processing many videos, the async pattern is often preferable since you can submit batches without blocking.",[11,40692,40693,40696],{},[23,40694,40695],{},"Input flexibility:"," Seedance's @-reference system lets you combine up to 9 images, 3 videos, and 3 audio tracks in a single prompt. You can say \"@Image1 as first frame, replicate @Video1 camera movement, sync to @Audio1 beat.\" Sora 2 supports image input but doesn't offer this kind of multimodal composition.",[11,40698,40699,40702],{},[23,40700,40701],{},"Output options:"," Seedance lets you toggle audio generation on or off per request, choose from six aspect ratios (including 21:9 ultrawide), and select 480p/720p/1080p resolution. Sora offers fewer output configuration options but delivers higher default resolution.",[11,40704,40705,40708],{},[23,40706,40707],{},"Video URL expiry:"," EvoLink video URLs expire after 24 hours — download or cache them immediately. Plan your pipeline accordingly.",[38646,40710,40711],{"type":21870},[11,40712,40713,2424,40716,40719],{},[23,40714,40715],{},"Run this comparison yourself.",[37,40717,40718],{"href":16482},"Get your EvoLink API key"," and test with your own prompts. The code above works out of the box.",[48,40721,40723],{"id":40722},"pricing-breakdown","Pricing Breakdown",[11,40725,40726],{},"Cost per 15-second video at default settings, as of February 2026:",[92,40728,40730],{"id":40729},"sora-2-via-openai-evolink","Sora 2 (via OpenAI / EvoLink)",[2035,40732,40733,40744],{},[2038,40734,40735],{},[2041,40736,40737,40739,40741],{},[2044,40738,38726],{},[2044,40740,18341],{"align":13819},[2044,40742,40743],{"align":13819},"Price per video",[2051,40745,40746,40757,40768,40780],{},[2041,40747,40748,40750,40752],{},[2056,40749,1786],{},[2056,40751,4073],{"align":13819},[2056,40753,40754],{"align":13819},[23,40755,40756],{},"$0.50",[2041,40758,40759,40761,40763],{},[2056,40760,1786],{},[2056,40762,4076],{"align":13819},[2056,40764,40765],{"align":13819},[23,40766,40767],{},"$1.00",[2041,40769,40770,40772,40775],{},[2056,40771,1786],{},[2056,40773,40774],{"align":13819},"12s",[2056,40776,40777],{"align":13819},[23,40778,40779],{},"$1.20",[2041,40781,40782,40784,40787],{},[2056,40783,1786],{},[2056,40785,40786],{"align":13819},"20s",[2056,40788,40789],{"align":13819},[23,40790,40791],{},"$2.00",[11,40793,40794,40795,40798,40799,40802],{},"That works out to ",[23,40796,40797],{},"$0.10/second"," at 720p standard tier. Our 15-second test videos cost approximately ",[23,40800,40801],{},"$1.50 each"," on Sora 2.",[11,40804,40805],{},[2621,40806,40807,40808,40813],{},"Source: ",[37,40809,40812],{"href":40810,"rel":40811},"https://seedance2api.app/pricing",[41],"seedance2api.app/pricing",", as of Feb 2026",[92,40815,40817],{"id":40816},"seedance-20-via-evolink","Seedance 2.0 (via EvoLink)",[11,40819,40820,40823],{},[23,40821,40822],{},"Pricing coming soon."," Seedance 2.0 pricing will be announced at launch. The model supports 480p, 720p, and 1080p output with optional audio generation.",[11,40825,40826],{},"For context, here's how it stacks up against other models in the market:",[2035,40828,40829,40844],{},[2038,40830,40831],{},[2041,40832,40833,40835,40838,40841],{},[2044,40834,38981],{},[2044,40836,40837],{"align":13819},"Cost per second",[2044,40839,40840],{"align":13819},"Est. cost per video",[2044,40842,40843],{"align":13819},"Max resolution",[2051,40845,40846,40857,40870,40884],{},[2041,40847,40848,40850,40853,40855],{},[2056,40849,17406],{},[2056,40851,40852],{"align":13819},"Coming soon",[2056,40854,40852],{"align":13819},[2056,40856,1794],{"align":13819},[2041,40858,40859,40861,40864,40867],{},[2056,40860,38719],{},[2056,40862,40863],{"align":13819},"$0.10 (720p)",[2056,40865,40866],{"align":13819},"$1.20 / 12s",[2056,40868,40869],{"align":13819},"720p (Std) / 1080p (Pro)",[2041,40871,40872,40875,40878,40881],{},[2056,40873,40874],{},"Kling 3.0",[2056,40876,40877],{"align":13819},"$0.112 (1080p)",[2056,40879,40880],{"align":13819},"$1.12 / 10s",[2056,40882,40883],{"align":13819},"4K",[2041,40885,40886,40889,40892,40895],{},[2056,40887,40888],{},"Veo 3.1",[2056,40890,40891],{"align":13819},"$0.40 (1080p)",[2056,40893,40894],{"align":13819},"$3.20 / 8s",[2056,40896,40883],{"align":13819},[11,40898,40899],{},[2621,40900,40807,40901],{},[37,40902,40812],{"href":40810,"rel":40903},[41],[11,40905,40906,40909],{},[37,40907,40908],{"href":16482},"Get early access"," to lock in launch pricing when it's announced.",[92,40911,40913],{"id":40912},"cost-considerations","Cost Considerations",[97,40915,40916,40922,40928,40934,40944,40950],{},[73,40917,40918,40921],{},[23,40919,40920],{},"Resolution tradeoff:"," Seedance at 720p costs less than Sora at 1080p, but delivers 60fps vs 30fps. Depending on your use case, the higher frame rate may be more valuable than the higher resolution.",[73,40923,40924,40927],{},[23,40925,40926],{},"Audio bundling:"," Both models can generate synchronized audio. Factor this into your per-video cost if you'd otherwise need separate audio generation.",[73,40929,40930,40933],{},[23,40931,40932],{},"Volume matters:"," For production workloads generating hundreds of videos, even small per-second differences compound. Test both with your actual prompts before committing.",[73,40935,40936,40939,40940,40943],{},[23,40937,40938],{},"Intellectual property:"," Seedance 2.0 outputs include ",[37,40941,40942],{"href":9208},"commercial usage rights"," — verify the latest terms for your use case.",[73,40945,40946,40949],{},[23,40947,40948],{},"Hidden costs:"," Don't forget bandwidth, storage, and post-processing. Sora's higher resolution means larger file sizes (~2× per frame). If you're serving these videos to end users, CDN costs scale with file size. Seedance's 60fps means more frames per second but at lower resolution, resulting in comparable file sizes.",[73,40951,40952,40955,40956,40959],{},[23,40953,40954],{},"Free tier testing:"," Before committing to either API for production, run your actual prompts through both. The results from these three prompts may not generalize to your specific content domain. EvoLink offers a ",[37,40957,40958],{"href":16482},"free API key"," to get started with Seedance testing.",[48,40961,40963],{"id":40962},"when-to-choose-which","When to Choose Which",[11,40965,40966],{},"Picking a model isn't about \"which is better\" — it's about matching capabilities to your specific use case.",[92,40968,40970],{"id":40969},"choose-seedance-20-when","Choose Seedance 2.0 when:",[97,40972,40973,40979,40985,40991,40999,41005],{},[73,40974,40975,40978],{},[23,40976,40977],{},"Dynamic human content"," — dance, sports, action, fitness. The anatomy accuracy gap (8.5 vs 6.5 in our test) is significant.",[73,40980,40981,40984],{},[23,40982,40983],{},"Slow-motion or high-motion content"," — 60fps makes a visible difference in ads, product demos, and cinematic sequences.",[73,40986,40987,40990],{},[23,40988,40989],{},"Character close-ups"," — facial detail and micro-expression rendering are more convincing, especially for elderly or highly detailed faces.",[73,40992,40993,40996,40997,4516],{},[23,40994,40995],{},"Multimodal workflows"," — you need to combine reference images, videos, and audio in a single generation using the ",[37,40998,39711],{"href":2969},[73,41000,41001,41004],{},[23,41002,41003],{},"Rich environment scenes"," — Seedance builds more detailed, \"lived-in\" environments with more props and depth layers.",[73,41006,41007,41010],{},[23,41008,41009],{},"Flexible aspect ratios"," — 21:9 ultrawide and 4:3 formats aren't available on Sora.",[92,41012,41014],{"id":41013},"choose-sora-2-when","Choose Sora 2 when:",[97,41016,41017,41023,41029,41035],{},[73,41018,41019,41022],{},[23,41020,41021],{},"Maximum resolution matters"," — if your output will be displayed at 1080p+ or screenshotted/paused frequently, Sora's higher pixel count wins.",[73,41024,41025,41028],{},[23,41026,41027],{},"Object destruction physics"," — fracture detail on breaking objects is more convincing (uneven thickness, visible internal material layers).",[73,41030,41031,41034],{},[23,41032,41033],{},"Static or slow-moving scenes"," — when the 60fps advantage doesn't apply, Sora's resolution advantage is uncontested.",[73,41036,41037,41040],{},[23,41038,41039],{},"Existing OpenAI integration"," — if your stack already uses the OpenAI SDK, adding Sora requires minimal new infrastructure.",[92,41042,41044],{"id":41043},"the-hybrid-approach","The hybrid approach",[11,41046,41047],{},"For production pipelines, consider using both. Generate character/motion content with Seedance 2.0 and object/environment establishing shots with Sora 2. Both APIs follow standard REST patterns, making it straightforward to route prompts based on content type.",[11,41049,41050],{},"A simple routing heuristic based on our test results:",[137,41052,41054],{"className":338,"code":41053,"language":340,"meta":142,"style":142},"def choose_model(prompt: str, needs_pause_quality: bool = False) -> str:\n    \"\"\"Route to the better model based on content type.\"\"\"\n    motion_keywords = [\"dance\", \"run\", \"fight\", \"sport\", \"action\", \"slow motion\", \"jump\"]\n    face_keywords = [\"close-up\", \"expression\", \"portrait\", \"face\", \"emotion\", \"elderly\"]\n    \n    prompt_lower = prompt.lower()\n    \n    if any(kw in prompt_lower for kw in motion_keywords):\n        return \"seedance-2.0\"  # Better anatomy + 60fps\n    if any(kw in prompt_lower for kw in face_keywords):\n        return \"seedance-2.0\"  # Better facial detail\n    if needs_pause_quality:\n        return \"sora\"          # Higher resolution for screenshots\n    return \"seedance-2.0\"      # Default to higher overall score\n",[28,41055,41056,41084,41089,41133,41172,41176,41184,41188,41213,41223,41244,41253,41260,41270],{"__ignoreMap":142},[146,41057,41058,41060,41063,41065,41067,41070,41073,41075,41078,41080,41082],{"class":148,"line":149},[146,41059,526],{"class":259},[146,41061,41062],{"class":152}," choose_model",[146,41064,15844],{"class":263},[146,41066,8674],{"class":156},[146,41068,41069],{"class":263},", needs_pause_quality: ",[146,41071,41072],{"class":156},"bool",[146,41074,391],{"class":259},[146,41076,41077],{"class":156}," False",[146,41079,15849],{"class":263},[146,41081,8674],{"class":156},[146,41083,860],{"class":263},[146,41085,41086],{"class":148,"line":167},[146,41087,41088],{"class":160},"    \"\"\"Route to the better model based on content type.\"\"\"\n",[146,41090,41091,41094,41096,41098,41101,41103,41106,41108,41111,41113,41116,41118,41121,41123,41126,41128,41131],{"class":148,"line":179},[146,41092,41093],{"class":263},"    motion_keywords ",[146,41095,267],{"class":259},[146,41097,8194],{"class":263},[146,41099,41100],{"class":160},"\"dance\"",[146,41102,400],{"class":263},[146,41104,41105],{"class":160},"\"run\"",[146,41107,400],{"class":263},[146,41109,41110],{"class":160},"\"fight\"",[146,41112,400],{"class":263},[146,41114,41115],{"class":160},"\"sport\"",[146,41117,400],{"class":263},[146,41119,41120],{"class":160},"\"action\"",[146,41122,400],{"class":263},[146,41124,41125],{"class":160},"\"slow motion\"",[146,41127,400],{"class":263},[146,41129,41130],{"class":160},"\"jump\"",[146,41132,764],{"class":263},[146,41134,41135,41138,41140,41142,41145,41147,41150,41152,41155,41157,41160,41162,41165,41167,41170],{"class":148,"line":188},[146,41136,41137],{"class":263},"    face_keywords ",[146,41139,267],{"class":259},[146,41141,8194],{"class":263},[146,41143,41144],{"class":160},"\"close-up\"",[146,41146,400],{"class":263},[146,41148,41149],{"class":160},"\"expression\"",[146,41151,400],{"class":263},[146,41153,41154],{"class":160},"\"portrait\"",[146,41156,400],{"class":263},[146,41158,41159],{"class":160},"\"face\"",[146,41161,400],{"class":263},[146,41163,41164],{"class":160},"\"emotion\"",[146,41166,400],{"class":263},[146,41168,41169],{"class":160},"\"elderly\"",[146,41171,764],{"class":263},[146,41173,41174],{"class":148,"line":373},[146,41175,563],{"class":263},[146,41177,41178,41180,41182],{"class":148,"line":379},[146,41179,15863],{"class":263},[146,41181,267],{"class":259},[146,41183,15868],{"class":263},[146,41185,41186],{"class":148,"line":385},[146,41187,563],{"class":263},[146,41189,41190,41192,41195,41198,41200,41203,41205,41208,41210],{"class":148,"line":409},[146,41191,2508],{"class":259},[146,41193,41194],{"class":156}," any",[146,41196,41197],{"class":263},"(kw ",[146,41199,1180],{"class":259},[146,41201,41202],{"class":263}," prompt_lower ",[146,41204,8231],{"class":259},[146,41206,41207],{"class":263}," kw ",[146,41209,1180],{"class":259},[146,41211,41212],{"class":263}," motion_keywords):\n",[146,41214,41215,41217,41220],{"class":148,"line":420},[146,41216,7196],{"class":259},[146,41218,41219],{"class":160}," \"seedance-2.0\"",[146,41221,41222],{"class":175},"  # Better anatomy + 60fps\n",[146,41224,41225,41227,41229,41231,41233,41235,41237,41239,41241],{"class":148,"line":431},[146,41226,2508],{"class":259},[146,41228,41194],{"class":156},[146,41230,41197],{"class":263},[146,41232,1180],{"class":259},[146,41234,41202],{"class":263},[146,41236,8231],{"class":259},[146,41238,41207],{"class":263},[146,41240,1180],{"class":259},[146,41242,41243],{"class":263}," face_keywords):\n",[146,41245,41246,41248,41250],{"class":148,"line":455},[146,41247,7196],{"class":259},[146,41249,41219],{"class":160},[146,41251,41252],{"class":175},"  # Better facial detail\n",[146,41254,41255,41257],{"class":148,"line":466},[146,41256,2508],{"class":259},[146,41258,41259],{"class":263}," needs_pause_quality:\n",[146,41261,41262,41264,41267],{"class":148,"line":600},[146,41263,7196],{"class":259},[146,41265,41266],{"class":160}," \"sora\"",[146,41268,41269],{"class":175},"          # Higher resolution for screenshots\n",[146,41271,41272,41274,41276],{"class":148,"line":605},[146,41273,1703],{"class":259},[146,41275,41219],{"class":160},[146,41277,41278],{"class":175},"      # Default to higher overall score\n",[11,41280,41281],{},"This is intentionally simplistic — your production router would use more sophisticated classification. But the principle holds: match the model to the content's primary requirement.",[92,41283,41285],{"id":41284},"what-about-other-models","What about other models?",[11,41287,41288],{},"This comparison focused exclusively on Seedance 2.0 and Sora 2 because they represent the current production-grade tier of AI video APIs. Other models like Runway Gen-3, Pika, and Kling are viable alternatives but weren't included in this specific test. We may cover broader comparisons in future articles.",[48,41290,13302],{"id":13301},[92,41292,41294],{"id":41293},"is-seedance-20-better-than-sora-2","Is Seedance 2.0 better than Sora 2?",[11,41296,41297],{},"In our tests, Seedance 2.0 scored higher overall (8.5 vs 8.0), with particular strengths in human anatomy accuracy, motion fluidity (60fps), lighting, and facial detail. Sora 2 wins on resolution and object fracture physics. Neither is universally \"better\" — it depends on your content type.",[92,41299,41301],{"id":41300},"can-i-access-seedance-20-through-an-api","Can I access Seedance 2.0 through an API?",[11,41303,41304,41305,41309,41310,4516],{},"Yes. Seedance 2.0 is available through the ",[37,41306,41308],{"href":16161,"rel":41307},[41],"EvoLink API"," with standard REST endpoints. It supports text-to-video, image-to-video, and video-to-video generation. ",[37,41311,41312],{"href":16482},"Get an API key here",[92,41314,41316],{"id":41315},"whats-the-actual-output-quality-difference-at-720p","What's the actual output quality difference at 720p?",[11,41318,41319],{},"At matched 720p resolution, Seedance delivers 60fps while Sora delivers 30fps. This means Seedance produces twice as many frames per second, resulting in noticeably smoother motion — especially in fast-moving scenes. For static content, the visual quality is comparable at the same resolution.",[92,41321,41323],{"id":41322},"do-both-models-generate-audio","Do both models generate audio?",[11,41325,41326,41327,41329],{},"Yes. Both Seedance 2.0 and Sora 2 can generate synchronized audio including voice, sound effects, and background music. Seedance allows you to control audio generation with a ",[28,41328,1822],{}," parameter and can align output to reference audio tracks via the @Audio tag.",[92,41331,41333],{"id":41332},"which-model-is-more-cost-effective-for-production-use","Which model is more cost-effective for production use?",[11,41335,41336,41337,41340],{},"It depends on volume and content type. Sora 2 standard tier costs $0.10/second for 720p — a 15-second video runs about $1.50. Seedance 2.0 pricing hasn't been announced yet (coming at launch). Check ",[37,41338,40812],{"href":40810,"rel":41339},[41]," for the latest. If your content is motion-heavy, Seedance's 60fps at 720p may deliver better perceived quality per dollar than Sora's 30fps at the same resolution.",[92,41342,41344],{"id":41343},"can-i-use-seedance-20-outputs-commercially","Can I use Seedance 2.0 outputs commercially?",[11,41346,41347,41348,41351],{},"Seedance 2.0 outputs through the EvoLink API include commercial usage rights, but terms vary. Read our ",[37,41349,41350],{"href":9208},"detailed copyright and licensing guide"," for the full breakdown of what's allowed, including monetization on YouTube, use in client work, and redistribution rights. Always verify the latest terms before production deployment.",[45,41353],{},[48,41355,41357],{"id":41356},"final-scores","Final Scores",[2035,41359,41360,41370],{},[2038,41361,41362],{},[2041,41363,41364,41366,41368],{},[2044,41365,38809],{},[2044,41367,17406],{"align":13819},[2044,41369,38719],{"align":13819},[2051,41371,41372,41382,41391,41401,41411,41420],{},[2041,41373,41374,41376,41379],{},[2056,41375,38822],{},[2056,41377,41378],{"align":13819},"8.7",[2056,41380,41381],{"align":13819},"8.3",[2041,41383,41384,41386,41388],{},[2056,41385,38833],{},[2056,41387,41381],{"align":13819},[2056,41389,41390],{"align":13819},"7.8",[2041,41392,41393,41396,41398],{},[2056,41394,41395],{},"Physics/Anatomy Realism",[2056,41397,39018],{"align":13819},[2056,41399,41400],{"align":13819},"7.3",[2041,41402,41403,41405,41408],{},[2056,41404,38855],{},[2056,41406,41407],{"align":13819},"9.2",[2056,41409,41410],{"align":13819},"8.8",[2041,41412,41413,41416,41418],{},[2056,41414,41415],{},"Motion Fluidity",[2056,41417,39004],{"align":13819},[2056,41419,41390],{"align":13819},[2041,41421,41422,41427,41431],{},[2056,41423,41424],{},[23,41425,41426],{},"Overall",[2056,41428,41429],{"align":13819},[23,41430,39004],{},[2056,41432,41433],{"align":13819},[23,41434,39018],{},[11,41436,41437],{},"Both models represent the state of the art in AI video generation as of early 2026. Neither can generate floating dust particles. Neither produces perfect hands every time. But for production API use, these results should guide your model selection based on what you're actually building.",[11,41439,41440,41441,41445,41446,4516],{},"For the latest on Seedance model capabilities, see the official ",[37,41442,41444],{"href":38633,"rel":41443},[41],"ByteDance Seed research page",". For Sora documentation and updates, refer to ",[37,41447,41450],{"href":41448,"rel":41449},"https://platform.openai.com/docs",[41],"OpenAI's official platform docs",[38646,41452,41454],{"type":41453},"primary",[11,41455,41456,2424,41459,41462],{},[23,41457,41458],{},"Start building with Seedance 2.0.",[37,41460,41461],{"href":16482},"Get your free EvoLink API key"," and generate your first video in under a minute.",[11222,41464,41465],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":142,"searchDepth":167,"depth":167,"links":41467},[41468,41469,41474,41479,41484,41485,41489,41494,41500,41508],{"id":38660,"depth":167,"text":38661},{"id":38781,"depth":167,"text":38782,"children":41470},[41471,41472,41473],{"id":38795,"depth":179,"text":17406},{"id":38879,"depth":179,"text":38719},{"id":38951,"depth":179,"text":38952},{"id":39041,"depth":167,"text":39042,"children":41475},[41476,41477,41478],{"id":39054,"depth":179,"text":17406},{"id":39133,"depth":179,"text":38719},{"id":39210,"depth":179,"text":39211},{"id":39300,"depth":167,"text":39301,"children":41480},[41481,41482,41483],{"id":39313,"depth":179,"text":17406},{"id":39386,"depth":179,"text":38719},{"id":39453,"depth":179,"text":39454},{"id":39543,"depth":167,"text":39544},{"id":39742,"depth":167,"text":39743,"children":41486},[41487,41488],{"id":39749,"depth":179,"text":39750},{"id":40479,"depth":179,"text":40480},{"id":40722,"depth":167,"text":40723,"children":41490},[41491,41492,41493],{"id":40729,"depth":179,"text":40730},{"id":40816,"depth":179,"text":40817},{"id":40912,"depth":179,"text":40913},{"id":40962,"depth":167,"text":40963,"children":41495},[41496,41497,41498,41499],{"id":40969,"depth":179,"text":40970},{"id":41013,"depth":179,"text":41014},{"id":41043,"depth":179,"text":41044},{"id":41284,"depth":179,"text":41285},{"id":13301,"depth":167,"text":13302,"children":41501},[41502,41503,41504,41505,41506,41507],{"id":41293,"depth":179,"text":41294},{"id":41300,"depth":179,"text":41301},{"id":41315,"depth":179,"text":41316},{"id":41322,"depth":179,"text":41323},{"id":41332,"depth":179,"text":41333},{"id":41343,"depth":179,"text":41344},{"id":41356,"depth":167,"text":41357},"Seedance 2.0과 Sora 2를 동일한 프롬프트로 테스트했습니다. 실제 출력 비교, 프레임별 분석, API 코드, 가격 분석을 확인하세요.",{"head":41511,"slug":41518,"date":41519,"image":41520,"tags":41521,"keywords":41527},{"meta":41512},[41513,41516],{"name":41514,"content":41515},"og:title","Seedance 2.0 vs Sora 2 API: 나란히 비교 테스트 | 2026",{"name":41517,"content":41509},"og:description","seedance-2-vs-sora-2-api-comparison","2026-02-24","/seedance2-vs-sora2-hero.png",[41522,41523,41524,41525,41526],"seedance 2.0","sora 2","ai video api","api 비교","비디오 생성",[41528,41529,41530],"seedance 2.0 vs sora 2","seedance vs sora api","ai 비디오 api 비교","/ko/blog/seedance-2-vs-sora-2-api-comparison",{"title":38620,"description":41509},"ko/blog/seedance-2-vs-sora-2-api-comparison","hQmyPHEMQCqPnHhIuITuP3EvpocKMVPUhS43_lwgwCs",1775067557823]