[{"data":1,"prerenderedAt":41358},["ShallowReactive",2],{"blog-list-es":3},[4,11079,13291,17186,22913,30225,31995,38438],{"id":5,"title":6,"body":7,"description":11068,"extension":11069,"meta":11070,"navigation":58,"path":11075,"seo":11076,"stem":11077,"__hash__":11078},"content/es/blog/seedance-2-api-tutorial-python.md","Tutorial de API de Seedance 2.0: De Cero a Su Primer Video con IA (Python)",{"type":8,"value":9,"toc":11011},"minimark",[10,14,17,32,44,47,52,55,66,69,91,96,124,127,200,202,206,215,218,246,249,270,273,284,295,311,313,317,324,1548,1551,1641,1644,1656,1660,1667,1845,1848,1970,1984,1988,1994,2002,2005,2013,2021,2028,2030,2034,2041,2077,2080,2084,2090,2160,2164,2170,2176,2237,2248,2252,2255,2382,2396,2403,2413,2415,2419,2431,2437,2699,2702,2751,2755,2783,2786,2868,2871,3023,3029,3033,3087,3097,3105,3109,3112,3191,3198,3200,3204,3207,3427,3454,3458,3463,3467,3558,3567,3572,3667,3674,3679,3767,3772,3847,3864,3868,3871,3942,3955,3973,3975,3979,3982,3986,3989,4047,4070,4073,4078,4121,4128,4133,4187,4193,4198,4250,4260,4265,4317,4333,4338,4381,4387,4392,4446,4452,4457,4500,4503,4508,4551,4554,4559,4613,4619,4623,4833,4837,4840,4844,5588,5591,5623,5630,5634,5637,6217,6228,6230,6234,6241,6245,6251,6256,6414,6420,6424,6486,6490,6493,7650,7653,7676,7679,7707,7711,7720,7768,7771,7777,7782,7829,7844,7848,7851,8023,8027,8106,8113,8115,8119,8122,8127,8677,8680,8702,8704,8708,8711,8715,8755,8759,8782,8786,8789,8821,8831,8833,8837,8841,8847,8851,8857,8861,8867,8871,8882,8886,8900,8904,8914,8918,8933,8937,8944,8948,8964,8968,8976,8978,8982,8985,10985,10999,11007],[11,12,13],"p",{},"Seedance 2.0 es el modelo de video con IA más avanzado de ByteDance — referencias multimodales, audio nativo, control de cámara cinematográfico y generación de 4 a 15 segundos en hasta 1080p. Este tutorial le guía a través de todo el flujo de trabajo de la API en Python: desde obtener su clave API hasta descargar su primer video generado.",[11,15,16],{},"Al finalizar, tendrá código funcional para texto a video, imagen a video, polling asíncrono, manejo de webhooks y recuperación de errores. Cada ejemplo de código aquí fue probado contra una API en vivo.",[18,19,20],"blockquote",{},[11,21,22,26,27,31],{},[23,24,25],"strong",{},"Nota — Seedance 2.0 vs 1.5:"," Seedance 2.0 se está implementando progresivamente. Puede probar el flujo de trabajo completo ahora mismo usando ",[28,29,30],"code",{},"seedance-1.5-pro"," — cuando 2.0 esté completamente disponible, solo cambie el nombre del modelo. Todos los endpoints, parámetros y formatos de respuesta son idénticos. Las diferencias clave en 2.0: referencias multimodales (mezcle imágenes, videos y audio como entradas), generación de audio nativo, simulación de física mejorada y capacidades de edición de video. Todo en este tutorial funciona con ambas versiones.",[11,33,34],{},[23,35,36,43],{},[37,38,42],"a",{"href":39,"rel":40},"https://evolink.ai/early-access",[41],"nofollow","Obtenga su clave API gratuita"," para seguir el tutorial.",[45,46],"hr",{},[48,49,51],"h2",{"id":50},"qué-construirá-y-qué-necesita","Qué Construirá (y Qué Necesita)",[11,53,54],{},"Así se ve un video generado por Seedance — creado con una sola llamada a la 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],{},"En este tutorial, escribirá código Python que:",[70,71,72,76,79,82,85,88],"ol",{},[73,74,75],"li",{},"Envía un prompt de texto → recibe un video generado",[73,77,78],{},"Envía una imagen → la anima en un video",[73,80,81],{},"Realiza polling de resultados de forma asíncrona",[73,83,84],{},"Maneja errores y reintentos como código de producción",[73,86,87],{},"Recibe resultados vía webhook (sin necesidad de polling)",[73,89,90],{},"Cancela tareas en progreso cuando sea necesario",[92,93,95],"h3",{"id":94},"requisitos-previos","Requisitos Previos",[97,98,99,109,118],"ul",{},[73,100,101,104,105,108],{},[23,102,103],{},"Python 3.8+"," (verifique con ",[28,106,107],{},"python3 --version",")",[73,110,111,114,115,108],{},[23,112,113],{},"Biblioteca requests"," (",[28,116,117],{},"pip install requests",[73,119,120,123],{},[23,121,122],{},"Una clave API de EvoLink"," (registro gratuito — obtendremos esto en la siguiente sección)",[11,125,126],{},"Sin GPU, sin Docker, sin configuración compleja. Solo Python y una clave API.",[18,128,129,135],{},[11,130,131,134],{},[23,132,133],{},"Consejo Profesional:"," Si está construyendo una aplicación de producción, considere usar un entorno virtual para aislar dependencias:",[136,137,142],"pre",{"className":138,"code":139,"language":140,"meta":141,"style":141},"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,143,144,164,176,185],{"__ignoreMap":141},[145,146,149,153,157,161],"span",{"class":147,"line":148},"line",1,[145,150,152],{"class":151},"svObZ","python3",[145,154,156],{"class":155},"sDLfK"," -m",[145,158,160],{"class":159},"sU2Wk"," venv",[145,162,163],{"class":159}," seedance-env\n",[145,165,167,169,172],{"class":147,"line":166},2,[145,168,62],{"class":155},[145,170,171],{"class":159}," seedance-env/bin/activate",[145,173,175],{"class":174},"sAwPA","  # macOS/Linux\n",[145,177,179,182],{"class":147,"line":178},3,[145,180,181],{"class":151},"seedance-env\\Scripts\\activate",[145,183,184],{"class":174},"     # Windows\n",[145,186,188,191,194,197],{"class":147,"line":187},4,[145,189,190],{"class":151},"pip",[145,192,193],{"class":159}," install",[145,195,196],{"class":159}," requests",[145,198,199],{"class":159}," flask\n",[45,201],{},[48,203,205],{"id":204},"obtenga-su-clave-api","Obtenga Su Clave API",[11,207,208,209,214],{},"Seedance 2.0 está disponible a través de ",[37,210,213],{"href":211,"rel":212},"https://evolink.ai",[41],"EvoLink",", un gateway de API que proporciona acceso unificado a múltiples modelos de video con IA — incluyendo Seedance 2.0, Kling y otros — a través de una sola clave API.",[11,216,217],{},"Así es como comenzar:",[70,219,220,228,234,240],{},[73,221,222,223,227],{},"Vaya a ",[37,224,226],{"href":39,"rel":225},[41],"evolink.ai/early-access"," y cree una cuenta",[73,229,230,231],{},"Navegue a ",[23,232,233],{},"Dashboard → API Keys",[73,235,236,237],{},"Haga clic en ",[23,238,239],{},"Create New Key",[73,241,242,243],{},"Copie su clave — comienza con ",[28,244,245],{},"sk-",[11,247,248],{},"Almacene su clave de forma segura. No la suba al control de versiones. Usaremos una variable de entorno:",[136,250,252],{"className":138,"code":251,"language":140,"meta":141,"style":141},"export EVOLINK_API_KEY=\"sk-your-api-key-here\"\n",[28,253,254],{"__ignoreMap":141},[145,255,256,260,264,267],{"class":147,"line":148},[145,257,259],{"class":258},"snl16","export",[145,261,263],{"class":262},"s95oV"," EVOLINK_API_KEY",[145,265,266],{"class":258},"=",[145,268,269],{"class":159},"\"sk-your-api-key-here\"\n",[11,271,272],{},"En Windows (PowerShell):",[136,274,278],{"className":275,"code":276,"language":277,"meta":141,"style":141},"language-powershell shiki shiki-themes github-dark","$env:EVOLINK_API_KEY=\"sk-your-api-key-here\"\n","powershell",[28,279,280],{"__ignoreMap":141},[145,281,282],{"class":147,"line":148},[145,283,276],{},[11,285,286,287,290,291,294],{},"Para hacerlo permanente, agregue la línea a su ",[28,288,289],{},"~/.bashrc",", ",[28,292,293],{},"~/.zshrc"," o perfil de PowerShell.",[18,296,297],{},[11,298,299,302,303,306,307,310],{},[23,300,301],{},"Seguridad:"," Nunca incluya claves API directamente en su código fuente. Use variables de entorno, archivos ",[28,304,305],{},".env"," (con ",[28,308,309],{},"python-dotenv","), o servicios de gestión de secretos como AWS Secrets Manager o HashiCorp Vault para aplicaciones de producción.",[45,312],{},[48,314,316],{"id":315},"su-primer-video-texto-a-video","Su Primer Video: Texto a Video",[11,318,319,320,323],{},"Comencemos con el caso de uso más simple: enviar un prompt de texto y obtener un video. Cree un nuevo archivo llamado ",[28,321,322],{},"seedance_tutorial.py",":",[136,325,329],{"className":326,"code":327,"language":328,"meta":141,"style":141},"language-python shiki shiki-themes github-dark","import os\nimport time\nimport requests\n\n# Configuración de la API\nBASE_URL = \"https://api.seedance2api.app/v1\"\nAPI_KEY = os.environ.get(\"EVOLINK_API_KEY\")\n\nif not API_KEY:\n    raise ValueError(\"EVOLINK_API_KEY no está configurada. Ejecute: export EVOLINK_API_KEY='sk-...'\")\n\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\ndef wait_for_video(task_id, poll_interval=10):\n    \"\"\"Realiza polling de una tarea hasta que se complete o falle.\"\"\"\n    start_time = time.time()\n\n    while True:\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\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        elapsed = int(time.time() - start_time)\n\n        print(f\"  [{elapsed}s] Estado: {status} | Progreso: {progress}%\")\n\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            error_msg = task.get(\"error\", {}).get(\"message\", \"Error desconocido\")\n            raise Exception(f\"La tarea falló: {error_msg}\")\n\n        time.sleep(poll_interval)\n\n\ndef download_video(url, filename):\n    \"\"\"Descarga un video desde una URL a un archivo local.\"\"\"\n    print(f\"Descargando video a {filename}...\")\n    response = requests.get(url, stream=True)\n    response.raise_for_status()\n\n    with open(filename, \"wb\") as f:\n        for chunk in response.iter_content(chunk_size=8192):\n            f.write(chunk)\n\n    size_kb = os.path.getsize(filename) / 1024\n    print(f\"Guardado: {filename} ({size_kb:.0f} KB)\")\n\n\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",          # El modelo de IA a usar\n        \"prompt\": (\n            \"Un cachorro golden retriever persigue una mariposa a través \"\n            \"de un prado iluminado por el sol. La cámara sigue al cachorro con un \"\n            \"plano de seguimiento suave mientras las flores silvestres se mecen con la brisa.\"\n        ),\n        \"duration\": 5,                     # Duración del video: 4-15 segundos\n        \"quality\": \"720p\",                 # Resolución: 480p, 720p, 1080p\n        \"aspect_ratio\": \"16:9\",            # Pantalla ancha estándar\n        \"generate_audio\": True             # La IA genera audio coincidente\n    }\n\n    print(\"Enviando solicitud de texto a video...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",  # El endpoint de generación de video\n        headers=HEADERS,                   # Headers de autenticación + content-type\n        json=payload                       # Serializa automáticamente a JSON\n    )\n    response.raise_for_status()            # Lanza excepción si no es 200 OK\n    task = response.json()                 # Parsea la respuesta JSON\n\n    # Registra información clave de la respuesta\n    print(f\"Tarea creada: {task['id']}\")\n    print(f\"Tiempo estimado: {task['task_info']['estimated_time']}s\")\n    print(f\"Créditos reservados: {task['usage']['credits_reserved']}\")\n\n    # Realiza polling hasta que el video esté listo\n    result = wait_for_video(task[\"id\"])\n\n    # El array results contiene una o más URLs de video\n    video_url = result[\"results\"][0]\n    print(f\"\\nURL del video: {video_url}\")\n    download_video(video_url, \"mi_primer_video.mp4\")\n\n    return result\n\n\nif __name__ == \"__main__\":\n    text_to_video()\n","python",[28,330,331,339,346,353,358,364,376,393,398,413,430,435,446,470,481,487,492,497,517,523,534,539,550,561,588,600,606,612,623,628,645,666,686,691,736,741,758,767,782,808,835,840,846,851,856,867,873,898,919,925,930,954,979,985,990,1007,1042,1047,1052,1063,1073,1090,1099,1105,1111,1117,1123,1140,1157,1174,1187,1193,1198,1210,1220,1239,1255,1269,1275,1284,1298,1303,1309,1338,1372,1404,1409,1415,1432,1437,1443,1463,1491,1502,1507,1516,1521,1526,1542],{"__ignoreMap":141},[145,332,333,336],{"class":147,"line":148},[145,334,335],{"class":258},"import",[145,337,338],{"class":262}," os\n",[145,340,341,343],{"class":147,"line":166},[145,342,335],{"class":258},[145,344,345],{"class":262}," time\n",[145,347,348,350],{"class":147,"line":178},[145,349,335],{"class":258},[145,351,352],{"class":262}," requests\n",[145,354,355],{"class":147,"line":187},[145,356,357],{"emptyLinePlaceholder":58},"\n",[145,359,361],{"class":147,"line":360},5,[145,362,363],{"class":174},"# Configuración de la API\n",[145,365,367,370,373],{"class":147,"line":366},6,[145,368,369],{"class":155},"BASE_URL",[145,371,372],{"class":258}," =",[145,374,375],{"class":159}," \"https://api.seedance2api.app/v1\"\n",[145,377,379,382,384,387,390],{"class":147,"line":378},7,[145,380,381],{"class":155},"API_KEY",[145,383,372],{"class":258},[145,385,386],{"class":262}," os.environ.get(",[145,388,389],{"class":159},"\"EVOLINK_API_KEY\"",[145,391,392],{"class":262},")\n",[145,394,396],{"class":147,"line":395},8,[145,397,357],{"emptyLinePlaceholder":58},[145,399,401,404,407,410],{"class":147,"line":400},9,[145,402,403],{"class":258},"if",[145,405,406],{"class":258}," not",[145,408,409],{"class":155}," API_KEY",[145,411,412],{"class":262},":\n",[145,414,416,419,422,425,428],{"class":147,"line":415},10,[145,417,418],{"class":258},"    raise",[145,420,421],{"class":155}," ValueError",[145,423,424],{"class":262},"(",[145,426,427],{"class":159},"\"EVOLINK_API_KEY no está configurada. Ejecute: export EVOLINK_API_KEY='sk-...'\"",[145,429,392],{"class":262},[145,431,433],{"class":147,"line":432},11,[145,434,357],{"emptyLinePlaceholder":58},[145,436,438,441,443],{"class":147,"line":437},12,[145,439,440],{"class":155},"HEADERS",[145,442,372],{"class":258},[145,444,445],{"class":262}," {\n",[145,447,449,452,455,458,461,464,467],{"class":147,"line":448},13,[145,450,451],{"class":159},"    \"Authorization\"",[145,453,454],{"class":262},": ",[145,456,457],{"class":258},"f",[145,459,460],{"class":159},"\"Bearer ",[145,462,463],{"class":155},"{API_KEY}",[145,465,466],{"class":159},"\"",[145,468,469],{"class":262},",\n",[145,471,473,476,478],{"class":147,"line":472},14,[145,474,475],{"class":159},"    \"Content-Type\"",[145,477,454],{"class":262},[145,479,480],{"class":159},"\"application/json\"\n",[145,482,484],{"class":147,"line":483},15,[145,485,486],{"class":262},"}\n",[145,488,490],{"class":147,"line":489},16,[145,491,357],{"emptyLinePlaceholder":58},[145,493,495],{"class":147,"line":494},17,[145,496,357],{"emptyLinePlaceholder":58},[145,498,500,503,506,509,511,514],{"class":147,"line":499},18,[145,501,502],{"class":258},"def",[145,504,505],{"class":151}," wait_for_video",[145,507,508],{"class":262},"(task_id, poll_interval",[145,510,266],{"class":258},[145,512,513],{"class":155},"10",[145,515,516],{"class":262},"):\n",[145,518,520],{"class":147,"line":519},19,[145,521,522],{"class":159},"    \"\"\"Realiza polling de una tarea hasta que se complete o falle.\"\"\"\n",[145,524,526,529,531],{"class":147,"line":525},20,[145,527,528],{"class":262},"    start_time ",[145,530,266],{"class":258},[145,532,533],{"class":262}," time.time()\n",[145,535,537],{"class":147,"line":536},21,[145,538,357],{"emptyLinePlaceholder":58},[145,540,542,545,548],{"class":147,"line":541},22,[145,543,544],{"class":258},"    while",[145,546,547],{"class":155}," True",[145,549,412],{"class":262},[145,551,553,556,558],{"class":147,"line":552},23,[145,554,555],{"class":262},"        response ",[145,557,266],{"class":258},[145,559,560],{"class":262}," requests.get(\n",[145,562,564,567,569,572,575,578,581,584,586],{"class":147,"line":563},24,[145,565,566],{"class":258},"            f",[145,568,466],{"class":159},[145,570,571],{"class":155},"{BASE_URL}",[145,573,574],{"class":159},"/tasks/",[145,576,577],{"class":155},"{",[145,579,580],{"class":262},"task_id",[145,582,583],{"class":155},"}",[145,585,466],{"class":159},[145,587,469],{"class":262},[145,589,591,595,597],{"class":147,"line":590},25,[145,592,594],{"class":593},"s9osk","            headers",[145,596,266],{"class":258},[145,598,599],{"class":155},"HEADERS\n",[145,601,603],{"class":147,"line":602},26,[145,604,605],{"class":262},"        )\n",[145,607,609],{"class":147,"line":608},27,[145,610,611],{"class":262},"        response.raise_for_status()\n",[145,613,615,618,620],{"class":147,"line":614},28,[145,616,617],{"class":262},"        task ",[145,619,266],{"class":258},[145,621,622],{"class":262}," response.json()\n",[145,624,626],{"class":147,"line":625},29,[145,627,357],{"emptyLinePlaceholder":58},[145,629,631,634,636,639,642],{"class":147,"line":630},30,[145,632,633],{"class":262},"        status ",[145,635,266],{"class":258},[145,637,638],{"class":262}," task[",[145,640,641],{"class":159},"\"status\"",[145,643,644],{"class":262},"]\n",[145,646,648,651,653,656,659,661,664],{"class":147,"line":647},31,[145,649,650],{"class":262},"        progress ",[145,652,266],{"class":258},[145,654,655],{"class":262}," task.get(",[145,657,658],{"class":159},"\"progress\"",[145,660,290],{"class":262},[145,662,663],{"class":155},"0",[145,665,392],{"class":262},[145,667,669,672,674,677,680,683],{"class":147,"line":668},32,[145,670,671],{"class":262},"        elapsed ",[145,673,266],{"class":258},[145,675,676],{"class":155}," int",[145,678,679],{"class":262},"(time.time() ",[145,681,682],{"class":258},"-",[145,684,685],{"class":262}," start_time)\n",[145,687,689],{"class":147,"line":688},33,[145,690,357],{"emptyLinePlaceholder":58},[145,692,694,697,699,701,704,706,709,711,714,716,719,721,724,726,729,731,734],{"class":147,"line":693},34,[145,695,696],{"class":155},"        print",[145,698,424],{"class":262},[145,700,457],{"class":258},[145,702,703],{"class":159},"\"  [",[145,705,577],{"class":155},[145,707,708],{"class":262},"elapsed",[145,710,583],{"class":155},[145,712,713],{"class":159},"s] Estado: ",[145,715,577],{"class":155},[145,717,718],{"class":262},"status",[145,720,583],{"class":155},[145,722,723],{"class":159}," | Progreso: ",[145,725,577],{"class":155},[145,727,728],{"class":262},"progress",[145,730,583],{"class":155},[145,732,733],{"class":159},"%\"",[145,735,392],{"class":262},[145,737,739],{"class":147,"line":738},35,[145,740,357],{"emptyLinePlaceholder":58},[145,742,744,747,750,753,756],{"class":147,"line":743},36,[145,745,746],{"class":258},"        if",[145,748,749],{"class":262}," status ",[145,751,752],{"class":258},"==",[145,754,755],{"class":159}," \"completed\"",[145,757,412],{"class":262},[145,759,761,764],{"class":147,"line":760},37,[145,762,763],{"class":258},"            return",[145,765,766],{"class":262}," task\n",[145,768,770,773,775,777,780],{"class":147,"line":769},38,[145,771,772],{"class":258},"        elif",[145,774,749],{"class":262},[145,776,752],{"class":258},[145,778,779],{"class":159}," \"failed\"",[145,781,412],{"class":262},[145,783,785,788,790,792,795,798,801,803,806],{"class":147,"line":784},39,[145,786,787],{"class":262},"            error_msg ",[145,789,266],{"class":258},[145,791,655],{"class":262},[145,793,794],{"class":159},"\"error\"",[145,796,797],{"class":262},", {}).get(",[145,799,800],{"class":159},"\"message\"",[145,802,290],{"class":262},[145,804,805],{"class":159},"\"Error desconocido\"",[145,807,392],{"class":262},[145,809,811,814,817,819,821,824,826,829,831,833],{"class":147,"line":810},40,[145,812,813],{"class":258},"            raise",[145,815,816],{"class":155}," Exception",[145,818,424],{"class":262},[145,820,457],{"class":258},[145,822,823],{"class":159},"\"La tarea falló: ",[145,825,577],{"class":155},[145,827,828],{"class":262},"error_msg",[145,830,583],{"class":155},[145,832,466],{"class":159},[145,834,392],{"class":262},[145,836,838],{"class":147,"line":837},41,[145,839,357],{"emptyLinePlaceholder":58},[145,841,843],{"class":147,"line":842},42,[145,844,845],{"class":262},"        time.sleep(poll_interval)\n",[145,847,849],{"class":147,"line":848},43,[145,850,357],{"emptyLinePlaceholder":58},[145,852,854],{"class":147,"line":853},44,[145,855,357],{"emptyLinePlaceholder":58},[145,857,859,861,864],{"class":147,"line":858},45,[145,860,502],{"class":258},[145,862,863],{"class":151}," download_video",[145,865,866],{"class":262},"(url, filename):\n",[145,868,870],{"class":147,"line":869},46,[145,871,872],{"class":159},"    \"\"\"Descarga un video desde una URL a un archivo local.\"\"\"\n",[145,874,876,879,881,883,886,888,891,893,896],{"class":147,"line":875},47,[145,877,878],{"class":155},"    print",[145,880,424],{"class":262},[145,882,457],{"class":258},[145,884,885],{"class":159},"\"Descargando video a ",[145,887,577],{"class":155},[145,889,890],{"class":262},"filename",[145,892,583],{"class":155},[145,894,895],{"class":159},"...\"",[145,897,392],{"class":262},[145,899,901,904,906,909,912,914,917],{"class":147,"line":900},48,[145,902,903],{"class":262},"    response ",[145,905,266],{"class":258},[145,907,908],{"class":262}," requests.get(url, ",[145,910,911],{"class":593},"stream",[145,913,266],{"class":258},[145,915,916],{"class":155},"True",[145,918,392],{"class":262},[145,920,922],{"class":147,"line":921},49,[145,923,924],{"class":262},"    response.raise_for_status()\n",[145,926,928],{"class":147,"line":927},50,[145,929,357],{"emptyLinePlaceholder":58},[145,931,933,936,939,942,945,948,951],{"class":147,"line":932},51,[145,934,935],{"class":258},"    with",[145,937,938],{"class":155}," open",[145,940,941],{"class":262},"(filename, ",[145,943,944],{"class":159},"\"wb\"",[145,946,947],{"class":262},") ",[145,949,950],{"class":258},"as",[145,952,953],{"class":262}," f:\n",[145,955,957,960,963,966,969,972,974,977],{"class":147,"line":956},52,[145,958,959],{"class":258},"        for",[145,961,962],{"class":262}," chunk ",[145,964,965],{"class":258},"in",[145,967,968],{"class":262}," response.iter_content(",[145,970,971],{"class":593},"chunk_size",[145,973,266],{"class":258},[145,975,976],{"class":155},"8192",[145,978,516],{"class":262},[145,980,982],{"class":147,"line":981},53,[145,983,984],{"class":262},"            f.write(chunk)\n",[145,986,988],{"class":147,"line":987},54,[145,989,357],{"emptyLinePlaceholder":58},[145,991,993,996,998,1001,1004],{"class":147,"line":992},55,[145,994,995],{"class":262},"    size_kb ",[145,997,266],{"class":258},[145,999,1000],{"class":262}," os.path.getsize(filename) ",[145,1002,1003],{"class":258},"/",[145,1005,1006],{"class":155}," 1024\n",[145,1008,1010,1012,1014,1016,1019,1021,1023,1025,1027,1029,1032,1035,1037,1040],{"class":147,"line":1009},56,[145,1011,878],{"class":155},[145,1013,424],{"class":262},[145,1015,457],{"class":258},[145,1017,1018],{"class":159},"\"Guardado: ",[145,1020,577],{"class":155},[145,1022,890],{"class":262},[145,1024,583],{"class":155},[145,1026,114],{"class":159},[145,1028,577],{"class":155},[145,1030,1031],{"class":262},"size_kb",[145,1033,1034],{"class":258},":.0f",[145,1036,583],{"class":155},[145,1038,1039],{"class":159}," KB)\"",[145,1041,392],{"class":262},[145,1043,1045],{"class":147,"line":1044},57,[145,1046,357],{"emptyLinePlaceholder":58},[145,1048,1050],{"class":147,"line":1049},58,[145,1051,357],{"emptyLinePlaceholder":58},[145,1053,1055,1057,1060],{"class":147,"line":1054},59,[145,1056,502],{"class":258},[145,1058,1059],{"class":151}," text_to_video",[145,1061,1062],{"class":262},"():\n",[145,1064,1066,1069,1071],{"class":147,"line":1065},60,[145,1067,1068],{"class":262},"    payload ",[145,1070,266],{"class":258},[145,1072,445],{"class":262},[145,1074,1076,1079,1081,1084,1087],{"class":147,"line":1075},61,[145,1077,1078],{"class":159},"        \"model\"",[145,1080,454],{"class":262},[145,1082,1083],{"class":159},"\"seedance-2.0\"",[145,1085,1086],{"class":262},",          ",[145,1088,1089],{"class":174},"# El modelo de IA a usar\n",[145,1091,1093,1096],{"class":147,"line":1092},62,[145,1094,1095],{"class":159},"        \"prompt\"",[145,1097,1098],{"class":262},": (\n",[145,1100,1102],{"class":147,"line":1101},63,[145,1103,1104],{"class":159},"            \"Un cachorro golden retriever persigue una mariposa a través \"\n",[145,1106,1108],{"class":147,"line":1107},64,[145,1109,1110],{"class":159},"            \"de un prado iluminado por el sol. La cámara sigue al cachorro con un \"\n",[145,1112,1114],{"class":147,"line":1113},65,[145,1115,1116],{"class":159},"            \"plano de seguimiento suave mientras las flores silvestres se mecen con la brisa.\"\n",[145,1118,1120],{"class":147,"line":1119},66,[145,1121,1122],{"class":262},"        ),\n",[145,1124,1126,1129,1131,1134,1137],{"class":147,"line":1125},67,[145,1127,1128],{"class":159},"        \"duration\"",[145,1130,454],{"class":262},[145,1132,1133],{"class":155},"5",[145,1135,1136],{"class":262},",                     ",[145,1138,1139],{"class":174},"# Duración del video: 4-15 segundos\n",[145,1141,1143,1146,1148,1151,1154],{"class":147,"line":1142},68,[145,1144,1145],{"class":159},"        \"quality\"",[145,1147,454],{"class":262},[145,1149,1150],{"class":159},"\"720p\"",[145,1152,1153],{"class":262},",                 ",[145,1155,1156],{"class":174},"# Resolución: 480p, 720p, 1080p\n",[145,1158,1160,1163,1165,1168,1171],{"class":147,"line":1159},69,[145,1161,1162],{"class":159},"        \"aspect_ratio\"",[145,1164,454],{"class":262},[145,1166,1167],{"class":159},"\"16:9\"",[145,1169,1170],{"class":262},",            ",[145,1172,1173],{"class":174},"# Pantalla ancha estándar\n",[145,1175,1177,1180,1182,1184],{"class":147,"line":1176},70,[145,1178,1179],{"class":159},"        \"generate_audio\"",[145,1181,454],{"class":262},[145,1183,916],{"class":155},[145,1185,1186],{"class":174},"             # La IA genera audio coincidente\n",[145,1188,1190],{"class":147,"line":1189},71,[145,1191,1192],{"class":262},"    }\n",[145,1194,1196],{"class":147,"line":1195},72,[145,1197,357],{"emptyLinePlaceholder":58},[145,1199,1201,1203,1205,1208],{"class":147,"line":1200},73,[145,1202,878],{"class":155},[145,1204,424],{"class":262},[145,1206,1207],{"class":159},"\"Enviando solicitud de texto a video...\"",[145,1209,392],{"class":262},[145,1211,1213,1215,1217],{"class":147,"line":1212},74,[145,1214,903],{"class":262},[145,1216,266],{"class":258},[145,1218,1219],{"class":262}," requests.post(\n",[145,1221,1223,1226,1228,1230,1233,1236],{"class":147,"line":1222},75,[145,1224,1225],{"class":258},"        f",[145,1227,466],{"class":159},[145,1229,571],{"class":155},[145,1231,1232],{"class":159},"/videos/generations\"",[145,1234,1235],{"class":262},",  ",[145,1237,1238],{"class":174},"# El endpoint de generación de video\n",[145,1240,1242,1245,1247,1249,1252],{"class":147,"line":1241},76,[145,1243,1244],{"class":593},"        headers",[145,1246,266],{"class":258},[145,1248,440],{"class":155},[145,1250,1251],{"class":262},",                   ",[145,1253,1254],{"class":174},"# Headers de autenticación + content-type\n",[145,1256,1258,1261,1263,1266],{"class":147,"line":1257},77,[145,1259,1260],{"class":593},"        json",[145,1262,266],{"class":258},[145,1264,1265],{"class":262},"payload                       ",[145,1267,1268],{"class":174},"# Serializa automáticamente a JSON\n",[145,1270,1272],{"class":147,"line":1271},78,[145,1273,1274],{"class":262},"    )\n",[145,1276,1278,1281],{"class":147,"line":1277},79,[145,1279,1280],{"class":262},"    response.raise_for_status()            ",[145,1282,1283],{"class":174},"# Lanza excepción si no es 200 OK\n",[145,1285,1287,1290,1292,1295],{"class":147,"line":1286},80,[145,1288,1289],{"class":262},"    task ",[145,1291,266],{"class":258},[145,1293,1294],{"class":262}," response.json()                 ",[145,1296,1297],{"class":174},"# Parsea la respuesta JSON\n",[145,1299,1301],{"class":147,"line":1300},81,[145,1302,357],{"emptyLinePlaceholder":58},[145,1304,1306],{"class":147,"line":1305},82,[145,1307,1308],{"class":174},"    # Registra información clave de la respuesta\n",[145,1310,1312,1314,1316,1318,1321,1323,1326,1329,1332,1334,1336],{"class":147,"line":1311},83,[145,1313,878],{"class":155},[145,1315,424],{"class":262},[145,1317,457],{"class":258},[145,1319,1320],{"class":159},"\"Tarea creada: ",[145,1322,577],{"class":155},[145,1324,1325],{"class":262},"task[",[145,1327,1328],{"class":159},"'id'",[145,1330,1331],{"class":262},"]",[145,1333,583],{"class":155},[145,1335,466],{"class":159},[145,1337,392],{"class":262},[145,1339,1341,1343,1345,1347,1350,1352,1354,1357,1360,1363,1365,1367,1370],{"class":147,"line":1340},84,[145,1342,878],{"class":155},[145,1344,424],{"class":262},[145,1346,457],{"class":258},[145,1348,1349],{"class":159},"\"Tiempo estimado: ",[145,1351,577],{"class":155},[145,1353,1325],{"class":262},[145,1355,1356],{"class":159},"'task_info'",[145,1358,1359],{"class":262},"][",[145,1361,1362],{"class":159},"'estimated_time'",[145,1364,1331],{"class":262},[145,1366,583],{"class":155},[145,1368,1369],{"class":159},"s\"",[145,1371,392],{"class":262},[145,1373,1375,1377,1379,1381,1384,1386,1388,1391,1393,1396,1398,1400,1402],{"class":147,"line":1374},85,[145,1376,878],{"class":155},[145,1378,424],{"class":262},[145,1380,457],{"class":258},[145,1382,1383],{"class":159},"\"Créditos reservados: ",[145,1385,577],{"class":155},[145,1387,1325],{"class":262},[145,1389,1390],{"class":159},"'usage'",[145,1392,1359],{"class":262},[145,1394,1395],{"class":159},"'credits_reserved'",[145,1397,1331],{"class":262},[145,1399,583],{"class":155},[145,1401,466],{"class":159},[145,1403,392],{"class":262},[145,1405,1407],{"class":147,"line":1406},86,[145,1408,357],{"emptyLinePlaceholder":58},[145,1410,1412],{"class":147,"line":1411},87,[145,1413,1414],{"class":174},"    # Realiza polling hasta que el video esté listo\n",[145,1416,1418,1421,1423,1426,1429],{"class":147,"line":1417},88,[145,1419,1420],{"class":262},"    result ",[145,1422,266],{"class":258},[145,1424,1425],{"class":262}," wait_for_video(task[",[145,1427,1428],{"class":159},"\"id\"",[145,1430,1431],{"class":262},"])\n",[145,1433,1435],{"class":147,"line":1434},89,[145,1436,357],{"emptyLinePlaceholder":58},[145,1438,1440],{"class":147,"line":1439},90,[145,1441,1442],{"class":174},"    # El array results contiene una o más URLs de video\n",[145,1444,1446,1449,1451,1454,1457,1459,1461],{"class":147,"line":1445},91,[145,1447,1448],{"class":262},"    video_url ",[145,1450,266],{"class":258},[145,1452,1453],{"class":262}," result[",[145,1455,1456],{"class":159},"\"results\"",[145,1458,1359],{"class":262},[145,1460,663],{"class":155},[145,1462,644],{"class":262},[145,1464,1466,1468,1470,1472,1474,1477,1480,1482,1485,1487,1489],{"class":147,"line":1465},92,[145,1467,878],{"class":155},[145,1469,424],{"class":262},[145,1471,457],{"class":258},[145,1473,466],{"class":159},[145,1475,1476],{"class":155},"\\n",[145,1478,1479],{"class":159},"URL del video: ",[145,1481,577],{"class":155},[145,1483,1484],{"class":262},"video_url",[145,1486,583],{"class":155},[145,1488,466],{"class":159},[145,1490,392],{"class":262},[145,1492,1494,1497,1500],{"class":147,"line":1493},93,[145,1495,1496],{"class":262},"    download_video(video_url, ",[145,1498,1499],{"class":159},"\"mi_primer_video.mp4\"",[145,1501,392],{"class":262},[145,1503,1505],{"class":147,"line":1504},94,[145,1506,357],{"emptyLinePlaceholder":58},[145,1508,1510,1513],{"class":147,"line":1509},95,[145,1511,1512],{"class":258},"    return",[145,1514,1515],{"class":262}," result\n",[145,1517,1519],{"class":147,"line":1518},96,[145,1520,357],{"emptyLinePlaceholder":58},[145,1522,1524],{"class":147,"line":1523},97,[145,1525,357],{"emptyLinePlaceholder":58},[145,1527,1529,1531,1534,1537,1540],{"class":147,"line":1528},98,[145,1530,403],{"class":258},[145,1532,1533],{"class":155}," __name__",[145,1535,1536],{"class":258}," ==",[145,1538,1539],{"class":159}," \"__main__\"",[145,1541,412],{"class":262},[145,1543,1545],{"class":147,"line":1544},99,[145,1546,1547],{"class":262},"    text_to_video()\n",[11,1549,1550],{},"Analicemos cada parámetro en el payload:",[97,1552,1553,1568,1581,1589,1609,1629],{},[73,1554,1555,1560,1561,1564,1565,1567],{},[23,1556,1557],{},[28,1558,1559],{},"model"," — Qué modelo de Seedance usar. Configure ",[28,1562,1563],{},"seedance-2.0"," para el más reciente; use ",[28,1566,30],{}," si 2.0 aún no está disponible en su región.",[73,1569,1570,1575,1576,1580],{},[23,1571,1572],{},[28,1573,1574],{},"prompt"," — Su descripción del video. Sea específico sobre el sujeto, acción, movimiento de cámara y ambiente. El prompt anterior usa una estructura de tres partes: sujeto (\"cachorro golden retriever\"), acción (\"persigue una mariposa\"), y cámara (\"plano de seguimiento suave\"). Para técnicas avanzadas de prompts, vea nuestra ",[37,1577,1579],{"href":1578},"/blog/seedance-2-prompt-guide","Guía de Ingeniería de Prompts",".",[73,1582,1583,1588],{},[23,1584,1585],{},[28,1586,1587],{},"duration"," — Duración del video en segundos (4–15). Videos más cortos se generan más rápido y cuestan menos créditos. Comience con 5 para pruebas.",[73,1590,1591,1596,1597,1600,1601,1604,1605,1608],{},[23,1592,1593],{},[28,1594,1595],{},"quality"," — Nivel de resolución. ",[28,1598,1599],{},"720p"," es el mejor balance de calidad y velocidad para desarrollo. Use ",[28,1602,1603],{},"480p"," para iteración rápida, ",[28,1606,1607],{},"1080p"," para renders finales.",[73,1610,1611,1616,1617,1620,1621,1624,1625,1628],{},[23,1612,1613],{},[28,1614,1615],{},"aspect_ratio"," — Dimensiones de salida. ",[28,1618,1619],{},"16:9"," para YouTube/horizontal, ",[28,1622,1623],{},"9:16"," para TikTok/Reels/Shorts, ",[28,1626,1627],{},"1:1"," para feed de Instagram.",[73,1630,1631,1636,1637,1640],{},[23,1632,1633],{},[28,1634,1635],{},"generate_audio"," — Cuando es ",[28,1638,1639],{},"true",", Seedance genera sonido ambiental y música que coincide con el contenido visual. Agrega ~2 segundos al tiempo de generación.",[11,1642,1643],{},"Ejecútelo:",[136,1645,1647],{"className":138,"code":1646,"language":140,"meta":141,"style":141},"python seedance_tutorial.py\n",[28,1648,1649],{"__ignoreMap":141},[145,1650,1651,1653],{"class":147,"line":148},[145,1652,328],{"class":151},[145,1654,1655],{"class":159}," seedance_tutorial.py\n",[92,1657,1659],{"id":1658},"qué-devuelve-la-api","Qué Devuelve la API",[11,1661,1662,1663,1666],{},"Cuando envía una solicitud de generación, recibe de vuelta un ",[23,1664,1665],{},"objeto de tarea"," inmediatamente — el video aún no está listo. Aquí está la respuesta real:",[136,1668,1672],{"className":1669,"code":1670,"language":1671,"meta":141,"style":141},"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,1673,1674,1679,1691,1703,1714,1726,1737,1749,1757,1768,1778,1783,1795,1802,1814,1826,1836,1841],{"__ignoreMap":141},[145,1675,1676],{"class":147,"line":148},[145,1677,1678],{"class":262},"{\n",[145,1680,1681,1684,1686,1689],{"class":147,"line":166},[145,1682,1683],{"class":155},"  \"created\"",[145,1685,454],{"class":262},[145,1687,1688],{"class":155},"1772203771",[145,1690,469],{"class":262},[145,1692,1693,1696,1698,1701],{"class":147,"line":178},[145,1694,1695],{"class":155},"  \"id\"",[145,1697,454],{"class":262},[145,1699,1700],{"class":159},"\"task-unified-1772203771-yf1dxogh\"",[145,1702,469],{"class":262},[145,1704,1705,1708,1710,1712],{"class":147,"line":187},[145,1706,1707],{"class":155},"  \"model\"",[145,1709,454],{"class":262},[145,1711,1083],{"class":159},[145,1713,469],{"class":262},[145,1715,1716,1719,1721,1724],{"class":147,"line":360},[145,1717,1718],{"class":155},"  \"object\"",[145,1720,454],{"class":262},[145,1722,1723],{"class":159},"\"video.generation.task\"",[145,1725,469],{"class":262},[145,1727,1728,1731,1733,1735],{"class":147,"line":366},[145,1729,1730],{"class":155},"  \"progress\"",[145,1732,454],{"class":262},[145,1734,663],{"class":155},[145,1736,469],{"class":262},[145,1738,1739,1742,1744,1747],{"class":147,"line":378},[145,1740,1741],{"class":155},"  \"status\"",[145,1743,454],{"class":262},[145,1745,1746],{"class":159},"\"pending\"",[145,1748,469],{"class":262},[145,1750,1751,1754],{"class":147,"line":395},[145,1752,1753],{"class":155},"  \"task_info\"",[145,1755,1756],{"class":262},": {\n",[145,1758,1759,1762,1764,1766],{"class":147,"line":400},[145,1760,1761],{"class":155},"    \"can_cancel\"",[145,1763,454],{"class":262},[145,1765,1639],{"class":155},[145,1767,469],{"class":262},[145,1769,1770,1773,1775],{"class":147,"line":415},[145,1771,1772],{"class":155},"    \"estimated_time\"",[145,1774,454],{"class":262},[145,1776,1777],{"class":155},"132\n",[145,1779,1780],{"class":147,"line":432},[145,1781,1782],{"class":262},"  },\n",[145,1784,1785,1788,1790,1793],{"class":147,"line":437},[145,1786,1787],{"class":155},"  \"type\"",[145,1789,454],{"class":262},[145,1791,1792],{"class":159},"\"video\"",[145,1794,469],{"class":262},[145,1796,1797,1800],{"class":147,"line":448},[145,1798,1799],{"class":155},"  \"usage\"",[145,1801,1756],{"class":262},[145,1803,1804,1807,1809,1812],{"class":147,"line":472},[145,1805,1806],{"class":155},"    \"billing_rule\"",[145,1808,454],{"class":262},[145,1810,1811],{"class":159},"\"per_second\"",[145,1813,469],{"class":262},[145,1815,1816,1819,1821,1824],{"class":147,"line":483},[145,1817,1818],{"class":155},"    \"credits_reserved\"",[145,1820,454],{"class":262},[145,1822,1823],{"class":155},"17.784",[145,1825,469],{"class":262},[145,1827,1828,1831,1833],{"class":147,"line":489},[145,1829,1830],{"class":155},"    \"user_group\"",[145,1832,454],{"class":262},[145,1834,1835],{"class":159},"\"default\"\n",[145,1837,1838],{"class":147,"line":494},[145,1839,1840],{"class":262},"  }\n",[145,1842,1843],{"class":147,"line":499},[145,1844,486],{"class":262},[11,1846,1847],{},"Campos clave explicados:",[1849,1850,1851,1864],"table",{},[1852,1853,1854],"thead",{},[1855,1856,1857,1861],"tr",{},[1858,1859,1860],"th",{},"Campo",[1858,1862,1863],{},"Significado",[1865,1866,1867,1878,1902,1913,1923,1933,1946,1956],"tbody",{},[1855,1868,1869,1875],{},[1870,1871,1872],"td",{},[28,1873,1874],{},"id",[1870,1876,1877],{},"Su ID de tarea — úselo para verificar el estado y recuperar resultados",[1855,1879,1880,1884],{},[1870,1881,1882],{},[28,1883,718],{},[1870,1885,1886,1887,1890,1891,1894,1895,1898,1899],{},"Comienza como ",[28,1888,1889],{},"pending",", pasa a ",[28,1892,1893],{},"processing",", luego ",[28,1896,1897],{},"completed"," o ",[28,1900,1901],{},"failed",[1855,1903,1904,1908],{},[1870,1905,1906],{},[28,1907,728],{},[1870,1909,1910,1911],{},"Porcentaje 0–100. Se actualiza en tiempo real durante ",[28,1912,1893],{},[1855,1914,1915,1920],{},[1870,1916,1917],{},[28,1918,1919],{},"estimated_time",[1870,1921,1922],{},"Segundos aproximados hasta completarse (estimación del servidor)",[1855,1924,1925,1930],{},[1870,1926,1927],{},[28,1928,1929],{},"credits_reserved",[1870,1931,1932],{},"Créditos retenidos para este trabajo. Se reembolsan automáticamente si la tarea falla",[1855,1934,1935,1940],{},[1870,1936,1937],{},[28,1938,1939],{},"task_info.can_cancel",[1870,1941,1942,1943,1945],{},"Si puede cancelar esta tarea (siempre ",[28,1944,1639],{}," antes de completarse)",[1855,1947,1948,1953],{},[1870,1949,1950],{},[28,1951,1952],{},"created",[1870,1954,1955],{},"Timestamp Unix de cuando se envió la tarea",[1855,1957,1958,1963],{},[1870,1959,1960],{},[28,1961,1962],{},"usage.billing_rule",[1870,1964,1965,1966,1969],{},"Cómo se calculan los créditos — ",[28,1967,1968],{},"per_second"," significa que el costo escala con la duración",[18,1971,1972],{},[11,1973,1974,1976,1977,1979,1980,1983],{},[23,1975,133],{}," Guarde el ",[28,1978,1874],{}," en un archivo o base de datos inmediatamente después del envío. Si su script falla durante el polling, puede reanudar llamando a ",[28,1981,1982],{},"wait_for_video()"," con el ID de tarea guardado. Las tareas persisten en el servidor durante 24 horas.",[92,1985,1987],{"id":1986},"la-secuencia-de-polling","La Secuencia de Polling",[11,1989,1990,1991,1993],{},"La función ",[28,1992,1982],{}," realiza polling cada 10 segundos. Así se ve la salida real:",[136,1995,2000],{"className":1996,"code":1998,"language":1999},[1997],"language-text","Enviando solicitud de texto a video...\nTarea creada: task-unified-1772203771-yf1dxogh\nTiempo estimado: 132s\nCréditos reservados: 17.784\n  [0s] Estado: pending | Progreso: 0%\n  [10s] Estado: processing | Progreso: 7%\n  [20s] Estado: processing | Progreso: 13%\n  [30s] Estado: processing | Progreso: 20%\n  [40s] Estado: processing | Progreso: 27%\n  [50s] Estado: completed | Progreso: 100%\n\nURL del video: https://files.evolink.ai/.../cgt-20260227224931-8vl7s.mp4\nDescargando video a mi_primer_video.mp4...\nGuardado: mi_primer_video.mp4 (2847 KB)\n","text",[28,2001,1998],{"__ignoreMap":141},[11,2003,2004],{},"Eso es todo — aproximadamente 50 segundos desde la llamada a la API hasta el archivo de video en disco.",[18,2006,2007],{},[11,2008,2009,2012],{},[23,2010,2011],{},"Importante:"," Las URLs de video expiran después de 24 horas. Siempre descargue el archivo rápidamente o almacénelo en su propio almacenamiento (S3, GCS, Cloudflare R2, etc.).",[18,2014,2015],{},[11,2016,2017,2020],{},[23,2018,2019],{},"Error Común:"," No dependa de la URL del video para almacenamiento a largo plazo. Construya su pipeline para descargar inmediatamente después de completarse. Si procesa videos de forma asíncrona, use webhooks (cubiertos a continuación) para activar descargas en el momento en que estén listos.",[11,2022,2023,2024,2027],{},"Para consejos sobre cómo escribir prompts efectivos, vea la ",[37,2025,2026],{"href":1578},"Guía de Prompts de Seedance 2.0"," — cubre el formato de guion de tomas, palabras clave de estilo y sintaxis de temporización.",[45,2029],{},[48,2031,2033],{"id":2032},"realizar-polling-de-resultados-comprensión-del-flujo-de-trabajo-asíncrono","Realizar Polling de Resultados: Comprensión del Flujo de Trabajo Asíncrono",[11,2035,2036,2037,2040],{},"La generación de video toma entre 30 y 120 segundos o más dependiendo de la duración y calidad. La API usa un ",[23,2038,2039],{},"patrón de tarea asíncrona"," — el mismo patrón utilizado por OpenAI, Stability AI y la mayoría de las demás APIs de IA generativa:",[70,2042,2043,2053,2063],{},[73,2044,2045,2048,2049,2052],{},[23,2046,2047],{},"Enviar"," → POST a ",[28,2050,2051],{},"/v1/videos/generations"," → obtiene un ID de tarea instantáneamente",[73,2054,2055,2058,2059,2062],{},[23,2056,2057],{},"Polling"," → GET ",[28,2060,2061],{},"/v1/tasks/{task_id}"," → verifica el estado periódicamente",[73,2064,2065,2068,2069,2072,2073,2076],{},[23,2066,2067],{},"Recuperar"," → Cuando ",[28,2070,2071],{},"status: \"completed\"",", el array ",[28,2074,2075],{},"results"," contiene URLs de video",[11,2078,2079],{},"Este patrón existe porque la generación de video es computacionalmente costosa. Una solicitud HTTP síncrona expiraría mucho antes de que el video esté listo.",[92,2081,2083],{"id":2082},"ciclo-de-vida-del-estado-de-la-tarea","Ciclo de Vida del Estado de la Tarea",[136,2085,2088],{"className":2086,"code":2087,"language":1999},[1997],"pending → processing → completed\n                    ↘ failed\n",[28,2089,2087],{"__ignoreMap":141},[1849,2091,2092,2105],{},[1852,2093,2094],{},[1855,2095,2096,2099,2102],{},[1858,2097,2098],{},"Estado",[1858,2100,2101],{},"Qué Está Pasando",[1858,2103,2104],{},"Duración Típica",[1865,2106,2107,2119,2134,2149],{},[1855,2108,2109,2113,2116],{},[1870,2110,2111],{},[28,2112,1889],{},[1870,2114,2115],{},"La tarea está en cola, esperando recursos GPU",[1870,2117,2118],{},"0–30 segundos",[1855,2120,2121,2125,2131],{},[1870,2122,2123],{},[28,2124,1893],{},[1870,2126,2127,2128,2130],{},"El video se está generando — ",[28,2129,728],{}," se actualiza en tiempo real",[1870,2132,2133],{},"30–120 segundos",[1855,2135,2136,2140,2146],{},[1870,2137,2138],{},[28,2139,1897],{},[1870,2141,2142,2143,2145],{},"¡Listo! El array ",[28,2144,2075],{}," tiene su(s) URL(s) de video",[1870,2147,2148],{},"Estado terminal",[1855,2150,2151,2155,2158],{},[1870,2152,2153],{},[28,2154,1901],{},[1870,2156,2157],{},"Algo salió mal — revise los detalles del error",[1870,2159,2148],{},[92,2161,2163],{"id":2162},"mejores-prácticas-de-polling","Mejores Prácticas de Polling",[11,2165,2166,2169],{},[23,2167,2168],{},"Intervalo de polling:"," 10 segundos es un buen valor predeterminado. Hacer polling demasiado rápido desperdicia solicitudes y podría activar límites de tasa; demasiado lento retrasa su pipeline. Para aplicaciones donde el tiempo es crítico, puede hacer polling cada 5 segundos, pero no hay beneficio en ir más rápido que eso.",[11,2171,2172,2175],{},[23,2173,2174],{},"Timeout:"," Establezca un límite superior razonable basado en sus parámetros:",[1849,2177,2178,2191],{},[1852,2179,2180],{},[1855,2181,2182,2185,2188],{},[1858,2183,2184],{},"Configuración",[1858,2186,2187],{},"Tiempo Esperado",[1858,2189,2190],{},"Timeout Sugerido",[1865,2192,2193,2204,2215,2226],{},[1855,2194,2195,2198,2201],{},[1870,2196,2197],{},"4s, 480p",[1870,2199,2200],{},"20–40 segundos",[1870,2202,2203],{},"120 segundos",[1855,2205,2206,2209,2212],{},[1870,2207,2208],{},"5s, 720p",[1870,2210,2211],{},"30–60 segundos",[1870,2213,2214],{},"180 segundos",[1855,2216,2217,2220,2223],{},[1870,2218,2219],{},"10s, 720p",[1870,2221,2222],{},"60–90 segundos",[1870,2224,2225],{},"300 segundos",[1855,2227,2228,2231,2234],{},[1870,2229,2230],{},"15s, 1080p",[1870,2232,2233],{},"90–180 segundos",[1870,2235,2236],{},"600 segundos",[11,2238,2239,2242,2243,2245,2246,1580],{},[23,2240,2241],{},"Seguimiento del progreso:"," El campo ",[28,2244,728],{}," (0–100) le brinda retroalimentación granular — útil para construir barras de progreso en una UI. El progreso se actualiza aproximadamente cada 5–7 segundos durante la fase ",[28,2247,1893],{},[92,2249,2251],{"id":2250},"cancelar-una-tarea","Cancelar una Tarea",[11,2253,2254],{},"Si necesita detener una generación en progreso (prompt incorrecto, cambió de opinión), puede cancelarla:",[136,2256,2258],{"className":326,"code":2257,"language":328,"meta":141,"style":141},"def cancel_task(task_id):\n    \"\"\"Cancela una tarea pendiente o en procesamiento. Los créditos se reembolsan.\"\"\"\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\"Tarea {task_id} cancelada. Créditos reembolsados.\")\n    else:\n        print(f\"Cancelación fallida: {response.json()}\")\n",[28,2259,2260,2270,2275,2283,2304,2312,2316,2331,2353,2360],{"__ignoreMap":141},[145,2261,2262,2264,2267],{"class":147,"line":148},[145,2263,502],{"class":258},[145,2265,2266],{"class":151}," cancel_task",[145,2268,2269],{"class":262},"(task_id):\n",[145,2271,2272],{"class":147,"line":166},[145,2273,2274],{"class":159},"    \"\"\"Cancela una tarea pendiente o en procesamiento. Los créditos se reembolsan.\"\"\"\n",[145,2276,2277,2279,2281],{"class":147,"line":178},[145,2278,903],{"class":262},[145,2280,266],{"class":258},[145,2282,1219],{"class":262},[145,2284,2285,2287,2289,2291,2293,2295,2297,2299,2302],{"class":147,"line":187},[145,2286,1225],{"class":258},[145,2288,466],{"class":159},[145,2290,571],{"class":155},[145,2292,574],{"class":159},[145,2294,577],{"class":155},[145,2296,580],{"class":262},[145,2298,583],{"class":155},[145,2300,2301],{"class":159},"/cancel\"",[145,2303,469],{"class":262},[145,2305,2306,2308,2310],{"class":147,"line":360},[145,2307,1244],{"class":593},[145,2309,266],{"class":258},[145,2311,599],{"class":155},[145,2313,2314],{"class":147,"line":366},[145,2315,1274],{"class":262},[145,2317,2318,2321,2324,2326,2329],{"class":147,"line":378},[145,2319,2320],{"class":258},"    if",[145,2322,2323],{"class":262}," response.status_code ",[145,2325,752],{"class":258},[145,2327,2328],{"class":155}," 200",[145,2330,412],{"class":262},[145,2332,2333,2335,2337,2339,2342,2344,2346,2348,2351],{"class":147,"line":395},[145,2334,696],{"class":155},[145,2336,424],{"class":262},[145,2338,457],{"class":258},[145,2340,2341],{"class":159},"\"Tarea ",[145,2343,577],{"class":155},[145,2345,580],{"class":262},[145,2347,583],{"class":155},[145,2349,2350],{"class":159}," cancelada. Créditos reembolsados.\"",[145,2352,392],{"class":262},[145,2354,2355,2358],{"class":147,"line":400},[145,2356,2357],{"class":258},"    else",[145,2359,412],{"class":262},[145,2361,2362,2364,2366,2368,2371,2373,2376,2378,2380],{"class":147,"line":415},[145,2363,696],{"class":155},[145,2365,424],{"class":262},[145,2367,457],{"class":258},[145,2369,2370],{"class":159},"\"Cancelación fallida: ",[145,2372,577],{"class":155},[145,2374,2375],{"class":262},"response.json()",[145,2377,583],{"class":155},[145,2379,466],{"class":159},[145,2381,392],{"class":262},[11,2383,2384,2385,2387,2388,2390,2391,1898,2393,2395],{},"La cancelación funciona cuando ",[28,2386,1939],{}," es ",[28,2389,1639],{},". Una vez que una tarea alcanza ",[28,2392,1897],{},[28,2394,1901],{},", no puede cancelarse. Los créditos reservados se reembolsan automáticamente al cancelar.",[18,2397,2398],{},[11,2399,2400,2402],{},[23,2401,133],{}," Incorpore un mecanismo de cancelación en su UI desde el principio. Los usuarios inevitablemente enviarán prompts incorrectos, y esperar 2 minutos por un video malo desperdicia tanto tiempo como créditos.",[11,2404,1990,2405,2407,2408,2412],{},[28,2406,1982],{}," de nuestro código de configuración maneja el flujo estándar de polling. Si desea omitir el polling por completo, salte a la ",[37,2409,2411],{"href":2410},"#configurar-webhooks-omita-el-polling","sección de Webhooks"," a continuación.",[45,2414],{},[48,2416,2418],{"id":2417},"animar-una-imagen-imagen-a-video","Animar una Imagen (Imagen a Video)",[11,2420,2421,2422,2425,2426,2430],{},"¿Tiene una foto de producto, ilustración de personaje o paisaje que quiera darle vida? Pásela como ",[28,2423,2424],{},"image_url"," y Seedance la animará. Esta es una de las características más poderosas para ",[37,2427,2429],{"href":2428},"/blog/seedance-2-ecommerce-product-videos","videos de productos de e-commerce"," — tome una foto estática del producto y conviértala en un anuncio de video atractivo.",[11,2432,2433],{},[2434,2435,2436],"em",{},"Usa la misma configuración y función de polling del primer ejemplo anterior.",[136,2438,2440],{"className":326,"code":2439,"language":328,"meta":141,"style":141},"# ── Imagen a Video ────────────────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. La escena cobra vida lentamente \"\n            \"— las hojas se mecen suavemente, la luz suave se desplaza \"\n            \"por el encuadre, y el sujeto parpadea de forma natural.\"\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(\"Enviando solicitud de imagen a video...\")\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\"Tarea creada: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n\n    video_url = result[\"results\"][0]\n    download_video(video_url, \"imagen_animada.mp4\")\n\n    return result\n",[28,2441,2442,2447,2456,2464,2474,2480,2485,2490,2495,2499,2507,2512,2517,2527,2537,2546,2550,2554,2565,2573,2585,2595,2604,2608,2612,2620,2624,2648,2660,2664,2680,2689,2693],{"__ignoreMap":141},[145,2443,2444],{"class":147,"line":148},[145,2445,2446],{"class":174},"# ── Imagen a Video ────────────────────────────────────────────\n",[145,2448,2449,2451,2454],{"class":147,"line":166},[145,2450,502],{"class":258},[145,2452,2453],{"class":151}," image_to_video",[145,2455,1062],{"class":262},[145,2457,2458,2460,2462],{"class":147,"line":178},[145,2459,1068],{"class":262},[145,2461,266],{"class":258},[145,2463,445],{"class":262},[145,2465,2466,2468,2470,2472],{"class":147,"line":187},[145,2467,1078],{"class":159},[145,2469,454],{"class":262},[145,2471,1083],{"class":159},[145,2473,469],{"class":262},[145,2475,2476,2478],{"class":147,"line":360},[145,2477,1095],{"class":159},[145,2479,1098],{"class":262},[145,2481,2482],{"class":147,"line":366},[145,2483,2484],{"class":159},"            \"@Image1 as the first frame. La escena cobra vida lentamente \"\n",[145,2486,2487],{"class":147,"line":378},[145,2488,2489],{"class":159},"            \"— las hojas se mecen suavemente, la luz suave se desplaza \"\n",[145,2491,2492],{"class":147,"line":395},[145,2493,2494],{"class":159},"            \"por el encuadre, y el sujeto parpadea de forma natural.\"\n",[145,2496,2497],{"class":147,"line":400},[145,2498,1122],{"class":262},[145,2500,2501,2504],{"class":147,"line":415},[145,2502,2503],{"class":159},"        \"image_urls\"",[145,2505,2506],{"class":262},": [\n",[145,2508,2509],{"class":147,"line":432},[145,2510,2511],{"class":159},"            \"https://example.com/your-image.jpg\"\n",[145,2513,2514],{"class":147,"line":437},[145,2515,2516],{"class":262},"        ],\n",[145,2518,2519,2521,2523,2525],{"class":147,"line":448},[145,2520,1128],{"class":159},[145,2522,454],{"class":262},[145,2524,1133],{"class":155},[145,2526,469],{"class":262},[145,2528,2529,2531,2533,2535],{"class":147,"line":472},[145,2530,1145],{"class":159},[145,2532,454],{"class":262},[145,2534,1150],{"class":159},[145,2536,469],{"class":262},[145,2538,2539,2541,2543],{"class":147,"line":483},[145,2540,1162],{"class":159},[145,2542,454],{"class":262},[145,2544,2545],{"class":159},"\"16:9\"\n",[145,2547,2548],{"class":147,"line":489},[145,2549,1192],{"class":262},[145,2551,2552],{"class":147,"line":494},[145,2553,357],{"emptyLinePlaceholder":58},[145,2555,2556,2558,2560,2563],{"class":147,"line":499},[145,2557,878],{"class":155},[145,2559,424],{"class":262},[145,2561,2562],{"class":159},"\"Enviando solicitud de imagen a video...\"",[145,2564,392],{"class":262},[145,2566,2567,2569,2571],{"class":147,"line":519},[145,2568,903],{"class":262},[145,2570,266],{"class":258},[145,2572,1219],{"class":262},[145,2574,2575,2577,2579,2581,2583],{"class":147,"line":525},[145,2576,1225],{"class":258},[145,2578,466],{"class":159},[145,2580,571],{"class":155},[145,2582,1232],{"class":159},[145,2584,469],{"class":262},[145,2586,2587,2589,2591,2593],{"class":147,"line":536},[145,2588,1244],{"class":593},[145,2590,266],{"class":258},[145,2592,440],{"class":155},[145,2594,469],{"class":262},[145,2596,2597,2599,2601],{"class":147,"line":541},[145,2598,1260],{"class":593},[145,2600,266],{"class":258},[145,2602,2603],{"class":262},"payload\n",[145,2605,2606],{"class":147,"line":552},[145,2607,1274],{"class":262},[145,2609,2610],{"class":147,"line":563},[145,2611,924],{"class":262},[145,2613,2614,2616,2618],{"class":147,"line":590},[145,2615,1289],{"class":262},[145,2617,266],{"class":258},[145,2619,622],{"class":262},[145,2621,2622],{"class":147,"line":602},[145,2623,357],{"emptyLinePlaceholder":58},[145,2625,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646],{"class":147,"line":608},[145,2627,878],{"class":155},[145,2629,424],{"class":262},[145,2631,457],{"class":258},[145,2633,1320],{"class":159},[145,2635,577],{"class":155},[145,2637,1325],{"class":262},[145,2639,1328],{"class":159},[145,2641,1331],{"class":262},[145,2643,583],{"class":155},[145,2645,466],{"class":159},[145,2647,392],{"class":262},[145,2649,2650,2652,2654,2656,2658],{"class":147,"line":614},[145,2651,1420],{"class":262},[145,2653,266],{"class":258},[145,2655,1425],{"class":262},[145,2657,1428],{"class":159},[145,2659,1431],{"class":262},[145,2661,2662],{"class":147,"line":625},[145,2663,357],{"emptyLinePlaceholder":58},[145,2665,2666,2668,2670,2672,2674,2676,2678],{"class":147,"line":630},[145,2667,1448],{"class":262},[145,2669,266],{"class":258},[145,2671,1453],{"class":262},[145,2673,1456],{"class":159},[145,2675,1359],{"class":262},[145,2677,663],{"class":155},[145,2679,644],{"class":262},[145,2681,2682,2684,2687],{"class":147,"line":647},[145,2683,1496],{"class":262},[145,2685,2686],{"class":159},"\"imagen_animada.mp4\"",[145,2688,392],{"class":262},[145,2690,2691],{"class":147,"line":668},[145,2692,357],{"emptyLinePlaceholder":58},[145,2694,2695,2697],{"class":147,"line":688},[145,2696,1512],{"class":258},[145,2698,1515],{"class":262},[11,2700,2701],{},"Analicemos qué es diferente respecto a texto a video:",[97,2703,2704,2716,2736],{},[73,2705,2706,2711,2712,2715],{},[23,2707,2708],{},[28,2709,2710],{},"image_urls"," — Un array de URLs de imágenes públicamente accesibles. La API las recupera directamente, por lo que deben ser accesibles desde internet (no ",[28,2713,2714],{},"localhost"," o URLs de red privada).",[73,2717,2718,2724,2725,2727,2728,290,2730,290,2733,1580],{},[23,2719,2720,2723],{},[28,2721,2722],{},"@Image1"," en el prompt"," — Esta etiqueta le dice a Seedance qué imagen referenciar y cómo. Corresponde a la primera URL en ",[28,2726,2710],{},". Si pasa tres imágenes, usaría ",[28,2729,2722],{},[28,2731,2732],{},"@Image2",[28,2734,2735],{},"@Image3",[73,2737,2738,2743,2744,2746,2747,2750],{},[23,2739,2740,2741],{},"Sin ",[28,2742,1635],{}," — Omitido aquí, por lo que toma el valor ",[28,2745,1639],{}," por defecto. Puede configurarlo en ",[28,2748,2749],{},"false"," para animación silenciosa.",[92,2752,2754],{"id":2753},"cómo-funcionan-las-etiquetas-image","Cómo Funcionan las Etiquetas @Image",[11,2756,2757,2758,2760,2761,2763,2764,2766,2767,2770,2771,2774,2775,2778,2779,1580],{},"La etiqueta ",[28,2759,2722],{}," en su prompt le dice a Seedance cómo usar la imagen. Referencia la primera URL en el array ",[28,2762,2710],{},". Puede pasar hasta 9 imágenes (",[28,2765,2722],{}," a ",[28,2768,2769],{},"@Image9","). Para una guía completa sobre etiquetas multimodales incluyendo ",[28,2772,2773],{},"@Video"," y ",[28,2776,2777],{},"@Audio",", vea la ",[37,2780,2782],{"href":2781},"/blog/seedance-2-multimodal-tags-guide","Guía de @Tags Multimodal",[11,2784,2785],{},"Patrones comunes:",[1849,2787,2788,2801],{},[1852,2789,2790],{},[1855,2791,2792,2795,2798],{},[1858,2793,2794],{},"Patrón del Prompt",[1858,2796,2797],{},"Qué Hace",[1858,2799,2800],{},"Mejor Para",[1865,2802,2803,2816,2829,2842,2855],{},[1855,2804,2805,2810,2813],{},[1870,2806,2807],{},[28,2808,2809],{},"@Image1 as first frame",[1870,2811,2812],{},"Usa la imagen como fotograma de apertura",[1870,2814,2815],{},"Exhibiciones de productos, configuración de escena",[1855,2817,2818,2823,2826],{},[1870,2819,2820],{},[28,2821,2822],{},"@Image1 as last frame",[1870,2824,2825],{},"Usa la imagen como fotograma de cierre",[1870,2827,2828],{},"Revelaciones de logos, transiciones",[1855,2830,2831,2836,2839],{},[1870,2832,2833],{},[28,2834,2835],{},"@Image1 as character reference",[1870,2837,2838],{},"Mantiene la apariencia del personaje",[1870,2840,2841],{},"Personajes consistentes entre clips",[1855,2843,2844,2849,2852],{},[1870,2845,2846],{},[28,2847,2848],{},"@Image1 as style reference",[1870,2850,2851],{},"Aplica el estilo visual de la imagen",[1870,2853,2854],{},"Consistencia de marca, dirección de arte",[1855,2856,2857,2862,2865],{},[1870,2858,2859],{},[28,2860,2861],{},"@Image1 as first frame, @Image2 as last frame",[1870,2863,2864],{},"Crea una transición entre dos imágenes",[1870,2866,2867],{},"Antes/después, transformaciones",[11,2869,2870],{},"La respuesta real de nuestra prueba:",[136,2872,2874],{"className":1669,"code":2873,"language":1671,"meta":141,"style":141},"{\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,2875,2876,2880,2891,2902,2912,2922,2932,2942,2948,2958,2967,2971,2981,2987,2997,3007,3015,3019],{"__ignoreMap":141},[145,2877,2878],{"class":147,"line":148},[145,2879,1678],{"class":262},[145,2881,2882,2884,2886,2889],{"class":147,"line":166},[145,2883,1683],{"class":155},[145,2885,454],{"class":262},[145,2887,2888],{"class":155},"1772204037",[145,2890,469],{"class":262},[145,2892,2893,2895,2897,2900],{"class":147,"line":178},[145,2894,1695],{"class":155},[145,2896,454],{"class":262},[145,2898,2899],{"class":159},"\"task-unified-1772204036-lify8u5p\"",[145,2901,469],{"class":262},[145,2903,2904,2906,2908,2910],{"class":147,"line":187},[145,2905,1707],{"class":155},[145,2907,454],{"class":262},[145,2909,1083],{"class":159},[145,2911,469],{"class":262},[145,2913,2914,2916,2918,2920],{"class":147,"line":360},[145,2915,1718],{"class":155},[145,2917,454],{"class":262},[145,2919,1723],{"class":159},[145,2921,469],{"class":262},[145,2923,2924,2926,2928,2930],{"class":147,"line":366},[145,2925,1730],{"class":155},[145,2927,454],{"class":262},[145,2929,663],{"class":155},[145,2931,469],{"class":262},[145,2933,2934,2936,2938,2940],{"class":147,"line":378},[145,2935,1741],{"class":155},[145,2937,454],{"class":262},[145,2939,1746],{"class":159},[145,2941,469],{"class":262},[145,2943,2944,2946],{"class":147,"line":395},[145,2945,1753],{"class":155},[145,2947,1756],{"class":262},[145,2949,2950,2952,2954,2956],{"class":147,"line":400},[145,2951,1761],{"class":155},[145,2953,454],{"class":262},[145,2955,1639],{"class":155},[145,2957,469],{"class":262},[145,2959,2960,2962,2964],{"class":147,"line":415},[145,2961,1772],{"class":155},[145,2963,454],{"class":262},[145,2965,2966],{"class":155},"145\n",[145,2968,2969],{"class":147,"line":432},[145,2970,1782],{"class":262},[145,2972,2973,2975,2977,2979],{"class":147,"line":437},[145,2974,1787],{"class":155},[145,2976,454],{"class":262},[145,2978,1792],{"class":159},[145,2980,469],{"class":262},[145,2982,2983,2985],{"class":147,"line":448},[145,2984,1799],{"class":155},[145,2986,1756],{"class":262},[145,2988,2989,2991,2993,2995],{"class":147,"line":472},[145,2990,1806],{"class":155},[145,2992,454],{"class":262},[145,2994,1811],{"class":159},[145,2996,469],{"class":262},[145,2998,2999,3001,3003,3005],{"class":147,"line":483},[145,3000,1818],{"class":155},[145,3002,454],{"class":262},[145,3004,1823],{"class":155},[145,3006,469],{"class":262},[145,3008,3009,3011,3013],{"class":147,"line":489},[145,3010,1830],{"class":155},[145,3012,454],{"class":262},[145,3014,1835],{"class":159},[145,3016,3017],{"class":147,"line":494},[145,3018,1840],{"class":262},[145,3020,3021],{"class":147,"line":499},[145,3022,486],{"class":262},[11,3024,3025,3026,3028],{},"Imagen a video sigue exactamente el mismo patrón asíncrono — enviar, polling, descargar. El ",[28,3027,1919],{}," es ligeramente más largo porque el modelo necesita analizar la imagen de entrada.",[92,3030,3032],{"id":3031},"requisitos-de-imagen","Requisitos de Imagen",[1849,3034,3035,3045],{},[1852,3036,3037],{},[1855,3038,3039,3042],{},[1858,3040,3041],{},"Restricción",[1858,3043,3044],{},"Valor",[1865,3046,3047,3055,3063,3071,3079],{},[1855,3048,3049,3052],{},[1870,3050,3051],{},"Máximo de imágenes",[1870,3053,3054],{},"9 por solicitud",[1855,3056,3057,3060],{},[1870,3058,3059],{},"Tamaño máximo de archivo",[1870,3061,3062],{},"30 MB por imagen",[1855,3064,3065,3068],{},[1870,3066,3067],{},"Formatos soportados",[1870,3069,3070],{},"JPEG, PNG, WebP, BMP, TIFF, GIF",[1855,3072,3073,3076],{},[1870,3074,3075],{},"Requisito de URL",[1870,3077,3078],{},"Debe ser públicamente accesible",[1855,3080,3081,3084],{},[1870,3082,3083],{},"Resolución recomendada",[1870,3085,3086],{},"Al menos 720px en el lado más corto",[18,3088,3089],{},[11,3090,3091,3093,3094,3096],{},[23,3092,2019],{}," Pasar una ruta de archivo local en lugar de una URL. El campo ",[28,3095,2710],{}," requiere URLs HTTP/HTTPS públicamente accesibles. Si sus imágenes son locales, súbalas primero a S3, Cloudflare R2 o incluso un servicio de alojamiento de archivos temporal.",[18,3098,3099],{},[11,3100,3101,3104],{},[23,3102,3103],{},"Restricción:"," Seedance no soporta subir imágenes de rostros humanos realistas. El sistema las rechaza automáticamente. Use personajes ilustrados o estilizados en su lugar.",[92,3106,3108],{"id":3107},"alojar-imágenes-para-la-api","Alojar Imágenes para la API",[11,3110,3111],{},"Si no tiene un CDN, aquí hay opciones rápidas para obtener una URL pública:",[136,3113,3115],{"className":326,"code":3114,"language":328,"meta":141,"style":141},"# Opción 1: Subir a S3 (si tiene AWS)\nimport boto3\ns3 = boto3.client('s3')\ns3.upload_file('imagen_local.jpg', 'mi-bucket', 'seedance/input.jpg')\nimage_url = f\"https://mi-bucket.s3.amazonaws.com/seedance/input.jpg\"\n\n# Opción 2: Usar una API de alojamiento de archivos temporal\n# Muchos servicios ofrecen alojamiento temporal gratuito para pruebas\n",[28,3116,3117,3122,3129,3144,3164,3177,3181,3186],{"__ignoreMap":141},[145,3118,3119],{"class":147,"line":148},[145,3120,3121],{"class":174},"# Opción 1: Subir a S3 (si tiene AWS)\n",[145,3123,3124,3126],{"class":147,"line":166},[145,3125,335],{"class":258},[145,3127,3128],{"class":262}," boto3\n",[145,3130,3131,3134,3136,3139,3142],{"class":147,"line":178},[145,3132,3133],{"class":262},"s3 ",[145,3135,266],{"class":258},[145,3137,3138],{"class":262}," boto3.client(",[145,3140,3141],{"class":159},"'s3'",[145,3143,392],{"class":262},[145,3145,3146,3149,3152,3154,3157,3159,3162],{"class":147,"line":187},[145,3147,3148],{"class":262},"s3.upload_file(",[145,3150,3151],{"class":159},"'imagen_local.jpg'",[145,3153,290],{"class":262},[145,3155,3156],{"class":159},"'mi-bucket'",[145,3158,290],{"class":262},[145,3160,3161],{"class":159},"'seedance/input.jpg'",[145,3163,392],{"class":262},[145,3165,3166,3169,3171,3174],{"class":147,"line":360},[145,3167,3168],{"class":262},"image_url ",[145,3170,266],{"class":258},[145,3172,3173],{"class":258}," f",[145,3175,3176],{"class":159},"\"https://mi-bucket.s3.amazonaws.com/seedance/input.jpg\"\n",[145,3178,3179],{"class":147,"line":366},[145,3180,357],{"emptyLinePlaceholder":58},[145,3182,3183],{"class":147,"line":378},[145,3184,3185],{"class":174},"# Opción 2: Usar una API de alojamiento de archivos temporal\n",[145,3187,3188],{"class":147,"line":395},[145,3189,3190],{"class":174},"# Muchos servicios ofrecen alojamiento temporal gratuito para pruebas\n",[11,3192,3193,3194,1580],{},"Para técnicas avanzadas de imagen a video — control de primer-último fotograma, composición multi-imagen y animación de productos de e-commerce — vea la ",[37,3195,3197],{"href":3196},"/blog/seedance-2-image-to-video-api","guía profunda de Imagen a Video",[45,3199],{},[48,3201,3203],{"id":3202},"personalice-sus-videos","Personalice Sus Videos",[11,3205,3206],{},"Cada parámetro que puede ajustar en una solicitud de generación:",[1849,3208,3209,3228],{},[1852,3210,3211],{},[1855,3212,3213,3216,3219,3222,3225],{},[1858,3214,3215],{},"Parámetro",[1858,3217,3218],{},"Tipo",[1858,3220,3221],{},"Por Defecto",[1858,3223,3224],{},"Opciones",[1858,3226,3227],{},"Descripción",[1865,3229,3230,3249,3265,3282,3305,3337,3359,3376,3393,3410],{},[1855,3231,3232,3236,3239,3242,3246],{},[1870,3233,3234],{},[28,3235,1559],{},[1870,3237,3238],{},"string",[1870,3240,3241],{},"—",[1870,3243,3244],{},[28,3245,1563],{},[1870,3247,3248],{},"Requerido. El modelo a usar.",[1855,3250,3251,3255,3257,3259,3262],{},[1870,3252,3253],{},[28,3254,1574],{},[1870,3256,3238],{},[1870,3258,3241],{},[1870,3260,3261],{},"≤2000 tokens",[1870,3263,3264],{},"Requerido. Descripción del video con @tags opcionales.",[1855,3266,3267,3271,3274,3276,3279],{},[1870,3268,3269],{},[28,3270,1587],{},[1870,3272,3273],{},"integer",[1870,3275,1133],{},[1870,3277,3278],{},"4–15",[1870,3280,3281],{},"Duración del video en segundos.",[1855,3283,3284,3288,3290,3294,3302],{},[1870,3285,3286],{},[28,3287,1595],{},[1870,3289,3238],{},[1870,3291,3292],{},[28,3293,1599],{},[1870,3295,3296,290,3298,290,3300],{},[28,3297,1603],{},[28,3299,1599],{},[28,3301,1607],{},[1870,3303,3304],{},"Nivel de resolución. Mayor = más créditos.",[1855,3306,3307,3311,3313,3317,3334],{},[1870,3308,3309],{},[28,3310,1615],{},[1870,3312,3238],{},[1870,3314,3315],{},[28,3316,1619],{},[1870,3318,3319,290,3321,290,3323,290,3325,290,3328,290,3331],{},[28,3320,1619],{},[28,3322,1623],{},[28,3324,1627],{},[28,3326,3327],{},"4:3",[28,3329,3330],{},"3:4",[28,3332,3333],{},"21:9",[1870,3335,3336],{},"Relación de aspecto de salida.",[1855,3338,3339,3343,3346,3350,3356],{},[1870,3340,3341],{},[28,3342,1635],{},[1870,3344,3345],{},"boolean",[1870,3347,3348],{},[28,3349,1639],{},[1870,3351,3352,290,3354],{},[28,3353,1639],{},[28,3355,2749],{},[1870,3357,3358],{},"Habilitar audio/música generado por IA.",[1855,3360,3361,3365,3368,3370,3373],{},[1870,3362,3363],{},[28,3364,2710],{},[1870,3366,3367],{},"array",[1870,3369,3241],{},[1870,3371,3372],{},"≤9 imágenes",[1870,3374,3375],{},"Imágenes de referencia. Use @Image1, @Image2... en el prompt.",[1855,3377,3378,3383,3385,3387,3390],{},[1870,3379,3380],{},[28,3381,3382],{},"video_urls",[1870,3384,3367],{},[1870,3386,3241],{},[1870,3388,3389],{},"≤3 videos",[1870,3391,3392],{},"Videos de referencia. Use @Video1, @Video2... en el prompt.",[1855,3394,3395,3400,3402,3404,3407],{},[1870,3396,3397],{},[28,3398,3399],{},"audio_urls",[1870,3401,3367],{},[1870,3403,3241],{},[1870,3405,3406],{},"≤3 archivos de audio",[1870,3408,3409],{},"Audio de referencia. Use @Audio1, @Audio2... en el prompt.",[1855,3411,3412,3417,3419,3421,3424],{},[1870,3413,3414],{},[28,3415,3416],{},"callback_url",[1870,3418,3238],{},[1870,3420,3241],{},[1870,3422,3423],{},"URL HTTPS",[1870,3425,3426],{},"Webhook para notificación de completado.",[18,3428,3429],{},[11,3430,3431,3434,3435,2774,3437,3439,3440,290,3442,3444,3445,2766,3447,3449,3450,3453],{},[23,3432,3433],{},"Nota Seedance 2.0 vs 1.5:"," Todos los parámetros anteriores funcionan con ",[28,3436,1563],{},[28,3438,30],{},". La diferencia clave: ",[28,3441,3382],{},[28,3443,3399],{}," y referencias multi-imagen (",[28,3446,2732],{},[28,3448,2769],{},") son características exclusivas de 2.0. Si las usa con 1.5, la API devuelve un error ",[28,3451,3452],{},"400"," con un mensaje claro indicando que la característica no está soportada.",[92,3455,3457],{"id":3456},"ejemplos-rápidos","Ejemplos Rápidos",[11,3459,3460],{},[23,3461,3462],{},"Video vertical para redes sociales (TikTok/Reels):",[11,3464,3465],{},[2434,3466,2436],{},[136,3468,3470],{"className":326,"code":3469,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Un barista vierte latte art en cámara lenta. Plano cenital cerrado.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\",       # Vertical para móvil\n    \"generate_audio\": True\n}\n",[28,3471,3472,3481,3492,3504,3516,3528,3544,3554],{"__ignoreMap":141},[145,3473,3474,3477,3479],{"class":147,"line":148},[145,3475,3476],{"class":262},"payload ",[145,3478,266],{"class":258},[145,3480,445],{"class":262},[145,3482,3483,3486,3488,3490],{"class":147,"line":166},[145,3484,3485],{"class":159},"    \"model\"",[145,3487,454],{"class":262},[145,3489,1083],{"class":159},[145,3491,469],{"class":262},[145,3493,3494,3497,3499,3502],{"class":147,"line":178},[145,3495,3496],{"class":159},"    \"prompt\"",[145,3498,454],{"class":262},[145,3500,3501],{"class":159},"\"Un barista vierte latte art en cámara lenta. Plano cenital cerrado.\"",[145,3503,469],{"class":262},[145,3505,3506,3509,3511,3514],{"class":147,"line":187},[145,3507,3508],{"class":159},"    \"duration\"",[145,3510,454],{"class":262},[145,3512,3513],{"class":155},"8",[145,3515,469],{"class":262},[145,3517,3518,3521,3523,3526],{"class":147,"line":360},[145,3519,3520],{"class":159},"    \"quality\"",[145,3522,454],{"class":262},[145,3524,3525],{"class":159},"\"1080p\"",[145,3527,469],{"class":262},[145,3529,3530,3533,3535,3538,3541],{"class":147,"line":366},[145,3531,3532],{"class":159},"    \"aspect_ratio\"",[145,3534,454],{"class":262},[145,3536,3537],{"class":159},"\"9:16\"",[145,3539,3540],{"class":262},",       ",[145,3542,3543],{"class":174},"# Vertical para móvil\n",[145,3545,3546,3549,3551],{"class":147,"line":378},[145,3547,3548],{"class":159},"    \"generate_audio\"",[145,3550,454],{"class":262},[145,3552,3553],{"class":155},"True\n",[145,3555,3556],{"class":147,"line":395},[145,3557,486],{"class":262},[11,3559,3560,3561,3563,3564,3566],{},"La relación de aspecto ",[28,3562,1623],{}," genera un video de 1080×1920 — resolución nativa para TikTok, Instagram Reels y YouTube Shorts. El nivel de calidad ",[28,3565,1607],{}," asegura visuales nítidos en pantallas móviles.",[11,3568,3569],{},[23,3570,3571],{},"Pantalla ancha cinematográfica con movimiento de cámara:",[136,3573,3575],{"className":326,"code":3574,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Toma aérea con drone sobre una cordillera brumosa al amanecer. \"\n        \"La cámara avanza lentamente, revelando un valle oculto. \"\n        \"Gradación de color cinematográfica, iluminación volumétrica.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"21:9\",       # Ultra-ancho cinematográfico\n    \"generate_audio\": True\n}\n",[28,3576,3577,3585,3595,3601,3606,3611,3616,3621,3631,3641,3655,3663],{"__ignoreMap":141},[145,3578,3579,3581,3583],{"class":147,"line":148},[145,3580,3476],{"class":262},[145,3582,266],{"class":258},[145,3584,445],{"class":262},[145,3586,3587,3589,3591,3593],{"class":147,"line":166},[145,3588,3485],{"class":159},[145,3590,454],{"class":262},[145,3592,1083],{"class":159},[145,3594,469],{"class":262},[145,3596,3597,3599],{"class":147,"line":178},[145,3598,3496],{"class":159},[145,3600,1098],{"class":262},[145,3602,3603],{"class":147,"line":187},[145,3604,3605],{"class":159},"        \"Toma aérea con drone sobre una cordillera brumosa al amanecer. \"\n",[145,3607,3608],{"class":147,"line":360},[145,3609,3610],{"class":159},"        \"La cámara avanza lentamente, revelando un valle oculto. \"\n",[145,3612,3613],{"class":147,"line":366},[145,3614,3615],{"class":159},"        \"Gradación de color cinematográfica, iluminación volumétrica.\"\n",[145,3617,3618],{"class":147,"line":378},[145,3619,3620],{"class":262},"    ),\n",[145,3622,3623,3625,3627,3629],{"class":147,"line":395},[145,3624,3508],{"class":159},[145,3626,454],{"class":262},[145,3628,513],{"class":155},[145,3630,469],{"class":262},[145,3632,3633,3635,3637,3639],{"class":147,"line":400},[145,3634,3520],{"class":159},[145,3636,454],{"class":262},[145,3638,3525],{"class":159},[145,3640,469],{"class":262},[145,3642,3643,3645,3647,3650,3652],{"class":147,"line":415},[145,3644,3532],{"class":159},[145,3646,454],{"class":262},[145,3648,3649],{"class":159},"\"21:9\"",[145,3651,3540],{"class":262},[145,3653,3654],{"class":174},"# Ultra-ancho cinematográfico\n",[145,3656,3657,3659,3661],{"class":147,"line":432},[145,3658,3548],{"class":159},[145,3660,454],{"class":262},[145,3662,3553],{"class":155},[145,3664,3665],{"class":147,"line":437},[145,3666,486],{"class":262},[11,3668,3669,3670,1580],{},"Para control programático de cámara — zooms dolly, tomas orbitales y movimientos estilo Hitchcock — vea la ",[37,3671,3673],{"href":3672},"/blog/seedance-2-camera-movement-api","Guía de API de Movimiento de Cámara",[11,3675,3676],{},[23,3677,3678],{},"Video silencioso para fondo de sitio web:",[136,3680,3682],{"className":326,"code":3681,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Partículas fluidas abstractas en azul profundo y dorado. Movimiento lento y meditativo.\",\n    \"duration\": 15,               # Duración máxima para bucles continuos\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"21:9\",       # Fondo ancho\n    \"generate_audio\": False       # Sin audio para fondos de reproducción automática\n}\n",[28,3683,3684,3692,3702,3713,3728,3738,3751,3763],{"__ignoreMap":141},[145,3685,3686,3688,3690],{"class":147,"line":148},[145,3687,3476],{"class":262},[145,3689,266],{"class":258},[145,3691,445],{"class":262},[145,3693,3694,3696,3698,3700],{"class":147,"line":166},[145,3695,3485],{"class":159},[145,3697,454],{"class":262},[145,3699,1083],{"class":159},[145,3701,469],{"class":262},[145,3703,3704,3706,3708,3711],{"class":147,"line":178},[145,3705,3496],{"class":159},[145,3707,454],{"class":262},[145,3709,3710],{"class":159},"\"Partículas fluidas abstractas en azul profundo y dorado. Movimiento lento y meditativo.\"",[145,3712,469],{"class":262},[145,3714,3715,3717,3719,3722,3725],{"class":147,"line":187},[145,3716,3508],{"class":159},[145,3718,454],{"class":262},[145,3720,3721],{"class":155},"15",[145,3723,3724],{"class":262},",               ",[145,3726,3727],{"class":174},"# Duración máxima para bucles continuos\n",[145,3729,3730,3732,3734,3736],{"class":147,"line":360},[145,3731,3520],{"class":159},[145,3733,454],{"class":262},[145,3735,1150],{"class":159},[145,3737,469],{"class":262},[145,3739,3740,3742,3744,3746,3748],{"class":147,"line":366},[145,3741,3532],{"class":159},[145,3743,454],{"class":262},[145,3745,3649],{"class":159},[145,3747,3540],{"class":262},[145,3749,3750],{"class":174},"# Fondo ancho\n",[145,3752,3753,3755,3757,3760],{"class":147,"line":378},[145,3754,3548],{"class":159},[145,3756,454],{"class":262},[145,3758,3759],{"class":155},"False",[145,3761,3762],{"class":174},"       # Sin audio para fondos de reproducción automática\n",[145,3764,3765],{"class":147,"line":395},[145,3766,486],{"class":262},[11,3768,3769],{},[23,3770,3771],{},"Borrador económico (iteración rápida):",[136,3773,3775],{"className":326,"code":3774,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Un gato con gafas de sol sentado frente a una mesa de DJ. Iluminación de club de neón.\",\n    \"duration\": 4,                # Duración mínima = generación más rápida\n    \"quality\": \"480p\",            # Calidad más baja = créditos más baratos\n    \"aspect_ratio\": \"16:9\"\n}\n",[28,3776,3777,3785,3795,3806,3821,3835,3843],{"__ignoreMap":141},[145,3778,3779,3781,3783],{"class":147,"line":148},[145,3780,3476],{"class":262},[145,3782,266],{"class":258},[145,3784,445],{"class":262},[145,3786,3787,3789,3791,3793],{"class":147,"line":166},[145,3788,3485],{"class":159},[145,3790,454],{"class":262},[145,3792,1083],{"class":159},[145,3794,469],{"class":262},[145,3796,3797,3799,3801,3804],{"class":147,"line":178},[145,3798,3496],{"class":159},[145,3800,454],{"class":262},[145,3802,3803],{"class":159},"\"Un gato con gafas de sol sentado frente a una mesa de DJ. Iluminación de club de neón.\"",[145,3805,469],{"class":262},[145,3807,3808,3810,3812,3815,3818],{"class":147,"line":187},[145,3809,3508],{"class":159},[145,3811,454],{"class":262},[145,3813,3814],{"class":155},"4",[145,3816,3817],{"class":262},",                ",[145,3819,3820],{"class":174},"# Duración mínima = generación más rápida\n",[145,3822,3823,3825,3827,3830,3832],{"class":147,"line":360},[145,3824,3520],{"class":159},[145,3826,454],{"class":262},[145,3828,3829],{"class":159},"\"480p\"",[145,3831,1170],{"class":262},[145,3833,3834],{"class":174},"# Calidad más baja = créditos más baratos\n",[145,3836,3837,3839,3841],{"class":147,"line":366},[145,3838,3532],{"class":159},[145,3840,454],{"class":262},[145,3842,2545],{"class":159},[145,3844,3845],{"class":147,"line":378},[145,3846,486],{"class":262},[18,3848,3849],{},[11,3850,3851,3853,3854,2774,3857,3860,3861,3863],{},[23,3852,133],{}," Durante el desarrollo, use siempre ",[28,3855,3856],{},"duration: 4",[28,3858,3859],{},"quality: \"480p\"",". Esta es la combinación más barata y rápida — ideal para iterar en prompts. Una vez satisfecho con el contenido, renderice la versión final en ",[28,3862,1607],{}," con la duración deseada.",[92,3865,3867],{"id":3866},"estimación-del-costo-en-créditos","Estimación del Costo en Créditos",[11,3869,3870],{},"Los créditos escalan con la duración y calidad. Aquí hay una guía aproximada:",[1849,3872,3873,3892],{},[1852,3874,3875],{},[1855,3876,3877,3880,3883,3886,3889],{},[1858,3878,3879],{},"Calidad",[1858,3881,3882],{},"4s",[1858,3884,3885],{},"5s",[1858,3887,3888],{},"10s",[1858,3890,3891],{},"15s",[1865,3893,3894,3910,3926],{},[1855,3895,3896,3898,3901,3904,3907],{},[1870,3897,1603],{},[1870,3899,3900],{},"~8",[1870,3902,3903],{},"~10",[1870,3905,3906],{},"~20",[1870,3908,3909],{},"~30",[1855,3911,3912,3914,3917,3920,3923],{},[1870,3913,1599],{},[1870,3915,3916],{},"~14",[1870,3918,3919],{},"~18",[1870,3921,3922],{},"~36",[1870,3924,3925],{},"~53",[1855,3927,3928,3930,3933,3936,3939],{},[1870,3929,1607],{},[1870,3931,3932],{},"~22",[1870,3934,3935],{},"~28",[1870,3937,3938],{},"~55",[1870,3940,3941],{},"~83",[11,3943,3944],{},[2434,3945,3946,3947,3949,3950,3954],{},"Créditos aproximados. Los costos reales se muestran en el campo ",[28,3948,1929],{},". Consulte el ",[37,3951,3953],{"href":211,"rel":3952},[41],"panel de EvoLink"," para las tarifas actuales.",[11,3956,3957,3958,290,3961,290,3963,3965,3966,3969,3970,1580],{},"El sistema de referencias multimodales — etiquetas ",[28,3959,3960],{},"@Image",[28,3962,2773],{},[28,3964,2777],{}," — es donde Seedance 2.0 realmente brilla. Puede replicar ",[37,3967,3968],{"href":3672},"movimientos de cámara"," de videos de referencia, mantener consistencia de personajes entre tomas y sincronizar con ritmos de audio. Para una guía completa, lea ",[37,3971,3972],{"href":2781},"La Guía Definitiva de @Tags",[45,3974],{},[48,3976,3978],{"id":3977},"manejar-errores-con-elegancia","Manejar Errores con Elegancia",[11,3980,3981],{},"Las llamadas a la API fallan. Las redes se caen. Los límites de tasa se alcanzan. Así es como construir código resiliente que maneje cada escenario de error real.",[92,3983,3985],{"id":3984},"respuestas-de-error-comunes","Respuestas de Error Comunes",[11,3987,3988],{},"Cada error sigue el mismo formato:",[136,3990,3992],{"className":1669,"code":3991,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"descripción de qué salió mal\",\n    \"type\": \"categoría_del_error\",\n    \"code\": \"código_de_error_específico\"\n  }\n}\n",[28,3993,3994,3998,4005,4017,4029,4039,4043],{"__ignoreMap":141},[145,3995,3996],{"class":147,"line":148},[145,3997,1678],{"class":262},[145,3999,4000,4003],{"class":147,"line":166},[145,4001,4002],{"class":155},"  \"error\"",[145,4004,1756],{"class":262},[145,4006,4007,4010,4012,4015],{"class":147,"line":178},[145,4008,4009],{"class":155},"    \"message\"",[145,4011,454],{"class":262},[145,4013,4014],{"class":159},"\"descripción de qué salió mal\"",[145,4016,469],{"class":262},[145,4018,4019,4022,4024,4027],{"class":147,"line":187},[145,4020,4021],{"class":155},"    \"type\"",[145,4023,454],{"class":262},[145,4025,4026],{"class":159},"\"categoría_del_error\"",[145,4028,469],{"class":262},[145,4030,4031,4034,4036],{"class":147,"line":360},[145,4032,4033],{"class":155},"    \"code\"",[145,4035,454],{"class":262},[145,4037,4038],{"class":159},"\"código_de_error_específico\"\n",[145,4040,4041],{"class":147,"line":366},[145,4042,1840],{"class":262},[145,4044,4045],{"class":147,"line":378},[145,4046,486],{"class":262},[11,4048,4049,4050,4053,4054,2774,4057,4060,4061,4063,4064,4066,4067,4069],{},"El objeto ",[28,4051,4052],{},"error"," siempre contiene ",[28,4055,4056],{},"message",[28,4058,4059],{},"type",". El campo ",[28,4062,28],{}," está presente para la mayoría de los errores pero no todos. Siempre verifique ",[28,4065,4059],{}," primero, luego ",[28,4068,28],{}," para detalles específicos.",[11,4071,4072],{},"Aquí están las respuestas de error reales de la API:",[11,4074,4075],{},[23,4076,4077],{},"401 — Clave API Inválida:",[136,4079,4081],{"className":1669,"code":4080,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Invalid token (request id: 20260227225245660301729AApJNAhJ)\",\n    \"type\": \"evo_api_error\"\n  }\n}\n",[28,4082,4083,4087,4093,4104,4113,4117],{"__ignoreMap":141},[145,4084,4085],{"class":147,"line":148},[145,4086,1678],{"class":262},[145,4088,4089,4091],{"class":147,"line":166},[145,4090,4002],{"class":155},[145,4092,1756],{"class":262},[145,4094,4095,4097,4099,4102],{"class":147,"line":178},[145,4096,4009],{"class":155},[145,4098,454],{"class":262},[145,4100,4101],{"class":159},"\"Invalid token (request id: 20260227225245660301729AApJNAhJ)\"",[145,4103,469],{"class":262},[145,4105,4106,4108,4110],{"class":147,"line":187},[145,4107,4021],{"class":155},[145,4109,454],{"class":262},[145,4111,4112],{"class":159},"\"evo_api_error\"\n",[145,4114,4115],{"class":147,"line":360},[145,4116,1840],{"class":262},[145,4118,4119],{"class":147,"line":366},[145,4120,486],{"class":262},[11,4122,4123,4124,4127],{},"Esto significa que su clave API es incorrecta, expiró o fue revocada. Verifique dos veces la variable de entorno ",[28,4125,4126],{},"EVOLINK_API_KEY",". Una causa común: copiar la clave con espacios en blanco al final.",[11,4129,4130],{},[23,4131,4132],{},"400 — Campo Requerido Faltante:",[136,4134,4136],{"className":1669,"code":4135,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"prompt cannot be empty\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4137,4138,4142,4148,4159,4170,4179,4183],{"__ignoreMap":141},[145,4139,4140],{"class":147,"line":148},[145,4141,1678],{"class":262},[145,4143,4144,4146],{"class":147,"line":166},[145,4145,4002],{"class":155},[145,4147,1756],{"class":262},[145,4149,4150,4152,4154,4157],{"class":147,"line":178},[145,4151,4033],{"class":155},[145,4153,454],{"class":262},[145,4155,4156],{"class":159},"\"invalid_parameter\"",[145,4158,469],{"class":262},[145,4160,4161,4163,4165,4168],{"class":147,"line":187},[145,4162,4009],{"class":155},[145,4164,454],{"class":262},[145,4166,4167],{"class":159},"\"prompt cannot be empty\"",[145,4169,469],{"class":262},[145,4171,4172,4174,4176],{"class":147,"line":360},[145,4173,4021],{"class":155},[145,4175,454],{"class":262},[145,4177,4178],{"class":159},"\"invalid_request_error\"\n",[145,4180,4181],{"class":147,"line":366},[145,4182,1840],{"class":262},[145,4184,4185],{"class":147,"line":378},[145,4186,486],{"class":262},[11,4188,4189,4190,4192],{},"El campo ",[28,4191,1574],{}," es requerido para todas las solicitudes de generación. Esto también se activa si pasa una cadena vacía o un prompt con solo espacios en blanco.",[11,4194,4195],{},[23,4196,4197],{},"400 — Valor de Parámetro Inválido:",[136,4199,4201],{"className":1669,"code":4200,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"duration must be between 4 and 15\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4202,4203,4207,4213,4223,4234,4242,4246],{"__ignoreMap":141},[145,4204,4205],{"class":147,"line":148},[145,4206,1678],{"class":262},[145,4208,4209,4211],{"class":147,"line":166},[145,4210,4002],{"class":155},[145,4212,1756],{"class":262},[145,4214,4215,4217,4219,4221],{"class":147,"line":178},[145,4216,4033],{"class":155},[145,4218,454],{"class":262},[145,4220,4156],{"class":159},[145,4222,469],{"class":262},[145,4224,4225,4227,4229,4232],{"class":147,"line":187},[145,4226,4009],{"class":155},[145,4228,454],{"class":262},[145,4230,4231],{"class":159},"\"duration must be between 4 and 15\"",[145,4233,469],{"class":262},[145,4235,4236,4238,4240],{"class":147,"line":360},[145,4237,4021],{"class":155},[145,4239,454],{"class":262},[145,4241,4178],{"class":159},[145,4243,4244],{"class":147,"line":366},[145,4245,1840],{"class":262},[145,4247,4248],{"class":147,"line":378},[145,4249,486],{"class":262},[11,4251,4252,4253,1898,4256,4259],{},"Ocurre cuando pasa ",[28,4254,4255],{},"duration: 3",[28,4257,4258],{},"duration: 20",". El rango válido es de 4 a 15 segundos inclusive.",[11,4261,4262],{},[23,4263,4264],{},"400 — Nivel de Calidad No Soportado:",[136,4266,4268],{"className":1669,"code":4267,"language":1671,"meta":141,"style":141},"{\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,4269,4270,4274,4280,4290,4301,4309,4313],{"__ignoreMap":141},[145,4271,4272],{"class":147,"line":148},[145,4273,1678],{"class":262},[145,4275,4276,4278],{"class":147,"line":166},[145,4277,4002],{"class":155},[145,4279,1756],{"class":262},[145,4281,4282,4284,4286,4288],{"class":147,"line":178},[145,4283,4033],{"class":155},[145,4285,454],{"class":262},[145,4287,4156],{"class":159},[145,4289,469],{"class":262},[145,4291,4292,4294,4296,4299],{"class":147,"line":187},[145,4293,4009],{"class":155},[145,4295,454],{"class":262},[145,4297,4298],{"class":159},"\"quality must be one of: 480p, 720p, 1080p\"",[145,4300,469],{"class":262},[145,4302,4303,4305,4307],{"class":147,"line":360},[145,4304,4021],{"class":155},[145,4306,454],{"class":262},[145,4308,4178],{"class":159},[145,4310,4311],{"class":147,"line":366},[145,4312,1840],{"class":262},[145,4314,4315],{"class":147,"line":378},[145,4316,486],{"class":262},[11,4318,4319,4320,1898,4323,4326,4327,290,4329,1898,4331,1580],{},"Común cuando se pasa ",[28,4321,4322],{},"\"quality\": \"4k\"",[28,4324,4325],{},"\"quality\": \"hd\"",". Use las cadenas exactas: ",[28,4328,1603],{},[28,4330,1599],{},[28,4332,1607],{},[11,4334,4335],{},[23,4336,4337],{},"402 — Créditos Insuficientes:",[136,4339,4341],{"className":1669,"code":4340,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Insufficient credits. Required: 17.784, Available: 2.100\",\n    \"type\": \"insufficient_quota_error\"\n  }\n}\n",[28,4342,4343,4347,4353,4364,4373,4377],{"__ignoreMap":141},[145,4344,4345],{"class":147,"line":148},[145,4346,1678],{"class":262},[145,4348,4349,4351],{"class":147,"line":166},[145,4350,4002],{"class":155},[145,4352,1756],{"class":262},[145,4354,4355,4357,4359,4362],{"class":147,"line":178},[145,4356,4009],{"class":155},[145,4358,454],{"class":262},[145,4360,4361],{"class":159},"\"Insufficient credits. Required: 17.784, Available: 2.100\"",[145,4363,469],{"class":262},[145,4365,4366,4368,4370],{"class":147,"line":187},[145,4367,4021],{"class":155},[145,4369,454],{"class":262},[145,4371,4372],{"class":159},"\"insufficient_quota_error\"\n",[145,4374,4375],{"class":147,"line":360},[145,4376,1840],{"class":262},[145,4378,4379],{"class":147,"line":366},[145,4380,486],{"class":262},[11,4382,4383,4384,1580],{},"Su cuenta no tiene suficientes créditos. El mensaje le dice exactamente cuántos necesita versus cuántos tiene. Recargue en el ",[37,4385,3953],{"href":211,"rel":4386},[41],[11,4388,4389],{},[23,4390,4391],{},"404 — Tarea No Encontrada:",[136,4393,4395],{"className":1669,"code":4394,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Task not found\",\n    \"type\": \"invalid_request_error\",\n    \"code\": \"task_not_found\"\n  }\n}\n",[28,4396,4397,4401,4407,4418,4429,4438,4442],{"__ignoreMap":141},[145,4398,4399],{"class":147,"line":148},[145,4400,1678],{"class":262},[145,4402,4403,4405],{"class":147,"line":166},[145,4404,4002],{"class":155},[145,4406,1756],{"class":262},[145,4408,4409,4411,4413,4416],{"class":147,"line":178},[145,4410,4009],{"class":155},[145,4412,454],{"class":262},[145,4414,4415],{"class":159},"\"Task not found\"",[145,4417,469],{"class":262},[145,4419,4420,4422,4424,4427],{"class":147,"line":187},[145,4421,4021],{"class":155},[145,4423,454],{"class":262},[145,4425,4426],{"class":159},"\"invalid_request_error\"",[145,4428,469],{"class":262},[145,4430,4431,4433,4435],{"class":147,"line":360},[145,4432,4033],{"class":155},[145,4434,454],{"class":262},[145,4436,4437],{"class":159},"\"task_not_found\"\n",[145,4439,4440],{"class":147,"line":366},[145,4441,1840],{"class":262},[145,4443,4444],{"class":147,"line":378},[145,4445,486],{"class":262},[11,4447,4448,4449,4451],{},"Generalmente significa que el ID de tarea es incorrecto, o la tarea fue creada hace más de 24 horas (las tareas expiran). Verifique dos veces que está usando el campo ",[28,4450,1874],{}," de la respuesta de creación, no algún otro campo.",[11,4453,4454],{},[23,4455,4456],{},"413 — Imagen Demasiado Grande:",[136,4458,4460],{"className":1669,"code":4459,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Image file size exceeds 30MB limit\",\n    \"type\": \"request_too_large_error\"\n  }\n}\n",[28,4461,4462,4466,4472,4483,4492,4496],{"__ignoreMap":141},[145,4463,4464],{"class":147,"line":148},[145,4465,1678],{"class":262},[145,4467,4468,4470],{"class":147,"line":166},[145,4469,4002],{"class":155},[145,4471,1756],{"class":262},[145,4473,4474,4476,4478,4481],{"class":147,"line":178},[145,4475,4009],{"class":155},[145,4477,454],{"class":262},[145,4479,4480],{"class":159},"\"Image file size exceeds 30MB limit\"",[145,4482,469],{"class":262},[145,4484,4485,4487,4489],{"class":147,"line":187},[145,4486,4021],{"class":155},[145,4488,454],{"class":262},[145,4490,4491],{"class":159},"\"request_too_large_error\"\n",[145,4493,4494],{"class":147,"line":360},[145,4495,1840],{"class":262},[145,4497,4498],{"class":147,"line":366},[145,4499,486],{"class":262},[11,4501,4502],{},"Comprima su imagen antes de subirla. Para la API, la calidad visual por encima de 2–3 MB rara vez mejora los resultados.",[11,4504,4505],{},[23,4506,4507],{},"429 — Límite de Tasa Alcanzado:",[136,4509,4511],{"className":1669,"code":4510,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Rate limit exceeded. Please retry after 60 seconds.\",\n    \"type\": \"rate_limit_error\"\n  }\n}\n",[28,4512,4513,4517,4523,4534,4543,4547],{"__ignoreMap":141},[145,4514,4515],{"class":147,"line":148},[145,4516,1678],{"class":262},[145,4518,4519,4521],{"class":147,"line":166},[145,4520,4002],{"class":155},[145,4522,1756],{"class":262},[145,4524,4525,4527,4529,4532],{"class":147,"line":178},[145,4526,4009],{"class":155},[145,4528,454],{"class":262},[145,4530,4531],{"class":159},"\"Rate limit exceeded. Please retry after 60 seconds.\"",[145,4533,469],{"class":262},[145,4535,4536,4538,4540],{"class":147,"line":187},[145,4537,4021],{"class":155},[145,4539,454],{"class":262},[145,4541,4542],{"class":159},"\"rate_limit_error\"\n",[145,4544,4545],{"class":147,"line":360},[145,4546,1840],{"class":262},[145,4548,4549],{"class":147,"line":366},[145,4550,486],{"class":262},[11,4552,4553],{},"Está enviando demasiadas solicitudes. El límite predeterminado es generoso para desarrollo, pero los scripts de procesamiento por lotes pueden alcanzarlo. Implemente retroceso exponencial (ver a continuación).",[11,4555,4556],{},[23,4557,4558],{},"422 — Rechazo por Moderación de Contenido:",[136,4560,4562],{"className":1669,"code":4561,"language":1671,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Content rejected by safety filter\",\n    \"type\": \"content_policy_violation\",\n    \"code\": \"content_filtered\"\n  }\n}\n",[28,4563,4564,4568,4574,4585,4596,4605,4609],{"__ignoreMap":141},[145,4565,4566],{"class":147,"line":148},[145,4567,1678],{"class":262},[145,4569,4570,4572],{"class":147,"line":166},[145,4571,4002],{"class":155},[145,4573,1756],{"class":262},[145,4575,4576,4578,4580,4583],{"class":147,"line":178},[145,4577,4009],{"class":155},[145,4579,454],{"class":262},[145,4581,4582],{"class":159},"\"Content rejected by safety filter\"",[145,4584,469],{"class":262},[145,4586,4587,4589,4591,4594],{"class":147,"line":187},[145,4588,4021],{"class":155},[145,4590,454],{"class":262},[145,4592,4593],{"class":159},"\"content_policy_violation\"",[145,4595,469],{"class":262},[145,4597,4598,4600,4602],{"class":147,"line":360},[145,4599,4033],{"class":155},[145,4601,454],{"class":262},[145,4603,4604],{"class":159},"\"content_filtered\"\n",[145,4606,4607],{"class":147,"line":366},[145,4608,1840],{"class":262},[145,4610,4611],{"class":147,"line":378},[145,4612,486],{"class":262},[11,4614,4615,4616,4618],{},"Su prompt o imágenes de entrada activaron el sistema de moderación de contenido. Reformule su prompt para evitar contenido restringido. Los rostros humanos realistas en ",[28,4617,2710],{}," son rechazados automáticamente.",[92,4620,4622],{"id":4621},"tabla-de-referencia-de-errores","Tabla de Referencia de Errores",[1849,4624,4625,4642],{},[1852,4626,4627],{},[1855,4628,4629,4632,4634,4636,4639],{},[1858,4630,4631],{},"Código HTTP",[1858,4633,3218],{},[1858,4635,1863],{},[1858,4637,4638],{},"¿Reintentable?",[1858,4640,4641],{},"Acción",[1865,4643,4644,4662,4680,4698,4716,4734,4752,4773,4793,4813],{},[1855,4645,4646,4648,4653,4656,4659],{},[1870,4647,3452],{},[1870,4649,4650],{},[28,4651,4652],{},"invalid_request_error",[1870,4654,4655],{},"Parámetros incorrectos",[1870,4657,4658],{},"No",[1870,4660,4661],{},"Corrija su payload",[1855,4663,4664,4667,4672,4675,4677],{},[1870,4665,4666],{},"401",[1870,4668,4669],{},[28,4670,4671],{},"authentication_error",[1870,4673,4674],{},"Clave API inválida",[1870,4676,4658],{},[1870,4678,4679],{},"Verifique su clave",[1855,4681,4682,4685,4690,4693,4695],{},[1870,4683,4684],{},"402",[1870,4686,4687],{},[28,4688,4689],{},"insufficient_quota_error",[1870,4691,4692],{},"Sin créditos",[1870,4694,4658],{},[1870,4696,4697],{},"Recargue su cuenta",[1855,4699,4700,4703,4708,4711,4713],{},[1870,4701,4702],{},"404",[1870,4704,4705],{},[28,4706,4707],{},"not_found_error",[1870,4709,4710],{},"Tarea o modelo no encontrado",[1870,4712,4658],{},[1870,4714,4715],{},"Verifique task_id / nombre del modelo",[1855,4717,4718,4721,4726,4729,4731],{},[1870,4719,4720],{},"413",[1870,4722,4723],{},[28,4724,4725],{},"request_too_large_error",[1870,4727,4728],{},"Payload demasiado grande",[1870,4730,4658],{},[1870,4732,4733],{},"Reduzca tamaños de archivo",[1855,4735,4736,4739,4744,4747,4749],{},[1870,4737,4738],{},"422",[1870,4740,4741],{},[28,4742,4743],{},"content_policy_violation",[1870,4745,4746],{},"Contenido filtrado",[1870,4748,4658],{},[1870,4750,4751],{},"Reformule el prompt",[1855,4753,4754,4757,4762,4765,4770],{},[1870,4755,4756],{},"429",[1870,4758,4759],{},[28,4760,4761],{},"rate_limit_error",[1870,4763,4764],{},"Demasiadas solicitudes",[1870,4766,4767],{},[23,4768,4769],{},"Sí",[1870,4771,4772],{},"Espere 60s, reintente",[1855,4774,4775,4778,4783,4786,4790],{},[1870,4776,4777],{},"500",[1870,4779,4780],{},[28,4781,4782],{},"internal_server_error",[1870,4784,4785],{},"Problema del servidor",[1870,4787,4788],{},[23,4789,4769],{},[1870,4791,4792],{},"Reintente después de unos segundos",[1855,4794,4795,4798,4803,4806,4810],{},[1870,4796,4797],{},"502",[1870,4799,4800],{},[28,4801,4802],{},"bad_gateway",[1870,4804,4805],{},"Error upstream",[1870,4807,4808],{},[23,4809,4769],{},[1870,4811,4812],{},"Reintente después de 5s",[1855,4814,4815,4818,4823,4826,4830],{},[1870,4816,4817],{},"503",[1870,4819,4820],{},[28,4821,4822],{},"service_unavailable_error",[1870,4824,4825],{},"Servicio caído",[1870,4827,4828],{},[23,4829,4769],{},[1870,4831,4832],{},"Reintente después de 30s",[92,4834,4836],{"id":4835},"manejo-de-errores-listo-para-producción","Manejo de Errores Listo para Producción",[11,4838,4839],{},"Envuelva sus llamadas a la API con lógica de reintento para errores transitorios:",[11,4841,4842],{},[2434,4843,2436],{},[136,4845,4847],{"className":326,"code":4846,"language":328,"meta":141,"style":141},"import random\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"\n    Envía una solicitud de generación de video con reintento automático\n    para errores transitorios (429, 500, 502, 503).\n\n    Usa retroceso exponencial con jitter para evitar efecto de manada:\n    - Intento 1: espera ~1s\n    - Intento 2: espera ~2s\n    - Intento 3: espera ~4s\n\n    Los errores no reintentables (400, 401, 402, 404, 413, 422) fallan inmediatamente\n    porque reintentar no solucionará el problema subyacente.\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       # Timeout de conexión de 30s\n            )\n\n            # Éxito — devuelve el objeto de tarea\n            if response.status_code == 200:\n                return response.json()\n\n            # Parsea la respuesta de error\n            error = response.json().get(\"error\", {})\n            error_type = error.get(\"type\", \"\")\n            error_msg = error.get(\"message\", \"Error desconocido\")\n\n            # Errores no reintentables — falla inmediatamente\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"Error de API {response.status_code}: {error_msg}\"\n                )\n\n            # Errores reintentables — retroceso exponencial con jitter\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Reintento {attempt + 1}/{max_retries} \"\n                      f\"después de {wait:.1f}s ({error_type}: {error_msg})\")\n                time.sleep(wait)\n                continue\n\n        except requests.exceptions.Timeout:\n            # El servidor no respondió en 30 segundos\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Timeout. Reintento {attempt + 1}/{max_retries} \"\n                  f\"después de {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n        except requests.exceptions.ConnectionError as e:\n            # Fallo de DNS, conexión rechazada, etc.\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Error de conexión: {e}. Reintento {attempt + 1}/{max_retries} \"\n                  f\"después de {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n    raise RuntimeError(f\"Fallo tras {max_retries} reintentos\")\n",[28,4848,4849,4856,4860,4877,4882,4887,4892,4896,4901,4906,4911,4916,4920,4925,4930,4934,4950,4957,4966,4979,4990,5000,5013,5018,5022,5027,5040,5047,5051,5056,5071,5091,5107,5111,5116,5150,5160,5186,5191,5195,5200,5226,5259,5293,5334,5339,5344,5348,5356,5361,5388,5418,5437,5442,5447,5451,5463,5468,5494,5533,5551,5555,5559,5563],{"__ignoreMap":141},[145,4850,4851,4853],{"class":147,"line":148},[145,4852,335],{"class":258},[145,4854,4855],{"class":262}," random\n",[145,4857,4858],{"class":147,"line":166},[145,4859,357],{"emptyLinePlaceholder":58},[145,4861,4862,4864,4867,4870,4872,4875],{"class":147,"line":178},[145,4863,502],{"class":258},[145,4865,4866],{"class":151}," generate_video_with_retry",[145,4868,4869],{"class":262},"(payload, max_retries",[145,4871,266],{"class":258},[145,4873,4874],{"class":155},"3",[145,4876,516],{"class":262},[145,4878,4879],{"class":147,"line":187},[145,4880,4881],{"class":159},"    \"\"\"\n",[145,4883,4884],{"class":147,"line":360},[145,4885,4886],{"class":159},"    Envía una solicitud de generación de video con reintento automático\n",[145,4888,4889],{"class":147,"line":366},[145,4890,4891],{"class":159},"    para errores transitorios (429, 500, 502, 503).\n",[145,4893,4894],{"class":147,"line":378},[145,4895,357],{"emptyLinePlaceholder":58},[145,4897,4898],{"class":147,"line":395},[145,4899,4900],{"class":159},"    Usa retroceso exponencial con jitter para evitar efecto de manada:\n",[145,4902,4903],{"class":147,"line":400},[145,4904,4905],{"class":159},"    - Intento 1: espera ~1s\n",[145,4907,4908],{"class":147,"line":415},[145,4909,4910],{"class":159},"    - Intento 2: espera ~2s\n",[145,4912,4913],{"class":147,"line":432},[145,4914,4915],{"class":159},"    - Intento 3: espera ~4s\n",[145,4917,4918],{"class":147,"line":437},[145,4919,357],{"emptyLinePlaceholder":58},[145,4921,4922],{"class":147,"line":448},[145,4923,4924],{"class":159},"    Los errores no reintentables (400, 401, 402, 404, 413, 422) fallan inmediatamente\n",[145,4926,4927],{"class":147,"line":472},[145,4928,4929],{"class":159},"    porque reintentar no solucionará el problema subyacente.\n",[145,4931,4932],{"class":147,"line":483},[145,4933,4881],{"class":159},[145,4935,4936,4939,4942,4944,4947],{"class":147,"line":489},[145,4937,4938],{"class":258},"    for",[145,4940,4941],{"class":262}," attempt ",[145,4943,965],{"class":258},[145,4945,4946],{"class":155}," range",[145,4948,4949],{"class":262},"(max_retries):\n",[145,4951,4952,4955],{"class":147,"line":494},[145,4953,4954],{"class":258},"        try",[145,4956,412],{"class":262},[145,4958,4959,4962,4964],{"class":147,"line":499},[145,4960,4961],{"class":262},"            response ",[145,4963,266],{"class":258},[145,4965,1219],{"class":262},[145,4967,4968,4971,4973,4975,4977],{"class":147,"line":519},[145,4969,4970],{"class":258},"                f",[145,4972,466],{"class":159},[145,4974,571],{"class":155},[145,4976,1232],{"class":159},[145,4978,469],{"class":262},[145,4980,4981,4984,4986,4988],{"class":147,"line":525},[145,4982,4983],{"class":593},"                headers",[145,4985,266],{"class":258},[145,4987,440],{"class":155},[145,4989,469],{"class":262},[145,4991,4992,4995,4997],{"class":147,"line":536},[145,4993,4994],{"class":593},"                json",[145,4996,266],{"class":258},[145,4998,4999],{"class":262},"payload,\n",[145,5001,5002,5005,5007,5010],{"class":147,"line":541},[145,5003,5004],{"class":593},"                timeout",[145,5006,266],{"class":258},[145,5008,5009],{"class":155},"30",[145,5011,5012],{"class":174},"       # Timeout de conexión de 30s\n",[145,5014,5015],{"class":147,"line":552},[145,5016,5017],{"class":262},"            )\n",[145,5019,5020],{"class":147,"line":563},[145,5021,357],{"emptyLinePlaceholder":58},[145,5023,5024],{"class":147,"line":590},[145,5025,5026],{"class":174},"            # Éxito — devuelve el objeto de tarea\n",[145,5028,5029,5032,5034,5036,5038],{"class":147,"line":602},[145,5030,5031],{"class":258},"            if",[145,5033,2323],{"class":262},[145,5035,752],{"class":258},[145,5037,2328],{"class":155},[145,5039,412],{"class":262},[145,5041,5042,5045],{"class":147,"line":608},[145,5043,5044],{"class":258},"                return",[145,5046,622],{"class":262},[145,5048,5049],{"class":147,"line":614},[145,5050,357],{"emptyLinePlaceholder":58},[145,5052,5053],{"class":147,"line":625},[145,5054,5055],{"class":174},"            # Parsea la respuesta de error\n",[145,5057,5058,5061,5063,5066,5068],{"class":147,"line":630},[145,5059,5060],{"class":262},"            error ",[145,5062,266],{"class":258},[145,5064,5065],{"class":262}," response.json().get(",[145,5067,794],{"class":159},[145,5069,5070],{"class":262},", {})\n",[145,5072,5073,5076,5078,5081,5084,5086,5089],{"class":147,"line":647},[145,5074,5075],{"class":262},"            error_type ",[145,5077,266],{"class":258},[145,5079,5080],{"class":262}," error.get(",[145,5082,5083],{"class":159},"\"type\"",[145,5085,290],{"class":262},[145,5087,5088],{"class":159},"\"\"",[145,5090,392],{"class":262},[145,5092,5093,5095,5097,5099,5101,5103,5105],{"class":147,"line":668},[145,5094,787],{"class":262},[145,5096,266],{"class":258},[145,5098,5080],{"class":262},[145,5100,800],{"class":159},[145,5102,290],{"class":262},[145,5104,805],{"class":159},[145,5106,392],{"class":262},[145,5108,5109],{"class":147,"line":688},[145,5110,357],{"emptyLinePlaceholder":58},[145,5112,5113],{"class":147,"line":693},[145,5114,5115],{"class":174},"            # Errores no reintentables — falla inmediatamente\n",[145,5117,5118,5120,5122,5124,5126,5128,5130,5132,5134,5136,5138,5140,5142,5144,5146,5148],{"class":147,"line":738},[145,5119,5031],{"class":258},[145,5121,2323],{"class":262},[145,5123,965],{"class":258},[145,5125,114],{"class":262},[145,5127,3452],{"class":155},[145,5129,290],{"class":262},[145,5131,4666],{"class":155},[145,5133,290],{"class":262},[145,5135,4684],{"class":155},[145,5137,290],{"class":262},[145,5139,4702],{"class":155},[145,5141,290],{"class":262},[145,5143,4720],{"class":155},[145,5145,290],{"class":262},[145,5147,4738],{"class":155},[145,5149,516],{"class":262},[145,5151,5152,5155,5157],{"class":147,"line":743},[145,5153,5154],{"class":258},"                raise",[145,5156,421],{"class":155},[145,5158,5159],{"class":262},"(\n",[145,5161,5162,5165,5168,5170,5173,5175,5177,5179,5181,5183],{"class":147,"line":760},[145,5163,5164],{"class":258},"                    f",[145,5166,5167],{"class":159},"\"Error de API ",[145,5169,577],{"class":155},[145,5171,5172],{"class":262},"response.status_code",[145,5174,583],{"class":155},[145,5176,454],{"class":159},[145,5178,577],{"class":155},[145,5180,828],{"class":262},[145,5182,583],{"class":155},[145,5184,5185],{"class":159},"\"\n",[145,5187,5188],{"class":147,"line":769},[145,5189,5190],{"class":262},"                )\n",[145,5192,5193],{"class":147,"line":784},[145,5194,357],{"emptyLinePlaceholder":58},[145,5196,5197],{"class":147,"line":810},[145,5198,5199],{"class":174},"            # Errores reintentables — retroceso exponencial con jitter\n",[145,5201,5202,5204,5206,5208,5210,5212,5214,5216,5218,5220,5222,5224],{"class":147,"line":837},[145,5203,5031],{"class":258},[145,5205,2323],{"class":262},[145,5207,965],{"class":258},[145,5209,114],{"class":262},[145,5211,4756],{"class":155},[145,5213,290],{"class":262},[145,5215,4777],{"class":155},[145,5217,290],{"class":262},[145,5219,4797],{"class":155},[145,5221,290],{"class":262},[145,5223,4817],{"class":155},[145,5225,516],{"class":262},[145,5227,5228,5231,5233,5235,5238,5241,5244,5247,5250,5252,5254,5257],{"class":147,"line":842},[145,5229,5230],{"class":262},"                wait ",[145,5232,266],{"class":258},[145,5234,114],{"class":262},[145,5236,5237],{"class":155},"2",[145,5239,5240],{"class":258}," **",[145,5242,5243],{"class":262}," attempt) ",[145,5245,5246],{"class":258},"+",[145,5248,5249],{"class":262}," random.uniform(",[145,5251,663],{"class":155},[145,5253,290],{"class":262},[145,5255,5256],{"class":155},"1",[145,5258,392],{"class":262},[145,5260,5261,5264,5266,5268,5271,5273,5276,5278,5281,5283,5285,5288,5290],{"class":147,"line":848},[145,5262,5263],{"class":155},"                print",[145,5265,424],{"class":262},[145,5267,457],{"class":258},[145,5269,5270],{"class":159},"\"  Reintento ",[145,5272,577],{"class":155},[145,5274,5275],{"class":262},"attempt ",[145,5277,5246],{"class":258},[145,5279,5280],{"class":155}," 1}",[145,5282,1003],{"class":159},[145,5284,577],{"class":155},[145,5286,5287],{"class":262},"max_retries",[145,5289,583],{"class":155},[145,5291,5292],{"class":159}," \"\n",[145,5294,5295,5298,5301,5303,5306,5309,5311,5314,5316,5319,5321,5323,5325,5327,5329,5332],{"class":147,"line":853},[145,5296,5297],{"class":258},"                      f",[145,5299,5300],{"class":159},"\"después de ",[145,5302,577],{"class":155},[145,5304,5305],{"class":262},"wait",[145,5307,5308],{"class":258},":.1f",[145,5310,583],{"class":155},[145,5312,5313],{"class":159},"s (",[145,5315,577],{"class":155},[145,5317,5318],{"class":262},"error_type",[145,5320,583],{"class":155},[145,5322,454],{"class":159},[145,5324,577],{"class":155},[145,5326,828],{"class":262},[145,5328,583],{"class":155},[145,5330,5331],{"class":159},")\"",[145,5333,392],{"class":262},[145,5335,5336],{"class":147,"line":858},[145,5337,5338],{"class":262},"                time.sleep(wait)\n",[145,5340,5341],{"class":147,"line":869},[145,5342,5343],{"class":258},"                continue\n",[145,5345,5346],{"class":147,"line":875},[145,5347,357],{"emptyLinePlaceholder":58},[145,5349,5350,5353],{"class":147,"line":900},[145,5351,5352],{"class":258},"        except",[145,5354,5355],{"class":262}," requests.exceptions.Timeout:\n",[145,5357,5358],{"class":147,"line":921},[145,5359,5360],{"class":174},"            # El servidor no respondió en 30 segundos\n",[145,5362,5363,5366,5368,5370,5372,5374,5376,5378,5380,5382,5384,5386],{"class":147,"line":927},[145,5364,5365],{"class":262},"            wait ",[145,5367,266],{"class":258},[145,5369,114],{"class":262},[145,5371,5237],{"class":155},[145,5373,5240],{"class":258},[145,5375,5243],{"class":262},[145,5377,5246],{"class":258},[145,5379,5249],{"class":262},[145,5381,663],{"class":155},[145,5383,290],{"class":262},[145,5385,5256],{"class":155},[145,5387,392],{"class":262},[145,5389,5390,5393,5395,5397,5400,5402,5404,5406,5408,5410,5412,5414,5416],{"class":147,"line":932},[145,5391,5392],{"class":155},"            print",[145,5394,424],{"class":262},[145,5396,457],{"class":258},[145,5398,5399],{"class":159},"\"  Timeout. Reintento ",[145,5401,577],{"class":155},[145,5403,5275],{"class":262},[145,5405,5246],{"class":258},[145,5407,5280],{"class":155},[145,5409,1003],{"class":159},[145,5411,577],{"class":155},[145,5413,5287],{"class":262},[145,5415,583],{"class":155},[145,5417,5292],{"class":159},[145,5419,5420,5423,5425,5427,5429,5431,5433,5435],{"class":147,"line":956},[145,5421,5422],{"class":258},"                  f",[145,5424,5300],{"class":159},[145,5426,577],{"class":155},[145,5428,5305],{"class":262},[145,5430,5308],{"class":258},[145,5432,583],{"class":155},[145,5434,1369],{"class":159},[145,5436,392],{"class":262},[145,5438,5439],{"class":147,"line":981},[145,5440,5441],{"class":262},"            time.sleep(wait)\n",[145,5443,5444],{"class":147,"line":987},[145,5445,5446],{"class":258},"            continue\n",[145,5448,5449],{"class":147,"line":992},[145,5450,357],{"emptyLinePlaceholder":58},[145,5452,5453,5455,5458,5460],{"class":147,"line":1009},[145,5454,5352],{"class":258},[145,5456,5457],{"class":262}," requests.exceptions.ConnectionError ",[145,5459,950],{"class":258},[145,5461,5462],{"class":262}," e:\n",[145,5464,5465],{"class":147,"line":1044},[145,5466,5467],{"class":174},"            # Fallo de DNS, conexión rechazada, etc.\n",[145,5469,5470,5472,5474,5476,5478,5480,5482,5484,5486,5488,5490,5492],{"class":147,"line":1049},[145,5471,5365],{"class":262},[145,5473,266],{"class":258},[145,5475,114],{"class":262},[145,5477,5237],{"class":155},[145,5479,5240],{"class":258},[145,5481,5243],{"class":262},[145,5483,5246],{"class":258},[145,5485,5249],{"class":262},[145,5487,663],{"class":155},[145,5489,290],{"class":262},[145,5491,5256],{"class":155},[145,5493,392],{"class":262},[145,5495,5496,5498,5500,5502,5505,5507,5510,5512,5515,5517,5519,5521,5523,5525,5527,5529,5531],{"class":147,"line":1054},[145,5497,5392],{"class":155},[145,5499,424],{"class":262},[145,5501,457],{"class":258},[145,5503,5504],{"class":159},"\"  Error de conexión: ",[145,5506,577],{"class":155},[145,5508,5509],{"class":262},"e",[145,5511,583],{"class":155},[145,5513,5514],{"class":159},". Reintento ",[145,5516,577],{"class":155},[145,5518,5275],{"class":262},[145,5520,5246],{"class":258},[145,5522,5280],{"class":155},[145,5524,1003],{"class":159},[145,5526,577],{"class":155},[145,5528,5287],{"class":262},[145,5530,583],{"class":155},[145,5532,5292],{"class":159},[145,5534,5535,5537,5539,5541,5543,5545,5547,5549],{"class":147,"line":1065},[145,5536,5422],{"class":258},[145,5538,5300],{"class":159},[145,5540,577],{"class":155},[145,5542,5305],{"class":262},[145,5544,5308],{"class":258},[145,5546,583],{"class":155},[145,5548,1369],{"class":159},[145,5550,392],{"class":262},[145,5552,5553],{"class":147,"line":1075},[145,5554,5441],{"class":262},[145,5556,5557],{"class":147,"line":1092},[145,5558,5446],{"class":258},[145,5560,5561],{"class":147,"line":1101},[145,5562,357],{"emptyLinePlaceholder":58},[145,5564,5565,5567,5570,5572,5574,5577,5579,5581,5583,5586],{"class":147,"line":1107},[145,5566,418],{"class":258},[145,5568,5569],{"class":155}," RuntimeError",[145,5571,424],{"class":262},[145,5573,457],{"class":258},[145,5575,5576],{"class":159},"\"Fallo tras ",[145,5578,577],{"class":155},[145,5580,5287],{"class":262},[145,5582,583],{"class":155},[145,5584,5585],{"class":159}," reintentos\"",[145,5587,392],{"class":262},[11,5589,5590],{},"Esto maneja:",[97,5592,5593,5599,5605,5611,5617],{},[73,5594,5595,5598],{},[23,5596,5597],{},"Límites de tasa (429)"," — el retroceso exponencial con jitter evita reintentos sincronizados de múltiples clientes",[73,5600,5601,5604],{},[23,5602,5603],{},"Errores de servidor (500/502/503)"," — reintento automático con retraso creciente",[73,5606,5607,5610],{},[23,5608,5609],{},"Timeouts"," — timeout de 30 segundos previene bloqueos en servidores que no responden",[73,5612,5613,5616],{},[23,5614,5615],{},"Caídas de conexión"," — fallos de DNS, conexiones rechazadas, interrupciones de red",[73,5618,5619,5622],{},[23,5620,5621],{},"Errores de cliente (400/401/402/404/413/422)"," — falla inmediatamente porque reintentar no solucionará la entrada incorrecta",[18,5624,5625],{},[11,5626,5627,5629],{},[23,5628,133],{}," Para sistemas de producción, considere registrar las solicitudes fallidas con su payload completo y respuesta de error. Esto facilita mucho la depuración cuando las cosas salen mal a las 3 AM.",[92,5631,5633],{"id":5632},"validar-entrada-antes-de-llamadas-a-la-api","Validar Entrada Antes de Llamadas a la API",[11,5635,5636],{},"Ahorre créditos y tiempo detectando errores obvios localmente:",[136,5638,5640],{"className":326,"code":5639,"language":328,"meta":141,"style":141},"def validate_payload(payload):\n    \"\"\"\n    Valida un payload de generación antes de enviarlo a la API.\n    Detecta errores comunes que resultarían en errores 400.\n    \"\"\"\n    errors = []\n\n    # Campos requeridos\n    if not payload.get(\"model\"):\n        errors.append(\"'model' es requerido\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' es requerido y no puede estar vacío\")\n\n    # Rango de duración\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' debe ser 4-15, se obtuvo {duration}\")\n\n    # Valores de calidad\n    valid_qualities = {\"480p\", \"720p\", \"1080p\"}\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in valid_qualities:\n        errors.append(f\"'quality' debe ser uno de {valid_qualities}, se obtuvo '{quality}'\")\n\n    # Valores de relación de aspecto\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' debe ser uno de {valid_ratios}, se obtuvo '{ratio}'\")\n\n    # Validación de URL de imagen\n    image_urls = payload.get(\"image_urls\", [])\n    if len(image_urls) > 9:\n        errors.append(f\"Máximo 9 imágenes permitidas, se obtuvieron {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}] debe ser una URL HTTP(S)\")\n\n    if errors:\n        raise ValueError(f\"Error de validación del payload:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n\n    return True\n",[28,5641,5642,5652,5656,5661,5666,5670,5680,5684,5689,5703,5713,5739,5748,5752,5757,5775,5801,5820,5824,5829,5851,5869,5885,5915,5919,5924,5960,5978,5992,6021,6025,6030,6045,6062,6083,6098,6118,6140,6144,6151,6206,6210],{"__ignoreMap":141},[145,5643,5644,5646,5649],{"class":147,"line":148},[145,5645,502],{"class":258},[145,5647,5648],{"class":151}," validate_payload",[145,5650,5651],{"class":262},"(payload):\n",[145,5653,5654],{"class":147,"line":166},[145,5655,4881],{"class":159},[145,5657,5658],{"class":147,"line":178},[145,5659,5660],{"class":159},"    Valida un payload de generación antes de enviarlo a la API.\n",[145,5662,5663],{"class":147,"line":187},[145,5664,5665],{"class":159},"    Detecta errores comunes que resultarían en errores 400.\n",[145,5667,5668],{"class":147,"line":360},[145,5669,4881],{"class":159},[145,5671,5672,5675,5677],{"class":147,"line":366},[145,5673,5674],{"class":262},"    errors ",[145,5676,266],{"class":258},[145,5678,5679],{"class":262}," []\n",[145,5681,5682],{"class":147,"line":378},[145,5683,357],{"emptyLinePlaceholder":58},[145,5685,5686],{"class":147,"line":395},[145,5687,5688],{"class":174},"    # Campos requeridos\n",[145,5690,5691,5693,5695,5698,5701],{"class":147,"line":400},[145,5692,2320],{"class":258},[145,5694,406],{"class":258},[145,5696,5697],{"class":262}," payload.get(",[145,5699,5700],{"class":159},"\"model\"",[145,5702,516],{"class":262},[145,5704,5705,5708,5711],{"class":147,"line":415},[145,5706,5707],{"class":262},"        errors.append(",[145,5709,5710],{"class":159},"\"'model' es requerido\"",[145,5712,392],{"class":262},[145,5714,5715,5717,5719,5721,5724,5726,5729,5731,5734,5736],{"class":147,"line":432},[145,5716,2320],{"class":258},[145,5718,406],{"class":258},[145,5720,5697],{"class":262},[145,5722,5723],{"class":159},"\"prompt\"",[145,5725,947],{"class":262},[145,5727,5728],{"class":258},"or",[145,5730,406],{"class":258},[145,5732,5733],{"class":262}," payload[",[145,5735,5723],{"class":159},[145,5737,5738],{"class":262},"].strip():\n",[145,5740,5741,5743,5746],{"class":147,"line":437},[145,5742,5707],{"class":262},[145,5744,5745],{"class":159},"\"'prompt' es requerido y no puede estar vacío\"",[145,5747,392],{"class":262},[145,5749,5750],{"class":147,"line":448},[145,5751,357],{"emptyLinePlaceholder":58},[145,5753,5754],{"class":147,"line":472},[145,5755,5756],{"class":174},"    # Rango de duración\n",[145,5758,5759,5762,5764,5766,5769,5771,5773],{"class":147,"line":483},[145,5760,5761],{"class":262},"    duration ",[145,5763,266],{"class":258},[145,5765,5697],{"class":262},[145,5767,5768],{"class":159},"\"duration\"",[145,5770,290],{"class":262},[145,5772,1133],{"class":155},[145,5774,392],{"class":262},[145,5776,5777,5779,5782,5785,5788,5791,5793,5796,5799],{"class":147,"line":489},[145,5778,2320],{"class":258},[145,5780,5781],{"class":262}," duration ",[145,5783,5784],{"class":258},"\u003C",[145,5786,5787],{"class":155}," 4",[145,5789,5790],{"class":258}," or",[145,5792,5781],{"class":262},[145,5794,5795],{"class":258},">",[145,5797,5798],{"class":155}," 15",[145,5800,412],{"class":262},[145,5802,5803,5805,5807,5810,5812,5814,5816,5818],{"class":147,"line":494},[145,5804,5707],{"class":262},[145,5806,457],{"class":258},[145,5808,5809],{"class":159},"\"'duration' debe ser 4-15, se obtuvo ",[145,5811,577],{"class":155},[145,5813,1587],{"class":262},[145,5815,583],{"class":155},[145,5817,466],{"class":159},[145,5819,392],{"class":262},[145,5821,5822],{"class":147,"line":499},[145,5823,357],{"emptyLinePlaceholder":58},[145,5825,5826],{"class":147,"line":519},[145,5827,5828],{"class":174},"    # Valores de calidad\n",[145,5830,5831,5834,5836,5839,5841,5843,5845,5847,5849],{"class":147,"line":525},[145,5832,5833],{"class":262},"    valid_qualities ",[145,5835,266],{"class":258},[145,5837,5838],{"class":262}," {",[145,5840,3829],{"class":159},[145,5842,290],{"class":262},[145,5844,1150],{"class":159},[145,5846,290],{"class":262},[145,5848,3525],{"class":159},[145,5850,486],{"class":262},[145,5852,5853,5856,5858,5860,5863,5865,5867],{"class":147,"line":536},[145,5854,5855],{"class":262},"    quality ",[145,5857,266],{"class":258},[145,5859,5697],{"class":262},[145,5861,5862],{"class":159},"\"quality\"",[145,5864,290],{"class":262},[145,5866,1150],{"class":159},[145,5868,392],{"class":262},[145,5870,5871,5873,5876,5879,5882],{"class":147,"line":541},[145,5872,2320],{"class":258},[145,5874,5875],{"class":262}," quality ",[145,5877,5878],{"class":258},"not",[145,5880,5881],{"class":258}," in",[145,5883,5884],{"class":262}," valid_qualities:\n",[145,5886,5887,5889,5891,5894,5896,5899,5901,5904,5906,5908,5910,5913],{"class":147,"line":552},[145,5888,5707],{"class":262},[145,5890,457],{"class":258},[145,5892,5893],{"class":159},"\"'quality' debe ser uno de ",[145,5895,577],{"class":155},[145,5897,5898],{"class":262},"valid_qualities",[145,5900,583],{"class":155},[145,5902,5903],{"class":159},", se obtuvo '",[145,5905,577],{"class":155},[145,5907,1595],{"class":262},[145,5909,583],{"class":155},[145,5911,5912],{"class":159},"'\"",[145,5914,392],{"class":262},[145,5916,5917],{"class":147,"line":563},[145,5918,357],{"emptyLinePlaceholder":58},[145,5920,5921],{"class":147,"line":590},[145,5922,5923],{"class":174},"    # Valores de relación de aspecto\n",[145,5925,5926,5929,5931,5933,5935,5937,5939,5941,5944,5946,5949,5951,5954,5956,5958],{"class":147,"line":602},[145,5927,5928],{"class":262},"    valid_ratios ",[145,5930,266],{"class":258},[145,5932,5838],{"class":262},[145,5934,1167],{"class":159},[145,5936,290],{"class":262},[145,5938,3537],{"class":159},[145,5940,290],{"class":262},[145,5942,5943],{"class":159},"\"1:1\"",[145,5945,290],{"class":262},[145,5947,5948],{"class":159},"\"4:3\"",[145,5950,290],{"class":262},[145,5952,5953],{"class":159},"\"3:4\"",[145,5955,290],{"class":262},[145,5957,3649],{"class":159},[145,5959,486],{"class":262},[145,5961,5962,5965,5967,5969,5972,5974,5976],{"class":147,"line":608},[145,5963,5964],{"class":262},"    ratio ",[145,5966,266],{"class":258},[145,5968,5697],{"class":262},[145,5970,5971],{"class":159},"\"aspect_ratio\"",[145,5973,290],{"class":262},[145,5975,1167],{"class":159},[145,5977,392],{"class":262},[145,5979,5980,5982,5985,5987,5989],{"class":147,"line":614},[145,5981,2320],{"class":258},[145,5983,5984],{"class":262}," ratio ",[145,5986,5878],{"class":258},[145,5988,5881],{"class":258},[145,5990,5991],{"class":262}," valid_ratios:\n",[145,5993,5994,5996,5998,6001,6003,6006,6008,6010,6012,6015,6017,6019],{"class":147,"line":625},[145,5995,5707],{"class":262},[145,5997,457],{"class":258},[145,5999,6000],{"class":159},"\"'aspect_ratio' debe ser uno de ",[145,6002,577],{"class":155},[145,6004,6005],{"class":262},"valid_ratios",[145,6007,583],{"class":155},[145,6009,5903],{"class":159},[145,6011,577],{"class":155},[145,6013,6014],{"class":262},"ratio",[145,6016,583],{"class":155},[145,6018,5912],{"class":159},[145,6020,392],{"class":262},[145,6022,6023],{"class":147,"line":630},[145,6024,357],{"emptyLinePlaceholder":58},[145,6026,6027],{"class":147,"line":647},[145,6028,6029],{"class":174},"    # Validación de URL de imagen\n",[145,6031,6032,6035,6037,6039,6042],{"class":147,"line":668},[145,6033,6034],{"class":262},"    image_urls ",[145,6036,266],{"class":258},[145,6038,5697],{"class":262},[145,6040,6041],{"class":159},"\"image_urls\"",[145,6043,6044],{"class":262},", [])\n",[145,6046,6047,6049,6052,6055,6057,6060],{"class":147,"line":688},[145,6048,2320],{"class":258},[145,6050,6051],{"class":155}," len",[145,6053,6054],{"class":262},"(image_urls) ",[145,6056,5795],{"class":258},[145,6058,6059],{"class":155}," 9",[145,6061,412],{"class":262},[145,6063,6064,6066,6068,6071,6074,6077,6079,6081],{"class":147,"line":693},[145,6065,5707],{"class":262},[145,6067,457],{"class":258},[145,6069,6070],{"class":159},"\"Máximo 9 imágenes permitidas, se obtuvieron ",[145,6072,6073],{"class":155},"{len",[145,6075,6076],{"class":262},"(image_urls)",[145,6078,583],{"class":155},[145,6080,466],{"class":159},[145,6082,392],{"class":262},[145,6084,6085,6087,6090,6092,6095],{"class":147,"line":738},[145,6086,4938],{"class":258},[145,6088,6089],{"class":262}," i, url ",[145,6091,965],{"class":258},[145,6093,6094],{"class":155}," enumerate",[145,6096,6097],{"class":262},"(image_urls):\n",[145,6099,6100,6102,6104,6107,6110,6112,6115],{"class":147,"line":743},[145,6101,746],{"class":258},[145,6103,406],{"class":258},[145,6105,6106],{"class":262}," url.startswith((",[145,6108,6109],{"class":159},"\"http://\"",[145,6111,290],{"class":262},[145,6113,6114],{"class":159},"\"https://\"",[145,6116,6117],{"class":262},")):\n",[145,6119,6120,6123,6125,6128,6130,6133,6135,6138],{"class":147,"line":760},[145,6121,6122],{"class":262},"            errors.append(",[145,6124,457],{"class":258},[145,6126,6127],{"class":159},"\"image_urls[",[145,6129,577],{"class":155},[145,6131,6132],{"class":262},"i",[145,6134,583],{"class":155},[145,6136,6137],{"class":159},"] debe ser una URL HTTP(S)\"",[145,6139,392],{"class":262},[145,6141,6142],{"class":147,"line":769},[145,6143,357],{"emptyLinePlaceholder":58},[145,6145,6146,6148],{"class":147,"line":784},[145,6147,2320],{"class":258},[145,6149,6150],{"class":262}," errors:\n",[145,6152,6153,6156,6158,6160,6162,6165,6167,6169,6172,6175,6177,6179,6182,6184,6187,6189,6191,6193,6195,6198,6201,6203],{"class":147,"line":810},[145,6154,6155],{"class":258},"        raise",[145,6157,421],{"class":155},[145,6159,424],{"class":262},[145,6161,457],{"class":258},[145,6163,6164],{"class":159},"\"Error de validación del payload:",[145,6166,1476],{"class":155},[145,6168,466],{"class":159},[145,6170,6171],{"class":258}," +",[145,6173,6174],{"class":159}," \"",[145,6176,1476],{"class":155},[145,6178,466],{"class":159},[145,6180,6181],{"class":262},".join(",[145,6183,457],{"class":258},[145,6185,6186],{"class":159},"\"  - ",[145,6188,577],{"class":155},[145,6190,5509],{"class":262},[145,6192,583],{"class":155},[145,6194,466],{"class":159},[145,6196,6197],{"class":258}," for",[145,6199,6200],{"class":262}," e ",[145,6202,965],{"class":258},[145,6204,6205],{"class":262}," errors))\n",[145,6207,6208],{"class":147,"line":837},[145,6209,357],{"emptyLinePlaceholder":58},[145,6211,6212,6214],{"class":147,"line":842},[145,6213,1512],{"class":258},[145,6215,6216],{"class":155}," True\n",[18,6218,6219],{},[11,6220,6221,6223,6224,6227],{},[23,6222,2019],{}," Olvidar codificar URL los caracteres especiales en las URLs de imagen. Si la ruta de su imagen contiene espacios o caracteres no ASCII, use ",[28,6225,6226],{},"urllib.parse.quote()"," para codificarla.",[45,6229],{},[48,6231,6233],{"id":6232},"configurar-webhooks-omita-el-polling","Configurar Webhooks (Omita el Polling)",[11,6235,6236,6237,6240],{},"El polling funciona bien para scripts y prototipos. Para sistemas de producción, los ",[23,6238,6239],{},"webhooks"," son más eficientes — la API envía el resultado a su servidor cuando el video está listo. Sin solicitudes desperdiciadas, sin retraso entre la finalización y la notificación.",[92,6242,6244],{"id":6243},"cómo-funciona","Cómo Funciona",[11,6246,6247,6248,6250],{},"Agregue ",[28,6249,3416],{}," a su solicitud de generación:",[11,6252,6253],{},[2434,6254,6255],{},"Usa la misma configuración del primer ejemplo anterior.",[136,6257,6259],{"className":326,"code":6258,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Una nave espacial despega desde un paisaje desértico al atardecer.\",\n    \"duration\": 8,\n    \"quality\": \"720p\",\n    \"callback_url\": \"https://su-servidor.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\"Tarea enviada: {task['id']}\")\n# No se necesita polling — su webhook recibirá el resultado\n",[28,6260,6261,6269,6279,6290,6300,6310,6320,6324,6328,6337,6350,6361,6370,6374,6383,6409],{"__ignoreMap":141},[145,6262,6263,6265,6267],{"class":147,"line":148},[145,6264,3476],{"class":262},[145,6266,266],{"class":258},[145,6268,445],{"class":262},[145,6270,6271,6273,6275,6277],{"class":147,"line":166},[145,6272,3485],{"class":159},[145,6274,454],{"class":262},[145,6276,1083],{"class":159},[145,6278,469],{"class":262},[145,6280,6281,6283,6285,6288],{"class":147,"line":178},[145,6282,3496],{"class":159},[145,6284,454],{"class":262},[145,6286,6287],{"class":159},"\"Una nave espacial despega desde un paisaje desértico al atardecer.\"",[145,6289,469],{"class":262},[145,6291,6292,6294,6296,6298],{"class":147,"line":187},[145,6293,3508],{"class":159},[145,6295,454],{"class":262},[145,6297,3513],{"class":155},[145,6299,469],{"class":262},[145,6301,6302,6304,6306,6308],{"class":147,"line":360},[145,6303,3520],{"class":159},[145,6305,454],{"class":262},[145,6307,1150],{"class":159},[145,6309,469],{"class":262},[145,6311,6312,6315,6317],{"class":147,"line":366},[145,6313,6314],{"class":159},"    \"callback_url\"",[145,6316,454],{"class":262},[145,6318,6319],{"class":159},"\"https://su-servidor.com/api/webhook/seedance\"\n",[145,6321,6322],{"class":147,"line":378},[145,6323,486],{"class":262},[145,6325,6326],{"class":147,"line":395},[145,6327,357],{"emptyLinePlaceholder":58},[145,6329,6330,6333,6335],{"class":147,"line":400},[145,6331,6332],{"class":262},"response ",[145,6334,266],{"class":258},[145,6336,1219],{"class":262},[145,6338,6339,6342,6344,6346,6348],{"class":147,"line":415},[145,6340,6341],{"class":258},"    f",[145,6343,466],{"class":159},[145,6345,571],{"class":155},[145,6347,1232],{"class":159},[145,6349,469],{"class":262},[145,6351,6352,6355,6357,6359],{"class":147,"line":432},[145,6353,6354],{"class":593},"    headers",[145,6356,266],{"class":258},[145,6358,440],{"class":155},[145,6360,469],{"class":262},[145,6362,6363,6366,6368],{"class":147,"line":437},[145,6364,6365],{"class":593},"    json",[145,6367,266],{"class":258},[145,6369,2603],{"class":262},[145,6371,6372],{"class":147,"line":448},[145,6373,392],{"class":262},[145,6375,6376,6379,6381],{"class":147,"line":472},[145,6377,6378],{"class":262},"task ",[145,6380,266],{"class":258},[145,6382,622],{"class":262},[145,6384,6385,6388,6390,6392,6395,6397,6399,6401,6403,6405,6407],{"class":147,"line":483},[145,6386,6387],{"class":155},"print",[145,6389,424],{"class":262},[145,6391,457],{"class":258},[145,6393,6394],{"class":159},"\"Tarea enviada: ",[145,6396,577],{"class":155},[145,6398,1325],{"class":262},[145,6400,1328],{"class":159},[145,6402,1331],{"class":262},[145,6404,583],{"class":155},[145,6406,466],{"class":159},[145,6408,392],{"class":262},[145,6410,6411],{"class":147,"line":489},[145,6412,6413],{"class":174},"# No se necesita polling — su webhook recibirá el resultado\n",[11,6415,6416,6417,6419],{},"Cuando el video está listo, la API envía una solicitud POST a su ",[28,6418,3416],{}," con el objeto de tarea completado — exactamente el mismo payload que obtendría del polling.",[92,6421,6423],{"id":6422},"requisitos-del-webhook","Requisitos del Webhook",[1849,6425,6426,6436],{},[1852,6427,6428],{},[1855,6429,6430,6433],{},[1858,6431,6432],{},"Requisito",[1858,6434,6435],{},"Detalles",[1865,6437,6438,6446,6454,6462,6470,6478],{},[1855,6439,6440,6443],{},[1870,6441,6442],{},"Protocolo",[1870,6444,6445],{},"Solo HTTPS (sin HTTP) — requerido por seguridad",[1855,6447,6448,6451],{},[1870,6449,6450],{},"Respuesta",[1870,6452,6453],{},"Devuelva 2xx dentro de 10 segundos",[1855,6455,6456,6459],{},[1870,6457,6458],{},"Reintentos",[1870,6460,6461],{},"3 intentos en caso de fallo (intervalos de 1s, 2s, 4s)",[1855,6463,6464,6467],{},[1870,6465,6466],{},"Longitud de URL",[1870,6468,6469],{},"≤ 2048 caracteres",[1855,6471,6472,6475],{},[1870,6473,6474],{},"Red",[1870,6476,6477],{},"Sin IPs internas/privadas (localhost, 10.x.x.x, 192.168.x.x)",[1855,6479,6480,6483],{},[1870,6481,6482],{},"Cuerpo",[1870,6484,6485],{},"POST JSON con el objeto de tarea completo",[92,6487,6489],{"id":6488},"receptor-de-webhook-flask-listo-para-producción","Receptor de Webhook Flask Listo para Producción",[11,6491,6492],{},"Aquí hay un servidor de webhook completo usando Flask con validación adecuada, manejo de errores y descarga asíncrona de videos:",[136,6494,6496],{"className":326,"code":6495,"language":328,"meta":141,"style":141},"# webhook_server.py\n\"\"\"\nReceptor de webhook de Seedance — maneja callbacks de completado de video.\nEjecute: 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  # renombrado para evitar conflicto con flask.request\n\napp = Flask(__name__)\n\n# Directorio para guardar videos completados\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    \"\"\"Descarga video en un hilo en segundo plano para no bloquear la respuesta del webhook.\"\"\"\n    try:\n        filename = os.path.join(OUTPUT_DIR, f\"{task_id}.mp4\")\n        print(f\"  Descargando {task_id} a {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\"  Guardado: {filename} ({size_mb:.1f} MB)\")\n    except Exception as e:\n        print(f\"  Descarga fallida para {task_id}: {e}\")\n\n\n@app.route(\"/api/webhook/seedance\", methods=[\"POST\"])\ndef handle_webhook():\n    \"\"\"\n    Maneja el webhook de completado de video de Seedance.\n\n    La API envía un POST con el objeto de tarea completo cuando\n    una generación de video se completa (éxito o fallo).\n    \"\"\"\n    # Parsea el objeto de tarea entrante\n    task = request.json\n    if not task:\n        return jsonify({\"error\": \"Cuerpo vacío\"}), 400\n\n    task_id = task.get(\"id\", \"desconocido\")\n    status = task.get(\"status\", \"desconocido\")\n    model = task.get(\"model\", \"desconocido\")\n\n    print(f\"\\n{'='*50}\")\n    print(f\"Webhook recibido: tarea={task_id}\")\n    print(f\"  Estado: {status}\")\n    print(f\"  Modelo: {model}\")\n\n    if status == \"completed\":\n        # Extrae URL(s) de video de los resultados\n        results = task.get(\"results\", [])\n        if results:\n            video_url = results[0]\n            print(f\"  URL del video: {video_url}\")\n\n            # Descarga en hilo en segundo plano para responder rápidamente\n            thread = threading.Thread(\n                target=download_video_async,\n                args=(video_url, task_id)\n            )\n            thread.start()\n        else:\n            print(f\"  ADVERTENCIA: Completado pero sin array de resultados!\")\n\n    elif status == \"failed\":\n        error_info = task.get(\"error\", {})\n        print(f\"  FALLIDO: {json.dumps(error_info, indent=2)}\")\n        # TODO: Registrar en su sistema de seguimiento de errores (Sentry, etc.)\n        # TODO: Opcionalmente reintentar la generación con parámetros modificados\n\n    else:\n        print(f\"  Estado inesperado: {status}\")\n        print(f\"  Payload completo: {json.dumps(task, indent=2)}\")\n\n    # Siempre devuelve 200 rápidamente — la API espera una respuesta en 10s\n    return jsonify({\"received\": True, \"task_id\": task_id}), 200\n\n\n@app.route(\"/health\", methods=[\"GET\"])\ndef health_check():\n    \"\"\"Endpoint de verificación de salud para balanceadores de carga.\"\"\"\n    return jsonify({\"status\": \"ok\"}), 200\n\n\nif __name__ == \"__main__\":\n    print(f\"Iniciando servidor de webhook...\")\n    print(f\"Los videos se guardarán en: {os.path.abspath(OUTPUT_DIR)}\")\n    print(f\"URL del webhook: http://localhost:5000/api/webhook/seedance\")\n    app.run(host=\"0.0.0.0\", port=5000, debug=True)\n",[28,6497,6498,6503,6508,6513,6518,6523,6527,6540,6547,6553,6560,6575,6579,6594,6598,6603,6623,6641,6645,6649,6659,6664,6671,6700,6729,6757,6762,6779,6799,6804,6828,6861,6873,6902,6906,6910,6935,6944,6948,6953,6957,6962,6967,6971,6976,6985,6994,7015,7019,7037,7054,7071,7075,7101,7122,7143,7164,7168,7180,7185,7198,7205,7219,7240,7244,7249,7259,7269,7279,7283,7288,7295,7308,7312,7325,7338,7369,7380,7389,7393,7399,7420,7450,7454,7459,7483,7487,7491,7513,7522,7527,7544,7548,7552,7564,7577,7603,7616],{"__ignoreMap":141},[145,6499,6500],{"class":147,"line":148},[145,6501,6502],{"class":174},"# webhook_server.py\n",[145,6504,6505],{"class":147,"line":166},[145,6506,6507],{"class":159},"\"\"\"\n",[145,6509,6510],{"class":147,"line":178},[145,6511,6512],{"class":159},"Receptor de webhook de Seedance — maneja callbacks de completado de video.\n",[145,6514,6515],{"class":147,"line":187},[145,6516,6517],{"class":159},"Ejecute: pip install flask requests\n",[145,6519,6520],{"class":147,"line":360},[145,6521,6522],{"class":159},"         python webhook_server.py\n",[145,6524,6525],{"class":147,"line":366},[145,6526,6507],{"class":159},[145,6528,6529,6532,6535,6537],{"class":147,"line":378},[145,6530,6531],{"class":258},"from",[145,6533,6534],{"class":262}," flask ",[145,6536,335],{"class":258},[145,6538,6539],{"class":262}," Flask, request, jsonify\n",[145,6541,6542,6544],{"class":147,"line":395},[145,6543,335],{"class":258},[145,6545,6546],{"class":262}," json\n",[145,6548,6549,6551],{"class":147,"line":400},[145,6550,335],{"class":258},[145,6552,338],{"class":262},[145,6554,6555,6557],{"class":147,"line":415},[145,6556,335],{"class":258},[145,6558,6559],{"class":262}," threading\n",[145,6561,6562,6564,6567,6569,6572],{"class":147,"line":432},[145,6563,335],{"class":258},[145,6565,6566],{"class":262}," requests ",[145,6568,950],{"class":258},[145,6570,6571],{"class":262}," req  ",[145,6573,6574],{"class":174},"# renombrado para evitar conflicto con flask.request\n",[145,6576,6577],{"class":147,"line":437},[145,6578,357],{"emptyLinePlaceholder":58},[145,6580,6581,6584,6586,6589,6592],{"class":147,"line":448},[145,6582,6583],{"class":262},"app ",[145,6585,266],{"class":258},[145,6587,6588],{"class":262}," Flask(",[145,6590,6591],{"class":155},"__name__",[145,6593,392],{"class":262},[145,6595,6596],{"class":147,"line":472},[145,6597,357],{"emptyLinePlaceholder":58},[145,6599,6600],{"class":147,"line":483},[145,6601,6602],{"class":174},"# Directorio para guardar videos completados\n",[145,6604,6605,6608,6610,6613,6616,6618,6621],{"class":147,"line":489},[145,6606,6607],{"class":155},"OUTPUT_DIR",[145,6609,372],{"class":258},[145,6611,6612],{"class":262}," os.getenv(",[145,6614,6615],{"class":159},"\"VIDEO_OUTPUT_DIR\"",[145,6617,290],{"class":262},[145,6619,6620],{"class":159},"\"./videos\"",[145,6622,392],{"class":262},[145,6624,6625,6628,6630,6632,6635,6637,6639],{"class":147,"line":494},[145,6626,6627],{"class":262},"os.makedirs(",[145,6629,6607],{"class":155},[145,6631,290],{"class":262},[145,6633,6634],{"class":593},"exist_ok",[145,6636,266],{"class":258},[145,6638,916],{"class":155},[145,6640,392],{"class":262},[145,6642,6643],{"class":147,"line":499},[145,6644,357],{"emptyLinePlaceholder":58},[145,6646,6647],{"class":147,"line":519},[145,6648,357],{"emptyLinePlaceholder":58},[145,6650,6651,6653,6656],{"class":147,"line":525},[145,6652,502],{"class":258},[145,6654,6655],{"class":151}," download_video_async",[145,6657,6658],{"class":262},"(video_url, task_id):\n",[145,6660,6661],{"class":147,"line":536},[145,6662,6663],{"class":159},"    \"\"\"Descarga video en un hilo en segundo plano para no bloquear la respuesta del webhook.\"\"\"\n",[145,6665,6666,6669],{"class":147,"line":541},[145,6667,6668],{"class":258},"    try",[145,6670,412],{"class":262},[145,6672,6673,6676,6678,6681,6683,6685,6687,6689,6691,6693,6695,6698],{"class":147,"line":552},[145,6674,6675],{"class":262},"        filename ",[145,6677,266],{"class":258},[145,6679,6680],{"class":262}," os.path.join(",[145,6682,6607],{"class":155},[145,6684,290],{"class":262},[145,6686,457],{"class":258},[145,6688,466],{"class":159},[145,6690,577],{"class":155},[145,6692,580],{"class":262},[145,6694,583],{"class":155},[145,6696,6697],{"class":159},".mp4\"",[145,6699,392],{"class":262},[145,6701,6702,6704,6706,6708,6711,6713,6715,6717,6719,6721,6723,6725,6727],{"class":147,"line":563},[145,6703,696],{"class":155},[145,6705,424],{"class":262},[145,6707,457],{"class":258},[145,6709,6710],{"class":159},"\"  Descargando ",[145,6712,577],{"class":155},[145,6714,580],{"class":262},[145,6716,583],{"class":155},[145,6718,2766],{"class":159},[145,6720,577],{"class":155},[145,6722,890],{"class":262},[145,6724,583],{"class":155},[145,6726,895],{"class":159},[145,6728,392],{"class":262},[145,6730,6731,6734,6736,6739,6741,6743,6745,6747,6750,6752,6755],{"class":147,"line":590},[145,6732,6733],{"class":262},"        resp ",[145,6735,266],{"class":258},[145,6737,6738],{"class":262}," req.get(video_url, ",[145,6740,911],{"class":593},[145,6742,266],{"class":258},[145,6744,916],{"class":155},[145,6746,290],{"class":262},[145,6748,6749],{"class":593},"timeout",[145,6751,266],{"class":258},[145,6753,6754],{"class":155},"120",[145,6756,392],{"class":262},[145,6758,6759],{"class":147,"line":602},[145,6760,6761],{"class":262},"        resp.raise_for_status()\n",[145,6763,6764,6767,6769,6771,6773,6775,6777],{"class":147,"line":608},[145,6765,6766],{"class":258},"        with",[145,6768,938],{"class":155},[145,6770,941],{"class":262},[145,6772,944],{"class":159},[145,6774,947],{"class":262},[145,6776,950],{"class":258},[145,6778,953],{"class":262},[145,6780,6781,6784,6786,6788,6791,6793,6795,6797],{"class":147,"line":614},[145,6782,6783],{"class":258},"            for",[145,6785,962],{"class":262},[145,6787,965],{"class":258},[145,6789,6790],{"class":262}," resp.iter_content(",[145,6792,971],{"class":593},[145,6794,266],{"class":258},[145,6796,976],{"class":155},[145,6798,516],{"class":262},[145,6800,6801],{"class":147,"line":625},[145,6802,6803],{"class":262},"                f.write(chunk)\n",[145,6805,6806,6809,6811,6813,6815,6817,6820,6823,6826],{"class":147,"line":630},[145,6807,6808],{"class":262},"        size_mb ",[145,6810,266],{"class":258},[145,6812,1000],{"class":262},[145,6814,1003],{"class":258},[145,6816,114],{"class":262},[145,6818,6819],{"class":155},"1024",[145,6821,6822],{"class":258}," *",[145,6824,6825],{"class":155}," 1024",[145,6827,392],{"class":262},[145,6829,6830,6832,6834,6836,6839,6841,6843,6845,6847,6849,6852,6854,6856,6859],{"class":147,"line":647},[145,6831,696],{"class":155},[145,6833,424],{"class":262},[145,6835,457],{"class":258},[145,6837,6838],{"class":159},"\"  Guardado: ",[145,6840,577],{"class":155},[145,6842,890],{"class":262},[145,6844,583],{"class":155},[145,6846,114],{"class":159},[145,6848,577],{"class":155},[145,6850,6851],{"class":262},"size_mb",[145,6853,5308],{"class":258},[145,6855,583],{"class":155},[145,6857,6858],{"class":159}," MB)\"",[145,6860,392],{"class":262},[145,6862,6863,6866,6868,6871],{"class":147,"line":668},[145,6864,6865],{"class":258},"    except",[145,6867,816],{"class":155},[145,6869,6870],{"class":258}," as",[145,6872,5462],{"class":262},[145,6874,6875,6877,6879,6881,6884,6886,6888,6890,6892,6894,6896,6898,6900],{"class":147,"line":688},[145,6876,696],{"class":155},[145,6878,424],{"class":262},[145,6880,457],{"class":258},[145,6882,6883],{"class":159},"\"  Descarga fallida para ",[145,6885,577],{"class":155},[145,6887,580],{"class":262},[145,6889,583],{"class":155},[145,6891,454],{"class":159},[145,6893,577],{"class":155},[145,6895,5509],{"class":262},[145,6897,583],{"class":155},[145,6899,466],{"class":159},[145,6901,392],{"class":262},[145,6903,6904],{"class":147,"line":693},[145,6905,357],{"emptyLinePlaceholder":58},[145,6907,6908],{"class":147,"line":738},[145,6909,357],{"emptyLinePlaceholder":58},[145,6911,6912,6915,6917,6920,6922,6925,6927,6930,6933],{"class":147,"line":743},[145,6913,6914],{"class":151},"@app.route",[145,6916,424],{"class":262},[145,6918,6919],{"class":159},"\"/api/webhook/seedance\"",[145,6921,290],{"class":262},[145,6923,6924],{"class":593},"methods",[145,6926,266],{"class":258},[145,6928,6929],{"class":262},"[",[145,6931,6932],{"class":159},"\"POST\"",[145,6934,1431],{"class":262},[145,6936,6937,6939,6942],{"class":147,"line":760},[145,6938,502],{"class":258},[145,6940,6941],{"class":151}," handle_webhook",[145,6943,1062],{"class":262},[145,6945,6946],{"class":147,"line":769},[145,6947,4881],{"class":159},[145,6949,6950],{"class":147,"line":784},[145,6951,6952],{"class":159},"    Maneja el webhook de completado de video de Seedance.\n",[145,6954,6955],{"class":147,"line":810},[145,6956,357],{"emptyLinePlaceholder":58},[145,6958,6959],{"class":147,"line":837},[145,6960,6961],{"class":159},"    La API envía un POST con el objeto de tarea completo cuando\n",[145,6963,6964],{"class":147,"line":842},[145,6965,6966],{"class":159},"    una generación de video se completa (éxito o fallo).\n",[145,6968,6969],{"class":147,"line":848},[145,6970,4881],{"class":159},[145,6972,6973],{"class":147,"line":853},[145,6974,6975],{"class":174},"    # Parsea el objeto de tarea entrante\n",[145,6977,6978,6980,6982],{"class":147,"line":858},[145,6979,1289],{"class":262},[145,6981,266],{"class":258},[145,6983,6984],{"class":262}," request.json\n",[145,6986,6987,6989,6991],{"class":147,"line":869},[145,6988,2320],{"class":258},[145,6990,406],{"class":258},[145,6992,6993],{"class":262}," task:\n",[145,6995,6996,6999,7002,7004,7006,7009,7012],{"class":147,"line":875},[145,6997,6998],{"class":258},"        return",[145,7000,7001],{"class":262}," jsonify({",[145,7003,794],{"class":159},[145,7005,454],{"class":262},[145,7007,7008],{"class":159},"\"Cuerpo vacío\"",[145,7010,7011],{"class":262},"}), ",[145,7013,7014],{"class":155},"400\n",[145,7016,7017],{"class":147,"line":900},[145,7018,357],{"emptyLinePlaceholder":58},[145,7020,7021,7024,7026,7028,7030,7032,7035],{"class":147,"line":921},[145,7022,7023],{"class":262},"    task_id ",[145,7025,266],{"class":258},[145,7027,655],{"class":262},[145,7029,1428],{"class":159},[145,7031,290],{"class":262},[145,7033,7034],{"class":159},"\"desconocido\"",[145,7036,392],{"class":262},[145,7038,7039,7042,7044,7046,7048,7050,7052],{"class":147,"line":927},[145,7040,7041],{"class":262},"    status ",[145,7043,266],{"class":258},[145,7045,655],{"class":262},[145,7047,641],{"class":159},[145,7049,290],{"class":262},[145,7051,7034],{"class":159},[145,7053,392],{"class":262},[145,7055,7056,7059,7061,7063,7065,7067,7069],{"class":147,"line":932},[145,7057,7058],{"class":262},"    model ",[145,7060,266],{"class":258},[145,7062,655],{"class":262},[145,7064,5700],{"class":159},[145,7066,290],{"class":262},[145,7068,7034],{"class":159},[145,7070,392],{"class":262},[145,7072,7073],{"class":147,"line":956},[145,7074,357],{"emptyLinePlaceholder":58},[145,7076,7077,7079,7081,7083,7085,7088,7091,7094,7097,7099],{"class":147,"line":981},[145,7078,878],{"class":155},[145,7080,424],{"class":262},[145,7082,457],{"class":258},[145,7084,466],{"class":159},[145,7086,7087],{"class":155},"\\n{",[145,7089,7090],{"class":159},"'='",[145,7092,7093],{"class":258},"*",[145,7095,7096],{"class":155},"50}",[145,7098,466],{"class":159},[145,7100,392],{"class":262},[145,7102,7103,7105,7107,7109,7112,7114,7116,7118,7120],{"class":147,"line":987},[145,7104,878],{"class":155},[145,7106,424],{"class":262},[145,7108,457],{"class":258},[145,7110,7111],{"class":159},"\"Webhook recibido: tarea=",[145,7113,577],{"class":155},[145,7115,580],{"class":262},[145,7117,583],{"class":155},[145,7119,466],{"class":159},[145,7121,392],{"class":262},[145,7123,7124,7126,7128,7130,7133,7135,7137,7139,7141],{"class":147,"line":992},[145,7125,878],{"class":155},[145,7127,424],{"class":262},[145,7129,457],{"class":258},[145,7131,7132],{"class":159},"\"  Estado: ",[145,7134,577],{"class":155},[145,7136,718],{"class":262},[145,7138,583],{"class":155},[145,7140,466],{"class":159},[145,7142,392],{"class":262},[145,7144,7145,7147,7149,7151,7154,7156,7158,7160,7162],{"class":147,"line":1009},[145,7146,878],{"class":155},[145,7148,424],{"class":262},[145,7150,457],{"class":258},[145,7152,7153],{"class":159},"\"  Modelo: ",[145,7155,577],{"class":155},[145,7157,1559],{"class":262},[145,7159,583],{"class":155},[145,7161,466],{"class":159},[145,7163,392],{"class":262},[145,7165,7166],{"class":147,"line":1044},[145,7167,357],{"emptyLinePlaceholder":58},[145,7169,7170,7172,7174,7176,7178],{"class":147,"line":1049},[145,7171,2320],{"class":258},[145,7173,749],{"class":262},[145,7175,752],{"class":258},[145,7177,755],{"class":159},[145,7179,412],{"class":262},[145,7181,7182],{"class":147,"line":1054},[145,7183,7184],{"class":174},"        # Extrae URL(s) de video de los resultados\n",[145,7186,7187,7190,7192,7194,7196],{"class":147,"line":1065},[145,7188,7189],{"class":262},"        results ",[145,7191,266],{"class":258},[145,7193,655],{"class":262},[145,7195,1456],{"class":159},[145,7197,6044],{"class":262},[145,7199,7200,7202],{"class":147,"line":1075},[145,7201,746],{"class":258},[145,7203,7204],{"class":262}," results:\n",[145,7206,7207,7210,7212,7215,7217],{"class":147,"line":1092},[145,7208,7209],{"class":262},"            video_url ",[145,7211,266],{"class":258},[145,7213,7214],{"class":262}," results[",[145,7216,663],{"class":155},[145,7218,644],{"class":262},[145,7220,7221,7223,7225,7227,7230,7232,7234,7236,7238],{"class":147,"line":1101},[145,7222,5392],{"class":155},[145,7224,424],{"class":262},[145,7226,457],{"class":258},[145,7228,7229],{"class":159},"\"  URL del video: ",[145,7231,577],{"class":155},[145,7233,1484],{"class":262},[145,7235,583],{"class":155},[145,7237,466],{"class":159},[145,7239,392],{"class":262},[145,7241,7242],{"class":147,"line":1107},[145,7243,357],{"emptyLinePlaceholder":58},[145,7245,7246],{"class":147,"line":1113},[145,7247,7248],{"class":174},"            # Descarga en hilo en segundo plano para responder rápidamente\n",[145,7250,7251,7254,7256],{"class":147,"line":1119},[145,7252,7253],{"class":262},"            thread ",[145,7255,266],{"class":258},[145,7257,7258],{"class":262}," threading.Thread(\n",[145,7260,7261,7264,7266],{"class":147,"line":1125},[145,7262,7263],{"class":593},"                target",[145,7265,266],{"class":258},[145,7267,7268],{"class":262},"download_video_async,\n",[145,7270,7271,7274,7276],{"class":147,"line":1142},[145,7272,7273],{"class":593},"                args",[145,7275,266],{"class":258},[145,7277,7278],{"class":262},"(video_url, task_id)\n",[145,7280,7281],{"class":147,"line":1159},[145,7282,5017],{"class":262},[145,7284,7285],{"class":147,"line":1176},[145,7286,7287],{"class":262},"            thread.start()\n",[145,7289,7290,7293],{"class":147,"line":1189},[145,7291,7292],{"class":258},"        else",[145,7294,412],{"class":262},[145,7296,7297,7299,7301,7303,7306],{"class":147,"line":1195},[145,7298,5392],{"class":155},[145,7300,424],{"class":262},[145,7302,457],{"class":258},[145,7304,7305],{"class":159},"\"  ADVERTENCIA: Completado pero sin array de resultados!\"",[145,7307,392],{"class":262},[145,7309,7310],{"class":147,"line":1200},[145,7311,357],{"emptyLinePlaceholder":58},[145,7313,7314,7317,7319,7321,7323],{"class":147,"line":1212},[145,7315,7316],{"class":258},"    elif",[145,7318,749],{"class":262},[145,7320,752],{"class":258},[145,7322,779],{"class":159},[145,7324,412],{"class":262},[145,7326,7327,7330,7332,7334,7336],{"class":147,"line":1222},[145,7328,7329],{"class":262},"        error_info ",[145,7331,266],{"class":258},[145,7333,655],{"class":262},[145,7335,794],{"class":159},[145,7337,5070],{"class":262},[145,7339,7340,7342,7344,7346,7349,7351,7354,7357,7359,7361,7363,7365,7367],{"class":147,"line":1241},[145,7341,696],{"class":155},[145,7343,424],{"class":262},[145,7345,457],{"class":258},[145,7347,7348],{"class":159},"\"  FALLIDO: ",[145,7350,577],{"class":155},[145,7352,7353],{"class":262},"json.dumps(error_info, ",[145,7355,7356],{"class":593},"indent",[145,7358,266],{"class":258},[145,7360,5237],{"class":155},[145,7362,108],{"class":262},[145,7364,583],{"class":155},[145,7366,466],{"class":159},[145,7368,392],{"class":262},[145,7370,7371,7374,7377],{"class":147,"line":1257},[145,7372,7373],{"class":174},"        # ",[145,7375,7376],{"class":258},"TODO",[145,7378,7379],{"class":174},": Registrar en su sistema de seguimiento de errores (Sentry, etc.)\n",[145,7381,7382,7384,7386],{"class":147,"line":1271},[145,7383,7373],{"class":174},[145,7385,7376],{"class":258},[145,7387,7388],{"class":174},": Opcionalmente reintentar la generación con parámetros modificados\n",[145,7390,7391],{"class":147,"line":1277},[145,7392,357],{"emptyLinePlaceholder":58},[145,7394,7395,7397],{"class":147,"line":1286},[145,7396,2357],{"class":258},[145,7398,412],{"class":262},[145,7400,7401,7403,7405,7407,7410,7412,7414,7416,7418],{"class":147,"line":1300},[145,7402,696],{"class":155},[145,7404,424],{"class":262},[145,7406,457],{"class":258},[145,7408,7409],{"class":159},"\"  Estado inesperado: ",[145,7411,577],{"class":155},[145,7413,718],{"class":262},[145,7415,583],{"class":155},[145,7417,466],{"class":159},[145,7419,392],{"class":262},[145,7421,7422,7424,7426,7428,7431,7433,7436,7438,7440,7442,7444,7446,7448],{"class":147,"line":1305},[145,7423,696],{"class":155},[145,7425,424],{"class":262},[145,7427,457],{"class":258},[145,7429,7430],{"class":159},"\"  Payload completo: ",[145,7432,577],{"class":155},[145,7434,7435],{"class":262},"json.dumps(task, ",[145,7437,7356],{"class":593},[145,7439,266],{"class":258},[145,7441,5237],{"class":155},[145,7443,108],{"class":262},[145,7445,583],{"class":155},[145,7447,466],{"class":159},[145,7449,392],{"class":262},[145,7451,7452],{"class":147,"line":1311},[145,7453,357],{"emptyLinePlaceholder":58},[145,7455,7456],{"class":147,"line":1340},[145,7457,7458],{"class":174},"    # Siempre devuelve 200 rápidamente — la API espera una respuesta en 10s\n",[145,7460,7461,7463,7465,7468,7470,7472,7474,7477,7480],{"class":147,"line":1374},[145,7462,1512],{"class":258},[145,7464,7001],{"class":262},[145,7466,7467],{"class":159},"\"received\"",[145,7469,454],{"class":262},[145,7471,916],{"class":155},[145,7473,290],{"class":262},[145,7475,7476],{"class":159},"\"task_id\"",[145,7478,7479],{"class":262},": task_id}), ",[145,7481,7482],{"class":155},"200\n",[145,7484,7485],{"class":147,"line":1406},[145,7486,357],{"emptyLinePlaceholder":58},[145,7488,7489],{"class":147,"line":1411},[145,7490,357],{"emptyLinePlaceholder":58},[145,7492,7493,7495,7497,7500,7502,7504,7506,7508,7511],{"class":147,"line":1417},[145,7494,6914],{"class":151},[145,7496,424],{"class":262},[145,7498,7499],{"class":159},"\"/health\"",[145,7501,290],{"class":262},[145,7503,6924],{"class":593},[145,7505,266],{"class":258},[145,7507,6929],{"class":262},[145,7509,7510],{"class":159},"\"GET\"",[145,7512,1431],{"class":262},[145,7514,7515,7517,7520],{"class":147,"line":1434},[145,7516,502],{"class":258},[145,7518,7519],{"class":151}," health_check",[145,7521,1062],{"class":262},[145,7523,7524],{"class":147,"line":1439},[145,7525,7526],{"class":159},"    \"\"\"Endpoint de verificación de salud para balanceadores de carga.\"\"\"\n",[145,7528,7529,7531,7533,7535,7537,7540,7542],{"class":147,"line":1445},[145,7530,1512],{"class":258},[145,7532,7001],{"class":262},[145,7534,641],{"class":159},[145,7536,454],{"class":262},[145,7538,7539],{"class":159},"\"ok\"",[145,7541,7011],{"class":262},[145,7543,7482],{"class":155},[145,7545,7546],{"class":147,"line":1465},[145,7547,357],{"emptyLinePlaceholder":58},[145,7549,7550],{"class":147,"line":1493},[145,7551,357],{"emptyLinePlaceholder":58},[145,7553,7554,7556,7558,7560,7562],{"class":147,"line":1504},[145,7555,403],{"class":258},[145,7557,1533],{"class":155},[145,7559,1536],{"class":258},[145,7561,1539],{"class":159},[145,7563,412],{"class":262},[145,7565,7566,7568,7570,7572,7575],{"class":147,"line":1509},[145,7567,878],{"class":155},[145,7569,424],{"class":262},[145,7571,457],{"class":258},[145,7573,7574],{"class":159},"\"Iniciando servidor de webhook...\"",[145,7576,392],{"class":262},[145,7578,7579,7581,7583,7585,7588,7590,7593,7595,7597,7599,7601],{"class":147,"line":1518},[145,7580,878],{"class":155},[145,7582,424],{"class":262},[145,7584,457],{"class":258},[145,7586,7587],{"class":159},"\"Los videos se guardarán en: ",[145,7589,577],{"class":155},[145,7591,7592],{"class":262},"os.path.abspath(",[145,7594,6607],{"class":155},[145,7596,108],{"class":262},[145,7598,583],{"class":155},[145,7600,466],{"class":159},[145,7602,392],{"class":262},[145,7604,7605,7607,7609,7611,7614],{"class":147,"line":1523},[145,7606,878],{"class":155},[145,7608,424],{"class":262},[145,7610,457],{"class":258},[145,7612,7613],{"class":159},"\"URL del webhook: http://localhost:5000/api/webhook/seedance\"",[145,7615,392],{"class":262},[145,7617,7618,7621,7624,7626,7629,7631,7634,7636,7639,7641,7644,7646,7648],{"class":147,"line":1528},[145,7619,7620],{"class":262},"    app.run(",[145,7622,7623],{"class":593},"host",[145,7625,266],{"class":258},[145,7627,7628],{"class":159},"\"0.0.0.0\"",[145,7630,290],{"class":262},[145,7632,7633],{"class":593},"port",[145,7635,266],{"class":258},[145,7637,7638],{"class":155},"5000",[145,7640,290],{"class":262},[145,7642,7643],{"class":593},"debug",[145,7645,266],{"class":258},[145,7647,916],{"class":155},[145,7649,392],{"class":262},[11,7651,7652],{},"Instale dependencias y ejecute:",[136,7654,7656],{"className":138,"code":7655,"language":140,"meta":141,"style":141},"pip install flask requests\npython webhook_server.py\n",[28,7657,7658,7669],{"__ignoreMap":141},[145,7659,7660,7662,7664,7667],{"class":147,"line":148},[145,7661,190],{"class":151},[145,7663,193],{"class":159},[145,7665,7666],{"class":159}," flask",[145,7668,352],{"class":159},[145,7670,7671,7673],{"class":147,"line":166},[145,7672,328],{"class":151},[145,7674,7675],{"class":159}," webhook_server.py\n",[11,7677,7678],{},"Decisiones clave de diseño en este servidor:",[97,7680,7681,7691,7701],{},[73,7682,7683,7686,7687,7690],{},[23,7684,7685],{},"Descargas en segundo plano"," — Creamos un hilo para descargar el video para que el manejador del webhook devuelva ",[28,7688,7689],{},"200"," inmediatamente. La API espera una respuesta en 10 segundos; las descargas de video pueden tardar más.",[73,7692,7693,7696,7697,7700],{},[23,7694,7695],{},"Endpoint de verificación de salud"," — ",[28,7698,7699],{},"/health"," es útil cuando se despliega detrás de un balanceador de carga (ALB, nginx, etc.).",[73,7702,7703,7706],{},[23,7704,7705],{},"Registro de errores"," — Las tareas fallidas se imprimen con el payload de error completo. En producción, envíe esto a Sentry, Datadog o su stack de logging.",[92,7708,7710],{"id":7709},"exponer-localhost-con-ngrok","Exponer Localhost con ngrok",[11,7712,7713,7714,7719],{},"Para desarrollo local, use ",[37,7715,7718],{"href":7716,"rel":7717},"https://ngrok.com",[41],"ngrok"," para crear una URL HTTPS pública que haga túnel a su servidor local:",[136,7721,7723],{"className":138,"code":7722,"language":140,"meta":141,"style":141},"# Instalar ngrok (macOS)\nbrew install ngrok\n\n# O descargue desde https://ngrok.com/download\n\n# Iniciar el túnel\nngrok http 5000\n",[28,7724,7725,7730,7740,7744,7749,7753,7758],{"__ignoreMap":141},[145,7726,7727],{"class":147,"line":148},[145,7728,7729],{"class":174},"# Instalar ngrok (macOS)\n",[145,7731,7732,7735,7737],{"class":147,"line":166},[145,7733,7734],{"class":151},"brew",[145,7736,193],{"class":159},[145,7738,7739],{"class":159}," ngrok\n",[145,7741,7742],{"class":147,"line":178},[145,7743,357],{"emptyLinePlaceholder":58},[145,7745,7746],{"class":147,"line":187},[145,7747,7748],{"class":174},"# O descargue desde https://ngrok.com/download\n",[145,7750,7751],{"class":147,"line":360},[145,7752,357],{"emptyLinePlaceholder":58},[145,7754,7755],{"class":147,"line":366},[145,7756,7757],{"class":174},"# Iniciar el túnel\n",[145,7759,7760,7762,7765],{"class":147,"line":378},[145,7761,7718],{"class":151},[145,7763,7764],{"class":159}," http",[145,7766,7767],{"class":155}," 5000\n",[11,7769,7770],{},"ngrok muestra algo como:",[136,7772,7775],{"className":7773,"code":7774,"language":1999},[1997],"Forwarding  https://a1b2c3d4.ngrok-free.app → http://localhost:5000\n",[28,7776,7774],{"__ignoreMap":141},[11,7778,7779,7780,323],{},"Use esa URL HTTPS como su ",[28,7781,3416],{},[136,7783,7785],{"className":326,"code":7784,"language":328,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Su prompt aquí\",\n    \"callback_url\": \"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n}\n",[28,7786,7787,7795,7805,7816,7825],{"__ignoreMap":141},[145,7788,7789,7791,7793],{"class":147,"line":148},[145,7790,3476],{"class":262},[145,7792,266],{"class":258},[145,7794,445],{"class":262},[145,7796,7797,7799,7801,7803],{"class":147,"line":166},[145,7798,3485],{"class":159},[145,7800,454],{"class":262},[145,7802,1083],{"class":159},[145,7804,469],{"class":262},[145,7806,7807,7809,7811,7814],{"class":147,"line":178},[145,7808,3496],{"class":159},[145,7810,454],{"class":262},[145,7812,7813],{"class":159},"\"Su prompt aquí\"",[145,7815,469],{"class":262},[145,7817,7818,7820,7822],{"class":147,"line":187},[145,7819,6314],{"class":159},[145,7821,454],{"class":262},[145,7823,7824],{"class":159},"\"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n",[145,7826,7827],{"class":147,"line":360},[145,7828,486],{"class":262},[18,7830,7831],{},[11,7832,7833,7835,7836,7839,7840,7843],{},[23,7834,2019],{}," Usar la URL ",[28,7837,7838],{},"http://"," de ngrok en lugar de ",[28,7841,7842],{},"https://",". La API de Seedance requiere HTTPS para webhooks — rechazará las URLs de callback HTTP simple con un error 400.",[92,7845,7847],{"id":7846},"seguridad-del-webhook","Seguridad del Webhook",[11,7849,7850],{},"En producción, valide que las solicitudes de webhook realmente provienen de la API de EvoLink:",[136,7852,7854],{"className":326,"code":7853,"language":328,"meta":141,"style":141},"import hmac\nimport hashlib\n\ndef verify_webhook(request):\n    \"\"\"Verifica la autenticidad del webhook usando el patrón de ID de tarea.\"\"\"\n    task = request.json\n    task_id = task.get(\"id\", \"\")\n\n    # Los IDs de tarea de EvoLink siguen un formato específico\n    if not task_id.startswith(\"task-unified-\"):\n        return False\n\n    # Validación adicional: verificar que existen los campos requeridos\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,7855,7856,7863,7870,7874,7884,7889,7897,7913,7917,7922,7936,7943,7947,7952,7979,8007,8013,8017],{"__ignoreMap":141},[145,7857,7858,7860],{"class":147,"line":148},[145,7859,335],{"class":258},[145,7861,7862],{"class":262}," hmac\n",[145,7864,7865,7867],{"class":147,"line":166},[145,7866,335],{"class":258},[145,7868,7869],{"class":262}," hashlib\n",[145,7871,7872],{"class":147,"line":178},[145,7873,357],{"emptyLinePlaceholder":58},[145,7875,7876,7878,7881],{"class":147,"line":187},[145,7877,502],{"class":258},[145,7879,7880],{"class":151}," verify_webhook",[145,7882,7883],{"class":262},"(request):\n",[145,7885,7886],{"class":147,"line":360},[145,7887,7888],{"class":159},"    \"\"\"Verifica la autenticidad del webhook usando el patrón de ID de tarea.\"\"\"\n",[145,7890,7891,7893,7895],{"class":147,"line":366},[145,7892,1289],{"class":262},[145,7894,266],{"class":258},[145,7896,6984],{"class":262},[145,7898,7899,7901,7903,7905,7907,7909,7911],{"class":147,"line":378},[145,7900,7023],{"class":262},[145,7902,266],{"class":258},[145,7904,655],{"class":262},[145,7906,1428],{"class":159},[145,7908,290],{"class":262},[145,7910,5088],{"class":159},[145,7912,392],{"class":262},[145,7914,7915],{"class":147,"line":395},[145,7916,357],{"emptyLinePlaceholder":58},[145,7918,7919],{"class":147,"line":400},[145,7920,7921],{"class":174},"    # Los IDs de tarea de EvoLink siguen un formato específico\n",[145,7923,7924,7926,7928,7931,7934],{"class":147,"line":415},[145,7925,2320],{"class":258},[145,7927,406],{"class":258},[145,7929,7930],{"class":262}," task_id.startswith(",[145,7932,7933],{"class":159},"\"task-unified-\"",[145,7935,516],{"class":262},[145,7937,7938,7940],{"class":147,"line":432},[145,7939,6998],{"class":258},[145,7941,7942],{"class":155}," False\n",[145,7944,7945],{"class":147,"line":437},[145,7946,357],{"emptyLinePlaceholder":58},[145,7948,7949],{"class":147,"line":448},[145,7950,7951],{"class":174},"    # Validación adicional: verificar que existen los campos requeridos\n",[145,7953,7954,7957,7959,7962,7964,7966,7968,7970,7972,7974,7977],{"class":147,"line":472},[145,7955,7956],{"class":262},"    required_fields ",[145,7958,266],{"class":258},[145,7960,7961],{"class":262}," [",[145,7963,1428],{"class":159},[145,7965,290],{"class":262},[145,7967,641],{"class":159},[145,7969,290],{"class":262},[145,7971,5700],{"class":159},[145,7973,290],{"class":262},[145,7975,7976],{"class":159},"\"created\"",[145,7978,644],{"class":262},[145,7980,7981,7983,7985,7988,7991,7993,7996,7999,8002,8004],{"class":147,"line":483},[145,7982,2320],{"class":258},[145,7984,406],{"class":258},[145,7986,7987],{"class":155}," all",[145,7989,7990],{"class":262},"(field ",[145,7992,965],{"class":258},[145,7994,7995],{"class":262}," task ",[145,7997,7998],{"class":258},"for",[145,8000,8001],{"class":262}," field ",[145,8003,965],{"class":258},[145,8005,8006],{"class":262}," required_fields):\n",[145,8008,8009,8011],{"class":147,"line":489},[145,8010,6998],{"class":258},[145,8012,7942],{"class":155},[145,8014,8015],{"class":147,"line":494},[145,8016,357],{"emptyLinePlaceholder":58},[145,8018,8019,8021],{"class":147,"line":499},[145,8020,1512],{"class":258},[145,8022,6216],{"class":155},[92,8024,8026],{"id":8025},"cuándo-usar-webhooks-vs-polling","Cuándo Usar Webhooks vs Polling",[1849,8028,8029,8042],{},[1852,8030,8031],{},[1855,8032,8033,8036,8039],{},[1858,8034,8035],{},"Escenario",[1858,8037,8038],{},"Recomendación",[1858,8040,8041],{},"Por Qué",[1865,8043,8044,8054,8065,8076,8086,8096],{},[1855,8045,8046,8049,8051],{},[1870,8047,8048],{},"Prototipado rápido / scripts",[1870,8050,2057],{},[1870,8052,8053],{},"Más simple, no necesita servidor",[1855,8055,8056,8059,8062],{},[1870,8057,8058],{},"Aplicación web de producción",[1870,8060,8061],{},"Webhooks",[1870,8063,8064],{},"Escalable, sin solicitudes desperdiciadas",[1855,8066,8067,8070,8073],{},[1870,8068,8069],{},"Procesamiento por lotes (100+ videos)",[1870,8071,8072],{},"Webhooks + cola",[1870,8074,8075],{},"Envíe todos, procese a medida que se completan",[1855,8077,8078,8081,8083],{},[1870,8079,8080],{},"Herramientas CLI",[1870,8082,2057],{},[1870,8084,8085],{},"No requiere infraestructura de servidor",[1855,8087,8088,8091,8093],{},[1870,8089,8090],{},"Backend de aplicación móvil",[1870,8092,8061],{},[1870,8094,8095],{},"Notificaciones push a usuarios al completarse",[1855,8097,8098,8101,8103],{},[1870,8099,8100],{},"Sin servidor (Lambda/Cloud Functions)",[1870,8102,8061],{},[1870,8104,8105],{},"Combinación perfecta — función activada por cada completado",[18,8107,8108],{},[11,8109,8110,8112],{},[23,8111,133],{}," Para procesamiento por lotes, combine webhooks con una cola de mensajes (Redis, RabbitMQ, SQS). Envíe todas las solicitudes de generación, luego procese los completados a medida que lleguen a la cola. Esto desacopla el envío del procesamiento y maneja los reintentos con elegancia.",[45,8114],{},[48,8116,8118],{"id":8117},"procesamiento-por-lotes-generar-múltiples-videos","Procesamiento por Lotes: Generar Múltiples Videos",[11,8120,8121],{},"Los casos de uso del mundo real a menudo implican generar muchos videos. Aquí hay un patrón para procesamiento por lotes con limitación de tasa:",[11,8123,8124],{},[2434,8125,8126],{},"Usa la misma configuración y funciones auxiliares del primer ejemplo anterior.",[136,8128,8130],{"className":326,"code":8129,"language":328,"meta":141,"style":141},"import concurrent.futures\n\ndef batch_generate(prompts, max_concurrent=3):\n    \"\"\"\n    Genera múltiples videos con concurrencia controlada.\n\n    Args:\n        prompts: Lista de cadenas de prompt.\n        max_concurrent: Máximo de generaciones simultáneas.\n\n    Returns:\n        Lista de tuplas (prompt, resultado_o_error).\n    \"\"\"\n    results = []\n\n    def generate_one(prompt, index):\n        \"\"\"Genera un solo video y devuelve el resultado.\"\"\"\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}] Enviado: {task['id']}\")\n            result = wait_for_video(task[\"id\"])\n            video_url = result[\"results\"][0]\n            download_video(video_url, f\"lote_{index}.mp4\")\n            return (prompt, result)\n        except Exception as e:\n            print(f\"[{index}] Fallido: {e}\")\n            return (prompt, str(e))\n\n    # Procesar en lotes para respetar los límites de tasa\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    # Resumen\n    succeeded = sum(1 for _, r in results if isinstance(r, dict))\n    print(f\"\\nLote completo: {succeeded}/{len(prompts)} exitosos\")\n    return results\n\n\n# Ejemplo de uso\nprompts = [\n    \"Un colibrí revoloteando cerca de una flor roja. Macro, poca profundidad de campo.\",\n    \"Olas oceánicas chocando contra rocas volcánicas al atardecer. Cámara lenta.\",\n    \"Un músico callejero tocando violín bajo la lluvia. Iluminación cinematográfica.\",\n]\nbatch_generate(prompts, max_concurrent=2)\n",[28,8131,8132,8139,8143,8159,8163,8168,8172,8177,8182,8187,8191,8196,8201,8205,8214,8218,8229,8234,8243,8254,8262,8273,8283,8288,8294,8304,8339,8352,8368,8388,8395,8405,8434,8447,8451,8456,8476,8485,8490,8504,8508,8520,8525,8529,8534,8572,8608,8615,8619,8623,8628,8638,8645,8652,8659,8663],{"__ignoreMap":141},[145,8133,8134,8136],{"class":147,"line":148},[145,8135,335],{"class":258},[145,8137,8138],{"class":262}," concurrent.futures\n",[145,8140,8141],{"class":147,"line":166},[145,8142,357],{"emptyLinePlaceholder":58},[145,8144,8145,8147,8150,8153,8155,8157],{"class":147,"line":178},[145,8146,502],{"class":258},[145,8148,8149],{"class":151}," batch_generate",[145,8151,8152],{"class":262},"(prompts, max_concurrent",[145,8154,266],{"class":258},[145,8156,4874],{"class":155},[145,8158,516],{"class":262},[145,8160,8161],{"class":147,"line":187},[145,8162,4881],{"class":159},[145,8164,8165],{"class":147,"line":360},[145,8166,8167],{"class":159},"    Genera múltiples videos con concurrencia controlada.\n",[145,8169,8170],{"class":147,"line":366},[145,8171,357],{"emptyLinePlaceholder":58},[145,8173,8174],{"class":147,"line":378},[145,8175,8176],{"class":159},"    Args:\n",[145,8178,8179],{"class":147,"line":395},[145,8180,8181],{"class":159},"        prompts: Lista de cadenas de prompt.\n",[145,8183,8184],{"class":147,"line":400},[145,8185,8186],{"class":159},"        max_concurrent: Máximo de generaciones simultáneas.\n",[145,8188,8189],{"class":147,"line":415},[145,8190,357],{"emptyLinePlaceholder":58},[145,8192,8193],{"class":147,"line":432},[145,8194,8195],{"class":159},"    Returns:\n",[145,8197,8198],{"class":147,"line":437},[145,8199,8200],{"class":159},"        Lista de tuplas (prompt, resultado_o_error).\n",[145,8202,8203],{"class":147,"line":448},[145,8204,4881],{"class":159},[145,8206,8207,8210,8212],{"class":147,"line":472},[145,8208,8209],{"class":262},"    results ",[145,8211,266],{"class":258},[145,8213,5679],{"class":262},[145,8215,8216],{"class":147,"line":483},[145,8217,357],{"emptyLinePlaceholder":58},[145,8219,8220,8223,8226],{"class":147,"line":489},[145,8221,8222],{"class":258},"    def",[145,8224,8225],{"class":151}," generate_one",[145,8227,8228],{"class":262},"(prompt, index):\n",[145,8230,8231],{"class":147,"line":494},[145,8232,8233],{"class":159},"        \"\"\"Genera un solo video y devuelve el resultado.\"\"\"\n",[145,8235,8236,8239,8241],{"class":147,"line":499},[145,8237,8238],{"class":262},"        payload ",[145,8240,266],{"class":258},[145,8242,445],{"class":262},[145,8244,8245,8248,8250,8252],{"class":147,"line":519},[145,8246,8247],{"class":159},"            \"model\"",[145,8249,454],{"class":262},[145,8251,1083],{"class":159},[145,8253,469],{"class":262},[145,8255,8256,8259],{"class":147,"line":525},[145,8257,8258],{"class":159},"            \"prompt\"",[145,8260,8261],{"class":262},": prompt,\n",[145,8263,8264,8267,8269,8271],{"class":147,"line":536},[145,8265,8266],{"class":159},"            \"duration\"",[145,8268,454],{"class":262},[145,8270,1133],{"class":155},[145,8272,469],{"class":262},[145,8274,8275,8278,8280],{"class":147,"line":541},[145,8276,8277],{"class":159},"            \"quality\"",[145,8279,454],{"class":262},[145,8281,8282],{"class":159},"\"720p\"\n",[145,8284,8285],{"class":147,"line":552},[145,8286,8287],{"class":262},"        }\n",[145,8289,8290,8292],{"class":147,"line":563},[145,8291,4954],{"class":258},[145,8293,412],{"class":262},[145,8295,8296,8299,8301],{"class":147,"line":590},[145,8297,8298],{"class":262},"            task ",[145,8300,266],{"class":258},[145,8302,8303],{"class":262}," generate_video_with_retry(payload)\n",[145,8305,8306,8308,8310,8312,8315,8317,8320,8322,8325,8327,8329,8331,8333,8335,8337],{"class":147,"line":602},[145,8307,5392],{"class":155},[145,8309,424],{"class":262},[145,8311,457],{"class":258},[145,8313,8314],{"class":159},"\"[",[145,8316,577],{"class":155},[145,8318,8319],{"class":262},"index",[145,8321,583],{"class":155},[145,8323,8324],{"class":159},"] Enviado: ",[145,8326,577],{"class":155},[145,8328,1325],{"class":262},[145,8330,1328],{"class":159},[145,8332,1331],{"class":262},[145,8334,583],{"class":155},[145,8336,466],{"class":159},[145,8338,392],{"class":262},[145,8340,8341,8344,8346,8348,8350],{"class":147,"line":608},[145,8342,8343],{"class":262},"            result ",[145,8345,266],{"class":258},[145,8347,1425],{"class":262},[145,8349,1428],{"class":159},[145,8351,1431],{"class":262},[145,8353,8354,8356,8358,8360,8362,8364,8366],{"class":147,"line":614},[145,8355,7209],{"class":262},[145,8357,266],{"class":258},[145,8359,1453],{"class":262},[145,8361,1456],{"class":159},[145,8363,1359],{"class":262},[145,8365,663],{"class":155},[145,8367,644],{"class":262},[145,8369,8370,8373,8375,8378,8380,8382,8384,8386],{"class":147,"line":625},[145,8371,8372],{"class":262},"            download_video(video_url, ",[145,8374,457],{"class":258},[145,8376,8377],{"class":159},"\"lote_",[145,8379,577],{"class":155},[145,8381,8319],{"class":262},[145,8383,583],{"class":155},[145,8385,6697],{"class":159},[145,8387,392],{"class":262},[145,8389,8390,8392],{"class":147,"line":630},[145,8391,763],{"class":258},[145,8393,8394],{"class":262}," (prompt, result)\n",[145,8396,8397,8399,8401,8403],{"class":147,"line":647},[145,8398,5352],{"class":258},[145,8400,816],{"class":155},[145,8402,6870],{"class":258},[145,8404,5462],{"class":262},[145,8406,8407,8409,8411,8413,8415,8417,8419,8421,8424,8426,8428,8430,8432],{"class":147,"line":668},[145,8408,5392],{"class":155},[145,8410,424],{"class":262},[145,8412,457],{"class":258},[145,8414,8314],{"class":159},[145,8416,577],{"class":155},[145,8418,8319],{"class":262},[145,8420,583],{"class":155},[145,8422,8423],{"class":159},"] Fallido: ",[145,8425,577],{"class":155},[145,8427,5509],{"class":262},[145,8429,583],{"class":155},[145,8431,466],{"class":159},[145,8433,392],{"class":262},[145,8435,8436,8438,8441,8444],{"class":147,"line":688},[145,8437,763],{"class":258},[145,8439,8440],{"class":262}," (prompt, ",[145,8442,8443],{"class":155},"str",[145,8445,8446],{"class":262},"(e))\n",[145,8448,8449],{"class":147,"line":693},[145,8450,357],{"emptyLinePlaceholder":58},[145,8452,8453],{"class":147,"line":738},[145,8454,8455],{"class":174},"    # Procesar en lotes para respetar los límites de tasa\n",[145,8457,8458,8460,8463,8466,8468,8471,8473],{"class":147,"line":743},[145,8459,935],{"class":258},[145,8461,8462],{"class":262}," concurrent.futures.ThreadPoolExecutor(",[145,8464,8465],{"class":593},"max_workers",[145,8467,266],{"class":258},[145,8469,8470],{"class":262},"max_concurrent) ",[145,8472,950],{"class":258},[145,8474,8475],{"class":262}," executor:\n",[145,8477,8478,8481,8483],{"class":147,"line":760},[145,8479,8480],{"class":262},"        futures ",[145,8482,266],{"class":258},[145,8484,445],{"class":262},[145,8486,8487],{"class":147,"line":769},[145,8488,8489],{"class":262},"            executor.submit(generate_one, prompt, i): i\n",[145,8491,8492,8494,8497,8499,8501],{"class":147,"line":784},[145,8493,6783],{"class":258},[145,8495,8496],{"class":262}," i, prompt ",[145,8498,965],{"class":258},[145,8500,6094],{"class":155},[145,8502,8503],{"class":262},"(prompts)\n",[145,8505,8506],{"class":147,"line":810},[145,8507,8287],{"class":262},[145,8509,8510,8512,8515,8517],{"class":147,"line":837},[145,8511,959],{"class":258},[145,8513,8514],{"class":262}," future ",[145,8516,965],{"class":258},[145,8518,8519],{"class":262}," concurrent.futures.as_completed(futures):\n",[145,8521,8522],{"class":147,"line":842},[145,8523,8524],{"class":262},"            results.append(future.result())\n",[145,8526,8527],{"class":147,"line":848},[145,8528,357],{"emptyLinePlaceholder":58},[145,8530,8531],{"class":147,"line":853},[145,8532,8533],{"class":174},"    # Resumen\n",[145,8535,8536,8539,8541,8544,8546,8548,8550,8553,8555,8558,8560,8563,8566,8569],{"class":147,"line":858},[145,8537,8538],{"class":262},"    succeeded ",[145,8540,266],{"class":258},[145,8542,8543],{"class":155}," sum",[145,8545,424],{"class":262},[145,8547,5256],{"class":155},[145,8549,6197],{"class":258},[145,8551,8552],{"class":262}," _, r ",[145,8554,965],{"class":258},[145,8556,8557],{"class":262}," results ",[145,8559,403],{"class":258},[145,8561,8562],{"class":155}," isinstance",[145,8564,8565],{"class":262},"(r, ",[145,8567,8568],{"class":155},"dict",[145,8570,8571],{"class":262},"))\n",[145,8573,8574,8576,8578,8580,8582,8584,8587,8589,8592,8594,8596,8598,8601,8603,8606],{"class":147,"line":869},[145,8575,878],{"class":155},[145,8577,424],{"class":262},[145,8579,457],{"class":258},[145,8581,466],{"class":159},[145,8583,1476],{"class":155},[145,8585,8586],{"class":159},"Lote completo: ",[145,8588,577],{"class":155},[145,8590,8591],{"class":262},"succeeded",[145,8593,583],{"class":155},[145,8595,1003],{"class":159},[145,8597,6073],{"class":155},[145,8599,8600],{"class":262},"(prompts)",[145,8602,583],{"class":155},[145,8604,8605],{"class":159}," exitosos\"",[145,8607,392],{"class":262},[145,8609,8610,8612],{"class":147,"line":875},[145,8611,1512],{"class":258},[145,8613,8614],{"class":262}," results\n",[145,8616,8617],{"class":147,"line":900},[145,8618,357],{"emptyLinePlaceholder":58},[145,8620,8621],{"class":147,"line":921},[145,8622,357],{"emptyLinePlaceholder":58},[145,8624,8625],{"class":147,"line":927},[145,8626,8627],{"class":174},"# Ejemplo de uso\n",[145,8629,8630,8633,8635],{"class":147,"line":932},[145,8631,8632],{"class":262},"prompts ",[145,8634,266],{"class":258},[145,8636,8637],{"class":262}," [\n",[145,8639,8640,8643],{"class":147,"line":956},[145,8641,8642],{"class":159},"    \"Un colibrí revoloteando cerca de una flor roja. Macro, poca profundidad de campo.\"",[145,8644,469],{"class":262},[145,8646,8647,8650],{"class":147,"line":981},[145,8648,8649],{"class":159},"    \"Olas oceánicas chocando contra rocas volcánicas al atardecer. Cámara lenta.\"",[145,8651,469],{"class":262},[145,8653,8654,8657],{"class":147,"line":987},[145,8655,8656],{"class":159},"    \"Un músico callejero tocando violín bajo la lluvia. Iluminación cinematográfica.\"",[145,8658,469],{"class":262},[145,8660,8661],{"class":147,"line":992},[145,8662,644],{"class":262},[145,8664,8665,8668,8671,8673,8675],{"class":147,"line":1009},[145,8666,8667],{"class":262},"batch_generate(prompts, ",[145,8669,8670],{"class":593},"max_concurrent",[145,8672,266],{"class":258},[145,8674,5237],{"class":155},[145,8676,392],{"class":262},[11,8678,8679],{},"Consideraciones clave para el procesamiento por lotes:",[97,8681,8682,8690,8696],{},[73,8683,8684,8689],{},[23,8685,8686],{},[28,8687,8688],{},"max_concurrent=3"," — No envíe demasiadas solicitudes simultáneamente. Comience con 2–3 y aumente según sus límites de tasa.",[73,8691,8692,8695],{},[23,8693,8694],{},"ThreadPoolExecutor"," — Usa hilos (no procesos) porque estamos limitados por I/O (esperando respuestas de API), no por CPU.",[73,8697,8698,8701],{},[23,8699,8700],{},"Aislamiento de errores"," — Cada generación de video es independiente. Un fallo no detiene el lote.",[45,8703],{},[48,8705,8707],{"id":8706},"qué-sigue","Qué Sigue",[11,8709,8710],{},"Ya domina los fundamentos — texto a video, imagen a video, polling asíncrono, webhooks, manejo de errores y procesamiento por lotes. Aquí es dónde profundizar:",[92,8712,8714],{"id":8713},"explorar-características-avanzadas","Explorar Características Avanzadas",[97,8716,8717,8725,8732,8740,8748],{},[73,8718,8719,8724],{},[23,8720,8721],{},[37,8722,8723],{"href":2781},"Guía de Referencia Multimodal @Tags"," — Domine el sistema de referencia @Image, @Video, @Audio para generación multi-modal",[73,8726,8727,8731],{},[23,8728,8729],{},[37,8730,3673],{"href":3672}," — Replique zooms Hitchcock, tomas de seguimiento en una toma y cámaras orbitales programáticamente",[73,8733,8734,8739],{},[23,8735,8736],{},[37,8737,8738],{"href":3196},"Guía Profunda de Imagen a Video"," — Control de primer-último fotograma, composición multi-imagen, videos de productos de e-commerce",[73,8741,8742,8747],{},[23,8743,8744],{},[37,8745,8746],{"href":2428},"Guía de Video de Producto para E-commerce"," — Convierta fotos de productos en videos de marketing a escala",[73,8749,8750,8754],{},[23,8751,8752],{},[37,8753,1579],{"href":1578}," — Formato de guion de tomas, sintaxis de temporización y los prompts detrás de nuestros videos de demo",[92,8756,8758],{"id":8757},"documentación-de-referencia","Documentación de Referencia",[97,8760,8761,8768,8775],{},[73,8762,8763],{},[37,8764,8767],{"href":8765,"rel":8766},"https://seedance2api.app/docs/video-generation",[41],"Referencia de API de Generación de Video",[73,8769,8770],{},[37,8771,8774],{"href":8772,"rel":8773},"https://seedance2api.app/docs/multimodal-reference",[41],"Especificaciones de Referencia Multimodal",[73,8776,8777],{},[37,8778,8781],{"href":8779,"rel":8780},"https://seedance2api.app/docs/sdks",[41],"SDKs de Python y Node.js",[92,8783,8785],{"id":8784},"construya-algo","Construya Algo",[11,8787,8788],{},"Combine lo que ha aprendido. Aquí hay algunas ideas de proyectos:",[97,8790,8791,8800,8806,8815],{},[73,8792,8793,8796,8797,108],{},[23,8794,8795],{},"Pipeline automatizado de video de producto"," — Suba fotos de productos, genere videos de marketing en lotes (vea nuestra ",[37,8798,8799],{"href":2428},"Guía de Video para E-commerce",[73,8801,8802,8805],{},[23,8803,8804],{},"Motor de contenido para redes sociales"," — Genere videos verticales de formato corto a partir de descripciones de texto, publique directamente en TikTok/Reels",[73,8807,8808,8811,8812],{},[23,8809,8810],{},"Herramienta de storyboard a video"," — Convierta imágenes secuenciales en escenas animadas con ",[37,8813,8814],{"href":3672},"control de movimiento de cámara",[73,8816,8817,8820],{},[23,8818,8819],{},"Pipeline de edición de video con IA"," — Use la extensión de video de Seedance 2.0 para crear narrativas más largas a partir de clips más cortos",[11,8822,8823],{},[23,8824,8825,8826,8830],{},"¿Listo para construir? ",[37,8827,8829],{"href":39,"rel":8828},[41],"Obtenga su clave API gratuita de EvoLink"," y comience a generar videos hoy.",[45,8832],{},[48,8834,8836],{"id":8835},"preguntas-frecuentes","Preguntas Frecuentes",[92,8838,8840],{"id":8839},"cuánto-tarda-la-generación-de-video-de-seedance-20","¿Cuánto tarda la generación de video de Seedance 2.0?",[11,8842,8843,8844,8846],{},"Típicamente entre 30 y 120 segundos dependiendo de la duración y configuración de calidad. Un video de 5 segundos en 720p se completa en aproximadamente 50 segundos. Un video de 15 segundos en 1080p puede tardar de 2 a 3 minutos. La API devuelve un campo ",[28,8845,1919],{}," con cada tarea para que pueda establecer timeouts apropiados. Durante las horas pico, los tiempos de espera en cola pueden agregar de 10 a 30 segundos al total.",[92,8848,8850],{"id":8849},"qué-formatos-de-imagen-acepta-la-api-de-seedance-20","¿Qué formatos de imagen acepta la API de Seedance 2.0?",[11,8852,8853,8854,8856],{},"JPEG, PNG, WebP, BMP, TIFF y GIF. Cada imagen debe pesar menos de 30 MB. Puede pasar hasta 9 imágenes por solicitud a través del parámetro ",[28,8855,2710],{},". Las imágenes deben ser URLs públicamente accesibles — la API las recupera directamente. Para mejores resultados, use imágenes de al menos 720px en el lado más corto. Las imágenes de muy baja resolución (por debajo de 256px) pueden producir animaciones borrosas.",[92,8858,8860],{"id":8859},"puedo-generar-videos-de-más-de-15-segundos","¿Puedo generar videos de más de 15 segundos?",[11,8862,8863,8864,8866],{},"El máximo de una sola generación es 15 segundos. Para contenido más largo, genere múltiples clips y concaténelos usando FFmpeg o cualquier editor de video. Seedance 2.0 soporta extensión de video — puede usar el último fotograma de un video generado como primer fotograma de la siguiente generación para crear continuidad sin fisuras. Aquí está el enfoque básico: genere el clip 1, extraiga el último fotograma, páselo como ",[28,8865,2809],{}," para el clip 2.",[92,8868,8870],{"id":8869},"cuánto-cuesta-la-api-de-seedance-20-a-través-de-evolink","¿Cuánto cuesta la API de Seedance 2.0 a través de EvoLink?",[11,8872,8873,8874,8878,8879,8881],{},"El precio se basa en la duración del video y el nivel de calidad. Un video de 5 segundos en 720p cuesta aproximadamente 18 créditos. EvoLink proporciona ",[37,8875,8877],{"href":211,"rel":8876},[41],"enrutamiento inteligente"," que puede reducir costos en comparación con el acceso directo a la API. Consulte su panel de control para las tarifas actuales por segundo. El campo ",[28,8880,1929],{}," en la respuesta de la API muestra el costo exacto antes de que comience la generación — nunca se le cobrará más de esa cantidad.",[92,8883,8885],{"id":8884},"cuál-es-la-diferencia-entre-seedance-15-pro-y-seedance-20","¿Cuál es la diferencia entre seedance-1.5-pro y seedance-2.0?",[11,8887,8888,8889,8891,8892,8894,8895,8899],{},"Seedance 2.0 agrega referencias multimodales (mezcle imágenes, videos y audio como entradas), generación de audio nativa, física y consistencia mejoradas, y capacidades de edición de video. La interfaz de la API es idéntica — mismo endpoint, mismos parámetros, mismo formato de respuesta. Puede probar con ",[28,8890,30],{}," hoy y cambiar a ",[28,8893,1563],{}," cambiando el nombre del modelo. Limitaciones clave de 1.5: solo entrada de imagen única (sin @Image2–9), sin referencias de video/audio, sin generación de audio nativa. Vea la ",[37,8896,8898],{"href":8897},"/blog/seedance-2-vs-sora-2-api-comparison","comparación de Seedance 2.0 vs Sora 2"," para benchmarks.",[92,8901,8903],{"id":8902},"cómo-manejo-el-error-content-rejected-by-safety-filter","¿Cómo manejo el error \"content rejected by safety filter\"?",[11,8905,8906,8907,8909,8910,8913],{},"El sistema de moderación de contenido rechaza prompts que involucren violencia realista, contenido explícito y figuras públicas reales. También rechaza imágenes de rostros humanos realistas subidas a través de ",[28,8908,2710],{},". Para evitar restricciones de rostros, use imágenes de personajes ilustrados, estilizados o de estilo anime. Para rechazos de prompts, reformule para ser menos específico sobre temas restringidos. La respuesta de error incluye ",[28,8911,8912],{},"type: \"content_policy_violation\""," — verifique esto en su código de manejo de errores para dar a los usuarios un mensaje claro.",[92,8915,8917],{"id":8916},"puedo-usar-la-api-de-seedance-en-un-proyecto-nodejs-javascript","¿Puedo usar la API de Seedance en un proyecto Node.js / JavaScript?",[11,8919,8920,8921,1898,8924,8927,8928,8932],{},"Sí. La API REST es independiente del lenguaje — cualquier cliente HTTP funciona. Los conceptos en este tutorial (polling asíncrono, webhooks, manejo de errores) se aplican directamente a Node.js con ",[28,8922,8923],{},"fetch",[28,8925,8926],{},"axios",". EvoLink también proporciona ",[37,8929,8931],{"href":8779,"rel":8930},[41],"SDKs oficiales de Node.js y Python"," que manejan el polling y los reintentos por usted.",[92,8934,8936],{"id":8935},"qué-pasa-si-mi-servidor-de-webhook-está-caído-cuando-el-video-se-completa","¿Qué pasa si mi servidor de webhook está caído cuando el video se completa?",[11,8938,8939,8940,8943],{},"La API reintenta la entrega del webhook 3 veces con intervalos crecientes (1s, 2s, 4s). Si los 3 reintentos fallan, el webhook se abandona — pero el video sigue disponible. Siempre puede recurrir al polling con ",[28,8941,8942],{},"GET /v1/tasks/{task_id}"," para recuperar el resultado. Por esta razón, es una buena práctica almacenar el ID de tarea al enviar y tener un trabajo en segundo plano que verifique periódicamente si hay tareas que se completaron pero no se recibieron a través del webhook.",[92,8945,8947],{"id":8946},"hay-un-límite-de-tasa-en-las-solicitudes-de-api","¿Hay un límite de tasa en las solicitudes de API?",[11,8949,8950,8951,8953,8954,8958,8959,8963],{},"Sí. El límite de tasa predeterminado es generoso para desarrollo y uso de producción moderado. Si recibe un error ",[28,8952,4756],{},", implemente retroceso exponencial como se muestra en la ",[37,8955,8957],{"href":8956},"#manejar-errores-con-elegancia","sección de manejo de errores",". Para casos de uso de alto volumen (miles de videos por día), contacte al ",[37,8960,8962],{"href":211,"rel":8961},[41],"soporte de EvoLink"," para discutir límites de tasa personalizados y capacidad dedicada.",[92,8965,8967],{"id":8966},"puedo-usar-seedance-20-para-proyectos-comerciales","¿Puedo usar Seedance 2.0 para proyectos comerciales?",[11,8969,8970,8971,8975],{},"Sí. Los videos generados a través de la API de EvoLink están licenciados para uso comercial. Usted es propietario de los resultados y puede usarlos en productos, materiales de marketing, entregas a clientes y contenido publicado. Vea la ",[37,8972,8974],{"href":8973},"/blog/seedance-2-copyright-api-guide","guía de derechos de autor de Seedance 2.0"," para términos de licencia detallados y mejores prácticas para uso comercial.",[45,8977],{},[48,8979,8981],{"id":8980},"script-completo","Script Completo",[11,8983,8984],{},"Aquí está el código completo del tutorial en un solo archivo — copie, pegue, agregue su clave API y ejecute:",[136,8986,8988],{"className":326,"code":8987,"language":328,"meta":141,"style":141},"\"\"\"\nTutorial de API de Seedance 2.0 — Script Completo\nDocs: https://seedance2api.app/docs/video-generation\nClave API: https://evolink.ai/early-access\n\"\"\"\nimport requests\nimport time\nimport os\nimport json\nimport random\n\n# ── Configuració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# ── Funciones Auxiliares Reutilizables ────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"Realiza polling de una tarea de generación de video hasta completarse.\"\"\"\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] Estado: {status} | Progreso: {progress}%\")\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Tarea {task_id} fallida: {task}\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n    raise TimeoutError(f\"Tarea {task_id} expiró después de {timeout}s\")\n\n\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"Descarga un archivo de video desde una URL.\"\"\"\n    print(f\"Descargando a {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\"Guardado: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"Envía una solicitud de generación con reintento para errores transitorios.\"\"\"\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\"Error de API {response.status_code}: \"\n                    f\"{error.get('message', 'Desconocido')}\"\n                )\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Reintento {attempt+1}/{max_retries} después de {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\"  Reintento {attempt+1}/{max_retries} después de {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n    raise RuntimeError(f\"Fallo tras {max_retries} reintentos\")\n\n\ndef validate_payload(payload):\n    \"\"\"Valida el payload de generación antes de la llamada a la API.\"\"\"\n    errors = []\n    if not payload.get(\"model\"):\n        errors.append(\"'model' es requerido\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' es requerido\")\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' debe ser 4-15, se obtuvo {duration}\")\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in {\"480p\", \"720p\", \"1080p\"}:\n        errors.append(f\"Calidad inválida: {quality}\")\n    if errors:\n        raise ValueError(\"Validación fallida:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n\n\ndef cancel_task(task_id):\n    \"\"\"Cancela una tarea pendiente o en procesamiento.\"\"\"\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\"Tarea {task_id} cancelada.\")\n    else:\n        print(f\"Cancelación fallida: {response.json()}\")\n\n\n# ── Ejemplo 1: Texto a Video ──────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Un cachorro golden retriever persigue una mariposa a través \"\n            \"de un prado iluminado por el sol. La cámara sigue al cachorro con un \"\n            \"plano de seguimiento suave mientras las flores silvestres se mecen con la brisa.\"\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\"Tarea: {task['id']} (ETA: {task['task_info']['estimated_time']}s)\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"texto_a_video.mp4\")\n\n\n# ── Ejemplo 2: Imagen a Video ─────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. La escena cobra vida lentamente \"\n            \"— las hojas se mecen suavemente, la luz suave se desplaza \"\n            \"por el encuadre.\"\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\"Tarea: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"imagen_a_video.mp4\")\n\n\n# ── Ejemplo 3: Video Vertical para Redes Sociales ─────────────\ndef social_media_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Un barista vierte latte art en cámara lenta. \"\n            \"Plano cenital cerrado, iluminación cálida de café.\"\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\"Tarea: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"video_social.mp4\")\n\n\nif __name__ == \"__main__\":\n    print(\"=== Texto a Video ===\")\n    text_to_video()\n    # print(\"\\n=== Imagen a Video ===\")\n    # image_to_video()  # Descomente y configure su URL de imagen\n    # print(\"\\n=== Video para Redes Sociales ===\")\n    # social_media_video()\n",[28,8989,8990,8994,8999,9004,9009,9013,9019,9025,9031,9037,9043,9047,9052,9069,9078,9086,9102,9110,9114,9118,9122,9127,9149,9154,9164,9176,9184,9204,9212,9216,9220,9228,9240,9256,9292,9304,9310,9322,9354,9358,9368,9400,9404,9408,9424,9429,9450,9467,9472,9488,9506,9510,9545,9549,9553,9567,9572,9584,9590,9598,9610,9620,9628,9637,9641,9653,9659,9671,9705,9713,9728,9753,9757,9783,9809,9852,9856,9860,9867,9893,9933,9937,9941,9963,9967,9971,9979,9984,9992,10004,10012,10034,10043,10059,10079,10097,10113,10138,10157,10163,10209,10214,10219,10228,10234,10243,10264,10273,10278,10291,10313,10320,10341,10346,10351,10357,10366,10375,10386,10393,10398,10403,10408,10413,10424,10435,10446,10455,10460,10466,10475,10519,10532,10552,10557,10562,10568,10577,10586,10597,10604,10609,10614,10620,10625,10639,10650,10659,10664,10669,10678,10703,10716,10734,10739,10744,10750,10760,10769,10780,10787,10793,10799,10804,10815,10826,10837,10846,10851,10856,10865,10890,10903,10921,10926,10931,10944,10956,10961,10967,10973,10979],{"__ignoreMap":141},[145,8991,8992],{"class":147,"line":148},[145,8993,6507],{"class":159},[145,8995,8996],{"class":147,"line":166},[145,8997,8998],{"class":159},"Tutorial de API de Seedance 2.0 — Script Completo\n",[145,9000,9001],{"class":147,"line":178},[145,9002,9003],{"class":159},"Docs: https://seedance2api.app/docs/video-generation\n",[145,9005,9006],{"class":147,"line":187},[145,9007,9008],{"class":159},"Clave API: https://evolink.ai/early-access\n",[145,9010,9011],{"class":147,"line":360},[145,9012,6507],{"class":159},[145,9014,9015,9017],{"class":147,"line":366},[145,9016,335],{"class":258},[145,9018,352],{"class":262},[145,9020,9021,9023],{"class":147,"line":378},[145,9022,335],{"class":258},[145,9024,345],{"class":262},[145,9026,9027,9029],{"class":147,"line":395},[145,9028,335],{"class":258},[145,9030,338],{"class":262},[145,9032,9033,9035],{"class":147,"line":400},[145,9034,335],{"class":258},[145,9036,6546],{"class":262},[145,9038,9039,9041],{"class":147,"line":415},[145,9040,335],{"class":258},[145,9042,4855],{"class":262},[145,9044,9045],{"class":147,"line":432},[145,9046,357],{"emptyLinePlaceholder":58},[145,9048,9049],{"class":147,"line":437},[145,9050,9051],{"class":174},"# ── Configuración ─────────────────────────────────────────────\n",[145,9053,9054,9056,9058,9060,9062,9064,9067],{"class":147,"line":448},[145,9055,381],{"class":155},[145,9057,372],{"class":258},[145,9059,6612],{"class":262},[145,9061,389],{"class":159},[145,9063,290],{"class":262},[145,9065,9066],{"class":159},"\"sk-your-api-key-here\"",[145,9068,392],{"class":262},[145,9070,9071,9073,9075],{"class":147,"line":472},[145,9072,369],{"class":155},[145,9074,372],{"class":258},[145,9076,9077],{"class":159}," \"https://api.evolink.ai/v1\"\n",[145,9079,9080,9082,9084],{"class":147,"line":483},[145,9081,440],{"class":155},[145,9083,372],{"class":258},[145,9085,445],{"class":262},[145,9087,9088,9090,9092,9094,9096,9098,9100],{"class":147,"line":489},[145,9089,451],{"class":159},[145,9091,454],{"class":262},[145,9093,457],{"class":258},[145,9095,460],{"class":159},[145,9097,463],{"class":155},[145,9099,466],{"class":159},[145,9101,469],{"class":262},[145,9103,9104,9106,9108],{"class":147,"line":494},[145,9105,475],{"class":159},[145,9107,454],{"class":262},[145,9109,480],{"class":159},[145,9111,9112],{"class":147,"line":499},[145,9113,486],{"class":262},[145,9115,9116],{"class":147,"line":519},[145,9117,357],{"emptyLinePlaceholder":58},[145,9119,9120],{"class":147,"line":525},[145,9121,357],{"emptyLinePlaceholder":58},[145,9123,9124],{"class":147,"line":536},[145,9125,9126],{"class":174},"# ── Funciones Auxiliares Reutilizables ────────────────────────\n",[145,9128,9129,9131,9133,9135,9137,9139,9142,9144,9147],{"class":147,"line":541},[145,9130,502],{"class":258},[145,9132,505],{"class":151},[145,9134,508],{"class":262},[145,9136,266],{"class":258},[145,9138,513],{"class":155},[145,9140,9141],{"class":262},", timeout",[145,9143,266],{"class":258},[145,9145,9146],{"class":155},"600",[145,9148,516],{"class":262},[145,9150,9151],{"class":147,"line":552},[145,9152,9153],{"class":159},"    \"\"\"Realiza polling de una tarea de generación de video hasta completarse.\"\"\"\n",[145,9155,9156,9159,9161],{"class":147,"line":563},[145,9157,9158],{"class":262},"    elapsed ",[145,9160,266],{"class":258},[145,9162,9163],{"class":155}," 0\n",[145,9165,9166,9168,9171,9173],{"class":147,"line":590},[145,9167,544],{"class":258},[145,9169,9170],{"class":262}," elapsed ",[145,9172,5784],{"class":258},[145,9174,9175],{"class":262}," timeout:\n",[145,9177,9178,9180,9182],{"class":147,"line":602},[145,9179,555],{"class":262},[145,9181,266],{"class":258},[145,9183,560],{"class":262},[145,9185,9186,9188,9190,9192,9194,9196,9198,9200,9202],{"class":147,"line":608},[145,9187,566],{"class":258},[145,9189,466],{"class":159},[145,9191,571],{"class":155},[145,9193,574],{"class":159},[145,9195,577],{"class":155},[145,9197,580],{"class":262},[145,9199,583],{"class":155},[145,9201,466],{"class":159},[145,9203,469],{"class":262},[145,9205,9206,9208,9210],{"class":147,"line":614},[145,9207,594],{"class":593},[145,9209,266],{"class":258},[145,9211,599],{"class":155},[145,9213,9214],{"class":147,"line":625},[145,9215,605],{"class":262},[145,9217,9218],{"class":147,"line":630},[145,9219,611],{"class":262},[145,9221,9222,9224,9226],{"class":147,"line":647},[145,9223,617],{"class":262},[145,9225,266],{"class":258},[145,9227,622],{"class":262},[145,9229,9230,9232,9234,9236,9238],{"class":147,"line":668},[145,9231,633],{"class":262},[145,9233,266],{"class":258},[145,9235,638],{"class":262},[145,9237,641],{"class":159},[145,9239,644],{"class":262},[145,9241,9242,9244,9246,9248,9250,9252,9254],{"class":147,"line":688},[145,9243,650],{"class":262},[145,9245,266],{"class":258},[145,9247,655],{"class":262},[145,9249,658],{"class":159},[145,9251,290],{"class":262},[145,9253,663],{"class":155},[145,9255,392],{"class":262},[145,9257,9258,9260,9262,9264,9266,9268,9270,9272,9274,9276,9278,9280,9282,9284,9286,9288,9290],{"class":147,"line":693},[145,9259,696],{"class":155},[145,9261,424],{"class":262},[145,9263,457],{"class":258},[145,9265,703],{"class":159},[145,9267,577],{"class":155},[145,9269,708],{"class":262},[145,9271,583],{"class":155},[145,9273,713],{"class":159},[145,9275,577],{"class":155},[145,9277,718],{"class":262},[145,9279,583],{"class":155},[145,9281,723],{"class":159},[145,9283,577],{"class":155},[145,9285,728],{"class":262},[145,9287,583],{"class":155},[145,9289,733],{"class":159},[145,9291,392],{"class":262},[145,9293,9294,9296,9298,9300,9302],{"class":147,"line":738},[145,9295,746],{"class":258},[145,9297,749],{"class":262},[145,9299,752],{"class":258},[145,9301,755],{"class":159},[145,9303,412],{"class":262},[145,9305,9306,9308],{"class":147,"line":743},[145,9307,763],{"class":258},[145,9309,766],{"class":262},[145,9311,9312,9314,9316,9318,9320],{"class":147,"line":760},[145,9313,772],{"class":258},[145,9315,749],{"class":262},[145,9317,752],{"class":258},[145,9319,779],{"class":159},[145,9321,412],{"class":262},[145,9323,9324,9326,9328,9330,9332,9334,9336,9338,9340,9343,9345,9348,9350,9352],{"class":147,"line":769},[145,9325,813],{"class":258},[145,9327,5569],{"class":155},[145,9329,424],{"class":262},[145,9331,457],{"class":258},[145,9333,2341],{"class":159},[145,9335,577],{"class":155},[145,9337,580],{"class":262},[145,9339,583],{"class":155},[145,9341,9342],{"class":159}," fallida: ",[145,9344,577],{"class":155},[145,9346,9347],{"class":262},"task",[145,9349,583],{"class":155},[145,9351,466],{"class":159},[145,9353,392],{"class":262},[145,9355,9356],{"class":147,"line":784},[145,9357,845],{"class":262},[145,9359,9360,9362,9365],{"class":147,"line":810},[145,9361,671],{"class":262},[145,9363,9364],{"class":258},"+=",[145,9366,9367],{"class":262}," poll_interval\n",[145,9369,9370,9372,9375,9377,9379,9381,9383,9385,9387,9390,9392,9394,9396,9398],{"class":147,"line":837},[145,9371,418],{"class":258},[145,9373,9374],{"class":155}," TimeoutError",[145,9376,424],{"class":262},[145,9378,457],{"class":258},[145,9380,2341],{"class":159},[145,9382,577],{"class":155},[145,9384,580],{"class":262},[145,9386,583],{"class":155},[145,9388,9389],{"class":159}," expiró después de ",[145,9391,577],{"class":155},[145,9393,6749],{"class":262},[145,9395,583],{"class":155},[145,9397,1369],{"class":159},[145,9399,392],{"class":262},[145,9401,9402],{"class":147,"line":842},[145,9403,357],{"emptyLinePlaceholder":58},[145,9405,9406],{"class":147,"line":848},[145,9407,357],{"emptyLinePlaceholder":58},[145,9409,9410,9412,9414,9417,9419,9422],{"class":147,"line":853},[145,9411,502],{"class":258},[145,9413,863],{"class":151},[145,9415,9416],{"class":262},"(url, filename",[145,9418,266],{"class":258},[145,9420,9421],{"class":159},"\"output.mp4\"",[145,9423,516],{"class":262},[145,9425,9426],{"class":147,"line":858},[145,9427,9428],{"class":159},"    \"\"\"Descarga un archivo de video desde una URL.\"\"\"\n",[145,9430,9431,9433,9435,9437,9440,9442,9444,9446,9448],{"class":147,"line":869},[145,9432,878],{"class":155},[145,9434,424],{"class":262},[145,9436,457],{"class":258},[145,9438,9439],{"class":159},"\"Descargando a ",[145,9441,577],{"class":155},[145,9443,890],{"class":262},[145,9445,583],{"class":155},[145,9447,895],{"class":159},[145,9449,392],{"class":262},[145,9451,9452,9455,9457,9459,9461,9463,9465],{"class":147,"line":875},[145,9453,9454],{"class":262},"    resp ",[145,9456,266],{"class":258},[145,9458,908],{"class":262},[145,9460,911],{"class":593},[145,9462,266],{"class":258},[145,9464,916],{"class":155},[145,9466,392],{"class":262},[145,9468,9469],{"class":147,"line":900},[145,9470,9471],{"class":262},"    resp.raise_for_status()\n",[145,9473,9474,9476,9478,9480,9482,9484,9486],{"class":147,"line":921},[145,9475,935],{"class":258},[145,9477,938],{"class":155},[145,9479,941],{"class":262},[145,9481,944],{"class":159},[145,9483,947],{"class":262},[145,9485,950],{"class":258},[145,9487,953],{"class":262},[145,9489,9490,9492,9494,9496,9498,9500,9502,9504],{"class":147,"line":927},[145,9491,959],{"class":258},[145,9493,962],{"class":262},[145,9495,965],{"class":258},[145,9497,6790],{"class":262},[145,9499,971],{"class":593},[145,9501,266],{"class":258},[145,9503,976],{"class":155},[145,9505,516],{"class":262},[145,9507,9508],{"class":147,"line":932},[145,9509,984],{"class":262},[145,9511,9512,9514,9516,9518,9520,9522,9524,9526,9528,9530,9533,9535,9537,9539,9541,9543],{"class":147,"line":956},[145,9513,878],{"class":155},[145,9515,424],{"class":262},[145,9517,457],{"class":258},[145,9519,1018],{"class":159},[145,9521,577],{"class":155},[145,9523,890],{"class":262},[145,9525,583],{"class":155},[145,9527,114],{"class":159},[145,9529,577],{"class":155},[145,9531,9532],{"class":262},"os.path.getsize(filename) ",[145,9534,1003],{"class":258},[145,9536,6825],{"class":155},[145,9538,1034],{"class":258},[145,9540,583],{"class":155},[145,9542,1039],{"class":159},[145,9544,392],{"class":262},[145,9546,9547],{"class":147,"line":981},[145,9548,357],{"emptyLinePlaceholder":58},[145,9550,9551],{"class":147,"line":987},[145,9552,357],{"emptyLinePlaceholder":58},[145,9554,9555,9557,9559,9561,9563,9565],{"class":147,"line":992},[145,9556,502],{"class":258},[145,9558,4866],{"class":151},[145,9560,4869],{"class":262},[145,9562,266],{"class":258},[145,9564,4874],{"class":155},[145,9566,516],{"class":262},[145,9568,9569],{"class":147,"line":1009},[145,9570,9571],{"class":159},"    \"\"\"Envía una solicitud de generación con reintento para errores transitorios.\"\"\"\n",[145,9573,9574,9576,9578,9580,9582],{"class":147,"line":1044},[145,9575,4938],{"class":258},[145,9577,4941],{"class":262},[145,9579,965],{"class":258},[145,9581,4946],{"class":155},[145,9583,4949],{"class":262},[145,9585,9586,9588],{"class":147,"line":1049},[145,9587,4954],{"class":258},[145,9589,412],{"class":262},[145,9591,9592,9594,9596],{"class":147,"line":1054},[145,9593,4961],{"class":262},[145,9595,266],{"class":258},[145,9597,1219],{"class":262},[145,9599,9600,9602,9604,9606,9608],{"class":147,"line":1065},[145,9601,4970],{"class":258},[145,9603,466],{"class":159},[145,9605,571],{"class":155},[145,9607,1232],{"class":159},[145,9609,469],{"class":262},[145,9611,9612,9614,9616,9618],{"class":147,"line":1075},[145,9613,4983],{"class":593},[145,9615,266],{"class":258},[145,9617,440],{"class":155},[145,9619,469],{"class":262},[145,9621,9622,9624,9626],{"class":147,"line":1092},[145,9623,4994],{"class":593},[145,9625,266],{"class":258},[145,9627,4999],{"class":262},[145,9629,9630,9632,9634],{"class":147,"line":1101},[145,9631,5004],{"class":593},[145,9633,266],{"class":258},[145,9635,9636],{"class":155},"30\n",[145,9638,9639],{"class":147,"line":1107},[145,9640,5017],{"class":262},[145,9642,9643,9645,9647,9649,9651],{"class":147,"line":1113},[145,9644,5031],{"class":258},[145,9646,2323],{"class":262},[145,9648,752],{"class":258},[145,9650,2328],{"class":155},[145,9652,412],{"class":262},[145,9654,9655,9657],{"class":147,"line":1119},[145,9656,5044],{"class":258},[145,9658,622],{"class":262},[145,9660,9661,9663,9665,9667,9669],{"class":147,"line":1125},[145,9662,5060],{"class":262},[145,9664,266],{"class":258},[145,9666,5065],{"class":262},[145,9668,794],{"class":159},[145,9670,5070],{"class":262},[145,9672,9673,9675,9677,9679,9681,9683,9685,9687,9689,9691,9693,9695,9697,9699,9701,9703],{"class":147,"line":1142},[145,9674,5031],{"class":258},[145,9676,2323],{"class":262},[145,9678,965],{"class":258},[145,9680,114],{"class":262},[145,9682,3452],{"class":155},[145,9684,290],{"class":262},[145,9686,4666],{"class":155},[145,9688,290],{"class":262},[145,9690,4684],{"class":155},[145,9692,290],{"class":262},[145,9694,4702],{"class":155},[145,9696,290],{"class":262},[145,9698,4720],{"class":155},[145,9700,290],{"class":262},[145,9702,4738],{"class":155},[145,9704,516],{"class":262},[145,9706,9707,9709,9711],{"class":147,"line":1159},[145,9708,5154],{"class":258},[145,9710,421],{"class":155},[145,9712,5159],{"class":262},[145,9714,9715,9717,9719,9721,9723,9725],{"class":147,"line":1176},[145,9716,5164],{"class":258},[145,9718,5167],{"class":159},[145,9720,577],{"class":155},[145,9722,5172],{"class":262},[145,9724,583],{"class":155},[145,9726,9727],{"class":159},": \"\n",[145,9729,9730,9732,9734,9736,9739,9742,9744,9747,9749,9751],{"class":147,"line":1189},[145,9731,5164],{"class":258},[145,9733,466],{"class":159},[145,9735,577],{"class":155},[145,9737,9738],{"class":262},"error.get(",[145,9740,9741],{"class":159},"'message'",[145,9743,290],{"class":262},[145,9745,9746],{"class":159},"'Desconocido'",[145,9748,108],{"class":262},[145,9750,583],{"class":155},[145,9752,5185],{"class":159},[145,9754,9755],{"class":147,"line":1195},[145,9756,5190],{"class":262},[145,9758,9759,9761,9763,9765,9767,9769,9771,9773,9775,9777,9779,9781],{"class":147,"line":1200},[145,9760,5031],{"class":258},[145,9762,2323],{"class":262},[145,9764,965],{"class":258},[145,9766,114],{"class":262},[145,9768,4756],{"class":155},[145,9770,290],{"class":262},[145,9772,4777],{"class":155},[145,9774,290],{"class":262},[145,9776,4797],{"class":155},[145,9778,290],{"class":262},[145,9780,4817],{"class":155},[145,9782,516],{"class":262},[145,9784,9785,9787,9789,9791,9793,9795,9797,9799,9801,9803,9805,9807],{"class":147,"line":1212},[145,9786,5230],{"class":262},[145,9788,266],{"class":258},[145,9790,114],{"class":262},[145,9792,5237],{"class":155},[145,9794,5240],{"class":258},[145,9796,5243],{"class":262},[145,9798,5246],{"class":258},[145,9800,5249],{"class":262},[145,9802,663],{"class":155},[145,9804,290],{"class":262},[145,9806,5256],{"class":155},[145,9808,392],{"class":262},[145,9810,9811,9813,9815,9817,9819,9821,9824,9826,9829,9831,9833,9835,9837,9840,9842,9844,9846,9848,9850],{"class":147,"line":1222},[145,9812,5263],{"class":155},[145,9814,424],{"class":262},[145,9816,457],{"class":258},[145,9818,5270],{"class":159},[145,9820,577],{"class":155},[145,9822,9823],{"class":262},"attempt",[145,9825,5246],{"class":258},[145,9827,9828],{"class":155},"1}",[145,9830,1003],{"class":159},[145,9832,577],{"class":155},[145,9834,5287],{"class":262},[145,9836,583],{"class":155},[145,9838,9839],{"class":159}," después de ",[145,9841,577],{"class":155},[145,9843,5305],{"class":262},[145,9845,5308],{"class":258},[145,9847,583],{"class":155},[145,9849,1369],{"class":159},[145,9851,392],{"class":262},[145,9853,9854],{"class":147,"line":1241},[145,9855,5338],{"class":262},[145,9857,9858],{"class":147,"line":1257},[145,9859,5343],{"class":258},[145,9861,9862,9864],{"class":147,"line":1271},[145,9863,5352],{"class":258},[145,9865,9866],{"class":262}," requests.exceptions.RequestException:\n",[145,9868,9869,9871,9873,9875,9877,9879,9881,9883,9885,9887,9889,9891],{"class":147,"line":1277},[145,9870,5365],{"class":262},[145,9872,266],{"class":258},[145,9874,114],{"class":262},[145,9876,5237],{"class":155},[145,9878,5240],{"class":258},[145,9880,5243],{"class":262},[145,9882,5246],{"class":258},[145,9884,5249],{"class":262},[145,9886,663],{"class":155},[145,9888,290],{"class":262},[145,9890,5256],{"class":155},[145,9892,392],{"class":262},[145,9894,9895,9897,9899,9901,9903,9905,9907,9909,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931],{"class":147,"line":1286},[145,9896,5392],{"class":155},[145,9898,424],{"class":262},[145,9900,457],{"class":258},[145,9902,5270],{"class":159},[145,9904,577],{"class":155},[145,9906,9823],{"class":262},[145,9908,5246],{"class":258},[145,9910,9828],{"class":155},[145,9912,1003],{"class":159},[145,9914,577],{"class":155},[145,9916,5287],{"class":262},[145,9918,583],{"class":155},[145,9920,9839],{"class":159},[145,9922,577],{"class":155},[145,9924,5305],{"class":262},[145,9926,5308],{"class":258},[145,9928,583],{"class":155},[145,9930,1369],{"class":159},[145,9932,392],{"class":262},[145,9934,9935],{"class":147,"line":1300},[145,9936,5441],{"class":262},[145,9938,9939],{"class":147,"line":1305},[145,9940,5446],{"class":258},[145,9942,9943,9945,9947,9949,9951,9953,9955,9957,9959,9961],{"class":147,"line":1311},[145,9944,418],{"class":258},[145,9946,5569],{"class":155},[145,9948,424],{"class":262},[145,9950,457],{"class":258},[145,9952,5576],{"class":159},[145,9954,577],{"class":155},[145,9956,5287],{"class":262},[145,9958,583],{"class":155},[145,9960,5585],{"class":159},[145,9962,392],{"class":262},[145,9964,9965],{"class":147,"line":1340},[145,9966,357],{"emptyLinePlaceholder":58},[145,9968,9969],{"class":147,"line":1374},[145,9970,357],{"emptyLinePlaceholder":58},[145,9972,9973,9975,9977],{"class":147,"line":1406},[145,9974,502],{"class":258},[145,9976,5648],{"class":151},[145,9978,5651],{"class":262},[145,9980,9981],{"class":147,"line":1411},[145,9982,9983],{"class":159},"    \"\"\"Valida el payload de generación antes de la llamada a la API.\"\"\"\n",[145,9985,9986,9988,9990],{"class":147,"line":1417},[145,9987,5674],{"class":262},[145,9989,266],{"class":258},[145,9991,5679],{"class":262},[145,9993,9994,9996,9998,10000,10002],{"class":147,"line":1434},[145,9995,2320],{"class":258},[145,9997,406],{"class":258},[145,9999,5697],{"class":262},[145,10001,5700],{"class":159},[145,10003,516],{"class":262},[145,10005,10006,10008,10010],{"class":147,"line":1439},[145,10007,5707],{"class":262},[145,10009,5710],{"class":159},[145,10011,392],{"class":262},[145,10013,10014,10016,10018,10020,10022,10024,10026,10028,10030,10032],{"class":147,"line":1445},[145,10015,2320],{"class":258},[145,10017,406],{"class":258},[145,10019,5697],{"class":262},[145,10021,5723],{"class":159},[145,10023,947],{"class":262},[145,10025,5728],{"class":258},[145,10027,406],{"class":258},[145,10029,5733],{"class":262},[145,10031,5723],{"class":159},[145,10033,5738],{"class":262},[145,10035,10036,10038,10041],{"class":147,"line":1465},[145,10037,5707],{"class":262},[145,10039,10040],{"class":159},"\"'prompt' es requerido\"",[145,10042,392],{"class":262},[145,10044,10045,10047,10049,10051,10053,10055,10057],{"class":147,"line":1493},[145,10046,5761],{"class":262},[145,10048,266],{"class":258},[145,10050,5697],{"class":262},[145,10052,5768],{"class":159},[145,10054,290],{"class":262},[145,10056,1133],{"class":155},[145,10058,392],{"class":262},[145,10060,10061,10063,10065,10067,10069,10071,10073,10075,10077],{"class":147,"line":1504},[145,10062,2320],{"class":258},[145,10064,5781],{"class":262},[145,10066,5784],{"class":258},[145,10068,5787],{"class":155},[145,10070,5790],{"class":258},[145,10072,5781],{"class":262},[145,10074,5795],{"class":258},[145,10076,5798],{"class":155},[145,10078,412],{"class":262},[145,10080,10081,10083,10085,10087,10089,10091,10093,10095],{"class":147,"line":1509},[145,10082,5707],{"class":262},[145,10084,457],{"class":258},[145,10086,5809],{"class":159},[145,10088,577],{"class":155},[145,10090,1587],{"class":262},[145,10092,583],{"class":155},[145,10094,466],{"class":159},[145,10096,392],{"class":262},[145,10098,10099,10101,10103,10105,10107,10109,10111],{"class":147,"line":1518},[145,10100,5855],{"class":262},[145,10102,266],{"class":258},[145,10104,5697],{"class":262},[145,10106,5862],{"class":159},[145,10108,290],{"class":262},[145,10110,1150],{"class":159},[145,10112,392],{"class":262},[145,10114,10115,10117,10119,10121,10123,10125,10127,10129,10131,10133,10135],{"class":147,"line":1523},[145,10116,2320],{"class":258},[145,10118,5875],{"class":262},[145,10120,5878],{"class":258},[145,10122,5881],{"class":258},[145,10124,5838],{"class":262},[145,10126,3829],{"class":159},[145,10128,290],{"class":262},[145,10130,1150],{"class":159},[145,10132,290],{"class":262},[145,10134,3525],{"class":159},[145,10136,10137],{"class":262},"}:\n",[145,10139,10140,10142,10144,10147,10149,10151,10153,10155],{"class":147,"line":1528},[145,10141,5707],{"class":262},[145,10143,457],{"class":258},[145,10145,10146],{"class":159},"\"Calidad inválida: ",[145,10148,577],{"class":155},[145,10150,1595],{"class":262},[145,10152,583],{"class":155},[145,10154,466],{"class":159},[145,10156,392],{"class":262},[145,10158,10159,10161],{"class":147,"line":1544},[145,10160,2320],{"class":258},[145,10162,6150],{"class":262},[145,10164,10166,10168,10170,10172,10175,10177,10179,10181,10183,10185,10187,10189,10191,10193,10195,10197,10199,10201,10203,10205,10207],{"class":147,"line":10165},100,[145,10167,6155],{"class":258},[145,10169,421],{"class":155},[145,10171,424],{"class":262},[145,10173,10174],{"class":159},"\"Validación fallida:",[145,10176,1476],{"class":155},[145,10178,466],{"class":159},[145,10180,6171],{"class":258},[145,10182,6174],{"class":159},[145,10184,1476],{"class":155},[145,10186,466],{"class":159},[145,10188,6181],{"class":262},[145,10190,457],{"class":258},[145,10192,6186],{"class":159},[145,10194,577],{"class":155},[145,10196,5509],{"class":262},[145,10198,583],{"class":155},[145,10200,466],{"class":159},[145,10202,6197],{"class":258},[145,10204,6200],{"class":262},[145,10206,965],{"class":258},[145,10208,6205],{"class":262},[145,10210,10212],{"class":147,"line":10211},101,[145,10213,357],{"emptyLinePlaceholder":58},[145,10215,10217],{"class":147,"line":10216},102,[145,10218,357],{"emptyLinePlaceholder":58},[145,10220,10222,10224,10226],{"class":147,"line":10221},103,[145,10223,502],{"class":258},[145,10225,2266],{"class":151},[145,10227,2269],{"class":262},[145,10229,10231],{"class":147,"line":10230},104,[145,10232,10233],{"class":159},"    \"\"\"Cancela una tarea pendiente o en procesamiento.\"\"\"\n",[145,10235,10237,10239,10241],{"class":147,"line":10236},105,[145,10238,903],{"class":262},[145,10240,266],{"class":258},[145,10242,1219],{"class":262},[145,10244,10246,10248,10250,10252,10254,10256,10258,10260,10262],{"class":147,"line":10245},106,[145,10247,1225],{"class":258},[145,10249,466],{"class":159},[145,10251,571],{"class":155},[145,10253,574],{"class":159},[145,10255,577],{"class":155},[145,10257,580],{"class":262},[145,10259,583],{"class":155},[145,10261,2301],{"class":159},[145,10263,469],{"class":262},[145,10265,10267,10269,10271],{"class":147,"line":10266},107,[145,10268,1244],{"class":593},[145,10270,266],{"class":258},[145,10272,599],{"class":155},[145,10274,10276],{"class":147,"line":10275},108,[145,10277,1274],{"class":262},[145,10279,10281,10283,10285,10287,10289],{"class":147,"line":10280},109,[145,10282,2320],{"class":258},[145,10284,2323],{"class":262},[145,10286,752],{"class":258},[145,10288,2328],{"class":155},[145,10290,412],{"class":262},[145,10292,10294,10296,10298,10300,10302,10304,10306,10308,10311],{"class":147,"line":10293},110,[145,10295,696],{"class":155},[145,10297,424],{"class":262},[145,10299,457],{"class":258},[145,10301,2341],{"class":159},[145,10303,577],{"class":155},[145,10305,580],{"class":262},[145,10307,583],{"class":155},[145,10309,10310],{"class":159}," cancelada.\"",[145,10312,392],{"class":262},[145,10314,10316,10318],{"class":147,"line":10315},111,[145,10317,2357],{"class":258},[145,10319,412],{"class":262},[145,10321,10323,10325,10327,10329,10331,10333,10335,10337,10339],{"class":147,"line":10322},112,[145,10324,696],{"class":155},[145,10326,424],{"class":262},[145,10328,457],{"class":258},[145,10330,2370],{"class":159},[145,10332,577],{"class":155},[145,10334,2375],{"class":262},[145,10336,583],{"class":155},[145,10338,466],{"class":159},[145,10340,392],{"class":262},[145,10342,10344],{"class":147,"line":10343},113,[145,10345,357],{"emptyLinePlaceholder":58},[145,10347,10349],{"class":147,"line":10348},114,[145,10350,357],{"emptyLinePlaceholder":58},[145,10352,10354],{"class":147,"line":10353},115,[145,10355,10356],{"class":174},"# ── Ejemplo 1: Texto a Video ──────────────────────────────────\n",[145,10358,10360,10362,10364],{"class":147,"line":10359},116,[145,10361,502],{"class":258},[145,10363,1059],{"class":151},[145,10365,1062],{"class":262},[145,10367,10369,10371,10373],{"class":147,"line":10368},117,[145,10370,1068],{"class":262},[145,10372,266],{"class":258},[145,10374,445],{"class":262},[145,10376,10378,10380,10382,10384],{"class":147,"line":10377},118,[145,10379,1078],{"class":159},[145,10381,454],{"class":262},[145,10383,1083],{"class":159},[145,10385,469],{"class":262},[145,10387,10389,10391],{"class":147,"line":10388},119,[145,10390,1095],{"class":159},[145,10392,1098],{"class":262},[145,10394,10396],{"class":147,"line":10395},120,[145,10397,1104],{"class":159},[145,10399,10401],{"class":147,"line":10400},121,[145,10402,1110],{"class":159},[145,10404,10406],{"class":147,"line":10405},122,[145,10407,1116],{"class":159},[145,10409,10411],{"class":147,"line":10410},123,[145,10412,1122],{"class":262},[145,10414,10416,10418,10420,10422],{"class":147,"line":10415},124,[145,10417,1128],{"class":159},[145,10419,454],{"class":262},[145,10421,1133],{"class":155},[145,10423,469],{"class":262},[145,10425,10427,10429,10431,10433],{"class":147,"line":10426},125,[145,10428,1145],{"class":159},[145,10430,454],{"class":262},[145,10432,1150],{"class":159},[145,10434,469],{"class":262},[145,10436,10438,10440,10442,10444],{"class":147,"line":10437},126,[145,10439,1162],{"class":159},[145,10441,454],{"class":262},[145,10443,1167],{"class":159},[145,10445,469],{"class":262},[145,10447,10449,10451,10453],{"class":147,"line":10448},127,[145,10450,1179],{"class":159},[145,10452,454],{"class":262},[145,10454,3553],{"class":155},[145,10456,10458],{"class":147,"line":10457},128,[145,10459,1192],{"class":262},[145,10461,10463],{"class":147,"line":10462},129,[145,10464,10465],{"class":262},"    validate_payload(payload)\n",[145,10467,10469,10471,10473],{"class":147,"line":10468},130,[145,10470,1289],{"class":262},[145,10472,266],{"class":258},[145,10474,8303],{"class":262},[145,10476,10478,10480,10482,10484,10487,10489,10491,10493,10495,10497,10500,10502,10504,10506,10508,10510,10512,10514,10517],{"class":147,"line":10477},131,[145,10479,878],{"class":155},[145,10481,424],{"class":262},[145,10483,457],{"class":258},[145,10485,10486],{"class":159},"\"Tarea: ",[145,10488,577],{"class":155},[145,10490,1325],{"class":262},[145,10492,1328],{"class":159},[145,10494,1331],{"class":262},[145,10496,583],{"class":155},[145,10498,10499],{"class":159}," (ETA: ",[145,10501,577],{"class":155},[145,10503,1325],{"class":262},[145,10505,1356],{"class":159},[145,10507,1359],{"class":262},[145,10509,1362],{"class":159},[145,10511,1331],{"class":262},[145,10513,583],{"class":155},[145,10515,10516],{"class":159},"s)\"",[145,10518,392],{"class":262},[145,10520,10522,10524,10526,10528,10530],{"class":147,"line":10521},132,[145,10523,1420],{"class":262},[145,10525,266],{"class":258},[145,10527,1425],{"class":262},[145,10529,1428],{"class":159},[145,10531,1431],{"class":262},[145,10533,10535,10538,10540,10542,10544,10547,10550],{"class":147,"line":10534},133,[145,10536,10537],{"class":262},"    download_video(result[",[145,10539,1456],{"class":159},[145,10541,1359],{"class":262},[145,10543,663],{"class":155},[145,10545,10546],{"class":262},"], ",[145,10548,10549],{"class":159},"\"texto_a_video.mp4\"",[145,10551,392],{"class":262},[145,10553,10555],{"class":147,"line":10554},134,[145,10556,357],{"emptyLinePlaceholder":58},[145,10558,10560],{"class":147,"line":10559},135,[145,10561,357],{"emptyLinePlaceholder":58},[145,10563,10565],{"class":147,"line":10564},136,[145,10566,10567],{"class":174},"# ── Ejemplo 2: Imagen a Video ─────────────────────────────────\n",[145,10569,10571,10573,10575],{"class":147,"line":10570},137,[145,10572,502],{"class":258},[145,10574,2453],{"class":151},[145,10576,1062],{"class":262},[145,10578,10580,10582,10584],{"class":147,"line":10579},138,[145,10581,1068],{"class":262},[145,10583,266],{"class":258},[145,10585,445],{"class":262},[145,10587,10589,10591,10593,10595],{"class":147,"line":10588},139,[145,10590,1078],{"class":159},[145,10592,454],{"class":262},[145,10594,1083],{"class":159},[145,10596,469],{"class":262},[145,10598,10600,10602],{"class":147,"line":10599},140,[145,10601,1095],{"class":159},[145,10603,1098],{"class":262},[145,10605,10607],{"class":147,"line":10606},141,[145,10608,2484],{"class":159},[145,10610,10612],{"class":147,"line":10611},142,[145,10613,2489],{"class":159},[145,10615,10617],{"class":147,"line":10616},143,[145,10618,10619],{"class":159},"            \"por el encuadre.\"\n",[145,10621,10623],{"class":147,"line":10622},144,[145,10624,1122],{"class":262},[145,10626,10628,10630,10633,10636],{"class":147,"line":10627},145,[145,10629,2503],{"class":159},[145,10631,10632],{"class":262},": [",[145,10634,10635],{"class":159},"\"https://example.com/your-image.jpg\"",[145,10637,10638],{"class":262},"],\n",[145,10640,10642,10644,10646,10648],{"class":147,"line":10641},146,[145,10643,1128],{"class":159},[145,10645,454],{"class":262},[145,10647,1133],{"class":155},[145,10649,469],{"class":262},[145,10651,10653,10655,10657],{"class":147,"line":10652},147,[145,10654,1145],{"class":159},[145,10656,454],{"class":262},[145,10658,8282],{"class":159},[145,10660,10662],{"class":147,"line":10661},148,[145,10663,1192],{"class":262},[145,10665,10667],{"class":147,"line":10666},149,[145,10668,10465],{"class":262},[145,10670,10672,10674,10676],{"class":147,"line":10671},150,[145,10673,1289],{"class":262},[145,10675,266],{"class":258},[145,10677,8303],{"class":262},[145,10679,10681,10683,10685,10687,10689,10691,10693,10695,10697,10699,10701],{"class":147,"line":10680},151,[145,10682,878],{"class":155},[145,10684,424],{"class":262},[145,10686,457],{"class":258},[145,10688,10486],{"class":159},[145,10690,577],{"class":155},[145,10692,1325],{"class":262},[145,10694,1328],{"class":159},[145,10696,1331],{"class":262},[145,10698,583],{"class":155},[145,10700,466],{"class":159},[145,10702,392],{"class":262},[145,10704,10706,10708,10710,10712,10714],{"class":147,"line":10705},152,[145,10707,1420],{"class":262},[145,10709,266],{"class":258},[145,10711,1425],{"class":262},[145,10713,1428],{"class":159},[145,10715,1431],{"class":262},[145,10717,10719,10721,10723,10725,10727,10729,10732],{"class":147,"line":10718},153,[145,10720,10537],{"class":262},[145,10722,1456],{"class":159},[145,10724,1359],{"class":262},[145,10726,663],{"class":155},[145,10728,10546],{"class":262},[145,10730,10731],{"class":159},"\"imagen_a_video.mp4\"",[145,10733,392],{"class":262},[145,10735,10737],{"class":147,"line":10736},154,[145,10738,357],{"emptyLinePlaceholder":58},[145,10740,10742],{"class":147,"line":10741},155,[145,10743,357],{"emptyLinePlaceholder":58},[145,10745,10747],{"class":147,"line":10746},156,[145,10748,10749],{"class":174},"# ── Ejemplo 3: Video Vertical para Redes Sociales ─────────────\n",[145,10751,10753,10755,10758],{"class":147,"line":10752},157,[145,10754,502],{"class":258},[145,10756,10757],{"class":151}," social_media_video",[145,10759,1062],{"class":262},[145,10761,10763,10765,10767],{"class":147,"line":10762},158,[145,10764,1068],{"class":262},[145,10766,266],{"class":258},[145,10768,445],{"class":262},[145,10770,10772,10774,10776,10778],{"class":147,"line":10771},159,[145,10773,1078],{"class":159},[145,10775,454],{"class":262},[145,10777,1083],{"class":159},[145,10779,469],{"class":262},[145,10781,10783,10785],{"class":147,"line":10782},160,[145,10784,1095],{"class":159},[145,10786,1098],{"class":262},[145,10788,10790],{"class":147,"line":10789},161,[145,10791,10792],{"class":159},"            \"Un barista vierte latte art en cámara lenta. \"\n",[145,10794,10796],{"class":147,"line":10795},162,[145,10797,10798],{"class":159},"            \"Plano cenital cerrado, iluminación cálida de café.\"\n",[145,10800,10802],{"class":147,"line":10801},163,[145,10803,1122],{"class":262},[145,10805,10807,10809,10811,10813],{"class":147,"line":10806},164,[145,10808,1128],{"class":159},[145,10810,454],{"class":262},[145,10812,3513],{"class":155},[145,10814,469],{"class":262},[145,10816,10818,10820,10822,10824],{"class":147,"line":10817},165,[145,10819,1145],{"class":159},[145,10821,454],{"class":262},[145,10823,3525],{"class":159},[145,10825,469],{"class":262},[145,10827,10829,10831,10833,10835],{"class":147,"line":10828},166,[145,10830,1162],{"class":159},[145,10832,454],{"class":262},[145,10834,3537],{"class":159},[145,10836,469],{"class":262},[145,10838,10840,10842,10844],{"class":147,"line":10839},167,[145,10841,1179],{"class":159},[145,10843,454],{"class":262},[145,10845,3553],{"class":155},[145,10847,10849],{"class":147,"line":10848},168,[145,10850,1192],{"class":262},[145,10852,10854],{"class":147,"line":10853},169,[145,10855,10465],{"class":262},[145,10857,10859,10861,10863],{"class":147,"line":10858},170,[145,10860,1289],{"class":262},[145,10862,266],{"class":258},[145,10864,8303],{"class":262},[145,10866,10868,10870,10872,10874,10876,10878,10880,10882,10884,10886,10888],{"class":147,"line":10867},171,[145,10869,878],{"class":155},[145,10871,424],{"class":262},[145,10873,457],{"class":258},[145,10875,10486],{"class":159},[145,10877,577],{"class":155},[145,10879,1325],{"class":262},[145,10881,1328],{"class":159},[145,10883,1331],{"class":262},[145,10885,583],{"class":155},[145,10887,466],{"class":159},[145,10889,392],{"class":262},[145,10891,10893,10895,10897,10899,10901],{"class":147,"line":10892},172,[145,10894,1420],{"class":262},[145,10896,266],{"class":258},[145,10898,1425],{"class":262},[145,10900,1428],{"class":159},[145,10902,1431],{"class":262},[145,10904,10906,10908,10910,10912,10914,10916,10919],{"class":147,"line":10905},173,[145,10907,10537],{"class":262},[145,10909,1456],{"class":159},[145,10911,1359],{"class":262},[145,10913,663],{"class":155},[145,10915,10546],{"class":262},[145,10917,10918],{"class":159},"\"video_social.mp4\"",[145,10920,392],{"class":262},[145,10922,10924],{"class":147,"line":10923},174,[145,10925,357],{"emptyLinePlaceholder":58},[145,10927,10929],{"class":147,"line":10928},175,[145,10930,357],{"emptyLinePlaceholder":58},[145,10932,10934,10936,10938,10940,10942],{"class":147,"line":10933},176,[145,10935,403],{"class":258},[145,10937,1533],{"class":155},[145,10939,1536],{"class":258},[145,10941,1539],{"class":159},[145,10943,412],{"class":262},[145,10945,10947,10949,10951,10954],{"class":147,"line":10946},177,[145,10948,878],{"class":155},[145,10950,424],{"class":262},[145,10952,10953],{"class":159},"\"=== Texto a Video ===\"",[145,10955,392],{"class":262},[145,10957,10959],{"class":147,"line":10958},178,[145,10960,1547],{"class":262},[145,10962,10964],{"class":147,"line":10963},179,[145,10965,10966],{"class":174},"    # print(\"\\n=== Imagen a Video ===\")\n",[145,10968,10970],{"class":147,"line":10969},180,[145,10971,10972],{"class":174},"    # image_to_video()  # Descomente y configure su URL de imagen\n",[145,10974,10976],{"class":147,"line":10975},181,[145,10977,10978],{"class":174},"    # print(\"\\n=== Video para Redes Sociales ===\")\n",[145,10980,10982],{"class":147,"line":10981},182,[145,10983,10984],{"class":174},"    # social_media_video()\n",[18,10986,10987],{},[11,10988,10989,10992,10993,2766,10995,10998],{},[23,10990,10991],{},"Consejo:"," Para probar con el modelo actualmente disponible, cambie ",[28,10994,1083],{},[28,10996,10997],{},"\"seedance-1.5-pro\"",". La interfaz de la API es idéntica — mismo endpoint, mismos parámetros, mismo formato de respuesta. Cuando Seedance 2.0 esté completamente implementado, simplemente vuelva a cambiar el nombre del modelo.",[11,11000,11001],{},[23,11002,11003],{},[37,11004,11006],{"href":39,"rel":11005},[41],"Empiece a construir → Obtenga su clave API gratuita en EvoLink",[11008,11009,11010],"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":141,"searchDepth":166,"depth":166,"links":11012},[11013,11016,11017,11021,11026,11031,11035,11041,11049,11050,11055,11067],{"id":50,"depth":166,"text":51,"children":11014},[11015],{"id":94,"depth":178,"text":95},{"id":204,"depth":166,"text":205},{"id":315,"depth":166,"text":316,"children":11018},[11019,11020],{"id":1658,"depth":178,"text":1659},{"id":1986,"depth":178,"text":1987},{"id":2032,"depth":166,"text":2033,"children":11022},[11023,11024,11025],{"id":2082,"depth":178,"text":2083},{"id":2162,"depth":178,"text":2163},{"id":2250,"depth":178,"text":2251},{"id":2417,"depth":166,"text":2418,"children":11027},[11028,11029,11030],{"id":2753,"depth":178,"text":2754},{"id":3031,"depth":178,"text":3032},{"id":3107,"depth":178,"text":3108},{"id":3202,"depth":166,"text":3203,"children":11032},[11033,11034],{"id":3456,"depth":178,"text":3457},{"id":3866,"depth":178,"text":3867},{"id":3977,"depth":166,"text":3978,"children":11036},[11037,11038,11039,11040],{"id":3984,"depth":178,"text":3985},{"id":4621,"depth":178,"text":4622},{"id":4835,"depth":178,"text":4836},{"id":5632,"depth":178,"text":5633},{"id":6232,"depth":166,"text":6233,"children":11042},[11043,11044,11045,11046,11047,11048],{"id":6243,"depth":178,"text":6244},{"id":6422,"depth":178,"text":6423},{"id":6488,"depth":178,"text":6489},{"id":7709,"depth":178,"text":7710},{"id":7846,"depth":178,"text":7847},{"id":8025,"depth":178,"text":8026},{"id":8117,"depth":166,"text":8118},{"id":8706,"depth":166,"text":8707,"children":11051},[11052,11053,11054],{"id":8713,"depth":178,"text":8714},{"id":8757,"depth":178,"text":8758},{"id":8784,"depth":178,"text":8785},{"id":8835,"depth":166,"text":8836,"children":11056},[11057,11058,11059,11060,11061,11062,11063,11064,11065,11066],{"id":8839,"depth":178,"text":8840},{"id":8849,"depth":178,"text":8850},{"id":8859,"depth":178,"text":8860},{"id":8869,"depth":178,"text":8870},{"id":8884,"depth":178,"text":8885},{"id":8902,"depth":178,"text":8903},{"id":8916,"depth":178,"text":8917},{"id":8935,"depth":178,"text":8936},{"id":8946,"depth":178,"text":8947},{"id":8966,"depth":178,"text":8967},{"id":8980,"depth":166,"text":8981},"Genere su primer video con IA usando la API de Seedance 2.0 en Python. Tutorial paso a paso: texto a video, imagen a video, polling asíncrono, webhooks y manejo de errores.","md",{"date":11071,"image":11072,"seoTitle":11073,"author":11074},"2026-02-27","/s2-hero-api-tutorial.webp","Tutorial de API de Seedance 2.0: Primer Video con IA en Python (2026)","J @ EvoLink","/es/blog/seedance-2-api-tutorial-python",{"title":6,"description":11068},"es/blog/seedance-2-api-tutorial-python","5tlTF_5-Yod93G7RERYJAIXHuwb-7w05_eUQLqeLuro",{"id":11080,"title":11081,"body":11082,"description":13283,"extension":11069,"meta":13284,"navigation":58,"path":13287,"seo":13288,"stem":13289,"__hash__":13290},"content/es/blog/seedance-2-camera-movement-api.md","Cómo replicar movimientos de cámara con la API de Seedance 2.0",{"type":8,"value":11083,"toc":13234},[11084,11087,11093,11100,11106,11126,11129,11140,11142,11146,11149,11156,11182,11185,11188,11190,11194,11203,11207,11213,11216,11221,11227,11232,11238,11245,11249,11320,11330,11340,11342,11346,11350,11370,11374,11387,11391,11742,11745,11755,11757,11761,11771,11774,11778,11784,11794,11798,11804,11807,11829,11833,12037,12041,12047,12052,12057,12063,12065,12069,12076,12079,12082,12087,12092,12095,12101,12104,12306,12310,12317,12322,12324,12328,12331,12334,12339,12344,12347,12353,12356,12553,12557,12560,12606,12609,12611,12615,12618,12622,12625,12642,12883,12887,12890,12970,12976,12981,12983,12987,12991,12996,13002,13007,13012,13018,13022,13025,13031,13035,13046,13052,13056,13059,13071,13075,13078,13092,13094,13097,13101,13113,13117,13120,13124,13130,13134,13137,13141,13150,13152,13156,13162,13165,13185,13188,13196,13198,13203,13224,13226,13231],[11,11085,11086],{},"El movimiento de cámara es lo que separa un video plano y estático de algo que se siente cinematográfico. Un dolly zoom crea tensión. Un plano orbital añade grandiosidad. Un plano de seguimiento continuo construye inmersión. Tradicionalmente, lograr estos efectos requiere equipos costosos — gimbals, grúas, drones, Steadicams — además de un operador que sepa utilizarlos.",[11,11088,11089,11090,11092],{},"Seedance 2.0 elimina el hardware. Suba un video de referencia que contenga el movimiento de cámara que desea, indique al modelo qué hacer con él mediante etiquetas ",[28,11091,2773],{},", y la API genera contenido nuevo que replica el lenguaje de cámara exacto — la velocidad, la trayectoria, el ritmo, las curvas de aceleración.",[11,11094,11095],{},[11096,11097],"img",{"alt":11098,"src":11099},"Replicación de movimiento de cámara cinematográfico con la API de Seedance 2.0 — visualización de riel de dolly","/s4-hero-camera-movement.webp",[11,11101,11102,11103,323],{},"Este tutorial le guía a través de tres casos completos de replicación de cámara usando la API de Seedance 2.0 a través de ",[37,11104,213],{"href":211,"rel":11105},[41],[70,11107,11108,11114,11120],{},[73,11109,11110,11113],{},[23,11111,11112],{},"Plano de seguimiento continuo"," — un seguimiento de cámara sin cortes a través de múltiples entornos",[73,11115,11116,11119],{},[23,11117,11118],{},"Zoom de Hitchcock (dolly zoom)"," — el clásico efecto vértigo",[73,11121,11122,11125],{},[23,11123,11124],{},"Cámara orbital"," — un plano de rotación de 360° alrededor de un sujeto",[11,11127,11128],{},"Cada caso incluye un script completo en Python que puede copiar, pegar y ejecutar.",[11,11130,11131,11134,11135,11139],{},[23,11132,11133],{},"Requisitos previos:"," Python 3.8+, una ",[37,11136,11138],{"href":211,"rel":11137},[41],"clave API de EvoLink"," (nivel gratuito disponible) y un video de referencia para cada tipo de movimiento de cámara.",[45,11141],{},[48,11143,11145],{"id":11144},"por-qué-la-replicación-de-movimiento-de-cámara-cambia-el-video-con-ia","Por qué la replicación de movimiento de cámara cambia el video con IA",[11,11147,11148],{},"La mayoría de los generadores de video con IA ofrecen un control de cámara básico basado en texto. Usted escribe \"dolly in\" o \"pan left\" y espera que el modelo lo interprete correctamente. Los resultados son impredecibles — a veces obtiene un push-in suave, a veces una panorámica brusca, a veces nada cambia en absoluto.",[11,11150,11151,11152,11155],{},"Seedance 2.0 adopta un enfoque fundamentalmente diferente: ",[23,11153,11154],{},"mostrar, no describir",". En lugar de describir el movimiento de cámara con palabras, usted sube un video que demuestra el movimiento exacto que desea. El modelo analiza la referencia y reproduce:",[97,11157,11158,11164,11170,11176],{},[73,11159,11160,11163],{},[23,11161,11162],{},"Trayectoria de cámara"," — recorridos de seguimiento, arcos orbitales, movimientos de grúa",[73,11165,11166,11169],{},[23,11167,11168],{},"Velocidad y aceleración"," — entrada suave, salida suave, paradas bruscas, deslizamientos fluidos",[73,11171,11172,11175],{},[23,11173,11174],{},"Comportamiento focal"," — sincronización del cambio de enfoque, variaciones de profundidad de campo",[73,11177,11178,11181],{},[23,11179,11180],{},"Ritmo compositivo"," — cuánto tiempo se mantiene cada encuadre antes de que la cámara se mueva",[11,11183,11184],{},"Esto significa que puede tomar un movimiento de cámara de una película de Hollywood, un plano de dron de YouTube o un clip de gimbal que filmó usted mismo — y aplicar ese movimiento exacto a contenido completamente nuevo.",[11,11186,11187],{},"Ninguna otra API de video con IA ofrece este nivel de control de cámara. Sora 2 y Kling 3.0 dependen de prompts de texto para la dirección de cámara. Veo 3.1 admite palabras clave básicas de cámara. Solo Seedance 2.0 acepta entrada de video de referencia específicamente para la extracción del lenguaje de cámara.",[45,11189],{},[48,11191,11193],{"id":11192},"cómo-seedance-20-lee-el-lenguaje-de-cámara","Cómo Seedance 2.0 lee el lenguaje de cámara",[11,11195,2757,11196,11198,11199,11202],{},[28,11197,2773],{}," es el mecanismo. Cuando sube un video de referencia y lo etiqueta en su prompt, usted especifica ",[2434,11200,11201],{},"qué"," debe extraer el modelo de él. Esto es fundamental — un solo video de referencia contiene movimiento de cámara, movimiento del sujeto, efectos visuales, iluminación y ritmo. Necesita indicar al modelo qué elemento utilizar.",[92,11204,11206],{"id":11205},"la-sintaxis-de-la-etiqueta-video","La sintaxis de la etiqueta @Video",[11,11208,11209,11212],{},[28,11210,11211],{},"@Video1"," — referencia de movimiento de cámara y trayectoria de seguimiento",[11,11214,11215],{},"El prompt indica explícitamente qué referenciar. Compare estos dos enfoques:",[11,11217,11218],{},[23,11219,11220],{},"Vago (poco fiable):",[136,11222,11225],{"className":11223,"code":11224,"language":1999},[1997],"Use @Video1 as reference. Generate a city scene.\n",[28,11226,11224],{"__ignoreMap":141},[11,11228,11229],{},[23,11230,11231],{},"Específico (fiable):",[136,11233,11236],{"className":11234,"code":11235,"language":1999},[1997],"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,11237,11235],{"__ignoreMap":141},[11,11239,11240,11241,11244],{},"La segunda forma le indica al modelo: extrae ",[2434,11242,11243],{},"únicamente"," el lenguaje de cámara de la referencia. Genera contenido nuevo (samurái, bosque de bambú) pero mueve la cámara virtual exactamente como se mueve la cámara del video de referencia.",[92,11246,11248],{"id":11247},"qué-puede-extraer","Qué puede extraer",[1849,11250,11251,11264],{},[1852,11252,11253],{},[1855,11254,11255,11258,11261],{},[1858,11256,11257],{},"Elemento de referencia",[1858,11259,11260],{},"Lenguaje de prompt",[1858,11262,11263],{},"Ejemplo",[1865,11265,11266,11276,11287,11298,11309],{},[1855,11267,11268,11270,11273],{},[1870,11269,11162],{},[1870,11271,11272],{},"\"replicate camera movement\"",[1870,11274,11275],{},"Seguimiento, dolly, órbita, grúa",[1855,11277,11278,11281,11284],{},[1870,11279,11280],{},"Velocidad de cámara",[1870,11282,11283],{},"\"match camera pacing\"",[1870,11285,11286],{},"Avance lento, panorámica rápida",[1855,11288,11289,11292,11295],{},[1870,11290,11291],{},"Cámara + movimiento del sujeto",[1870,11293,11294],{},"\"replicate camera and choreography\"",[1870,11296,11297],{},"Combinación de baile + cámara",[1855,11299,11300,11303,11306],{},[1870,11301,11302],{},"Solo movimiento del sujeto",[1870,11304,11305],{},"\"replicate movement/action from @Video1\"",[1870,11307,11308],{},"Patrón de caminata del personaje",[1855,11310,11311,11314,11317],{},[1870,11312,11313],{},"Efectos visuales",[1870,11315,11316],{},"\"replicate transition effects\"",[1870,11318,11319],{},"Transiciones de panorámica rápida, morphs",[11,11321,11322,11325,11326,11329],{},[23,11323,11324],{},"Regla clave:"," Sea explícito sobre lo que está referenciando. Si quiere ",[2434,11327,11328],{},"solo"," el movimiento de cámara, diga \"camera movement\". Si también quiere la coreografía de acción, mencione ambos. La ambigüedad produce resultados mixtos.",[11,11331,11332,11333,11336,11337,1580],{},"Para una guía completa del sistema de referencias ",[28,11334,11335],{},"@"," tag, consulte nuestro artículo ",[37,11338,11339],{"href":2781},"Referencias Multimodales: La Guía Definitiva de @Tags",[45,11341],{},[48,11343,11345],{"id":11344},"configuración-de-su-entorno","Configuración de su entorno",[92,11347,11349],{"id":11348},"requisitos","Requisitos",[97,11351,11352,11354,11360,11367],{},[73,11353,103],{},[73,11355,11356,11357],{},"Biblioteca ",[28,11358,11359],{},"requests",[73,11361,11362,11363,108],{},"Clave API de EvoLink (",[37,11364,11366],{"href":211,"rel":11365},[41],"regístrese gratis",[73,11368,11369],{},"Archivos de video de referencia (MP4, 2–15 segundos, menos de 50 MB, 480p–720p)",[92,11371,11373],{"id":11372},"instalar-dependencias","Instalar dependencias",[136,11375,11377],{"className":138,"code":11376,"language":140,"meta":141,"style":141},"pip install requests\n",[28,11378,11379],{"__ignoreMap":141},[145,11380,11381,11383,11385],{"class":147,"line":148},[145,11382,190],{"class":151},[145,11384,193],{"class":159},[145,11386,352],{"class":159},[92,11388,11390],{"id":11389},"configuración-base-de-la-api","Configuración base de la API",[136,11392,11394],{"className":326,"code":11393,"language":328,"meta":141,"style":141},"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,11395,11396,11402,11408,11412,11421,11429,11437,11454,11462,11466,11470,11493,11501,11511,11519,11539,11547,11551,11561,11574,11578,11590,11621,11627,11639,11666,11672,11676,11706,11711,11720,11724,11735],{"__ignoreMap":141},[145,11397,11398,11400],{"class":147,"line":148},[145,11399,335],{"class":258},[145,11401,352],{"class":262},[145,11403,11404,11406],{"class":147,"line":166},[145,11405,335],{"class":258},[145,11407,345],{"class":262},[145,11409,11410],{"class":147,"line":178},[145,11411,357],{"emptyLinePlaceholder":58},[145,11413,11414,11416,11418],{"class":147,"line":187},[145,11415,4126],{"class":155},[145,11417,372],{"class":258},[145,11419,11420],{"class":159}," \"your-evolink-api-key\"\n",[145,11422,11423,11425,11427],{"class":147,"line":360},[145,11424,369],{"class":155},[145,11426,372],{"class":258},[145,11428,9077],{"class":159},[145,11430,11431,11433,11435],{"class":147,"line":366},[145,11432,440],{"class":155},[145,11434,372],{"class":258},[145,11436,445],{"class":262},[145,11438,11439,11441,11443,11445,11447,11450,11452],{"class":147,"line":378},[145,11440,451],{"class":159},[145,11442,454],{"class":262},[145,11444,457],{"class":258},[145,11446,460],{"class":159},[145,11448,11449],{"class":155},"{EVOLINK_API_KEY}",[145,11451,466],{"class":159},[145,11453,469],{"class":262},[145,11455,11456,11458,11460],{"class":147,"line":395},[145,11457,475],{"class":159},[145,11459,454],{"class":262},[145,11461,480],{"class":159},[145,11463,11464],{"class":147,"line":400},[145,11465,486],{"class":262},[145,11467,11468],{"class":147,"line":415},[145,11469,357],{"emptyLinePlaceholder":58},[145,11471,11472,11474,11477,11480,11482,11484,11486,11488,11491],{"class":147,"line":432},[145,11473,502],{"class":258},[145,11475,11476],{"class":151}," poll_task",[145,11478,11479],{"class":262},"(task_id, interval",[145,11481,266],{"class":258},[145,11483,1133],{"class":155},[145,11485,9141],{"class":262},[145,11487,266],{"class":258},[145,11489,11490],{"class":155},"300",[145,11492,516],{"class":262},[145,11494,11495,11497,11499],{"class":147,"line":437},[145,11496,9158],{"class":262},[145,11498,266],{"class":258},[145,11500,9163],{"class":155},[145,11502,11503,11505,11507,11509],{"class":147,"line":448},[145,11504,544],{"class":258},[145,11506,9170],{"class":262},[145,11508,5784],{"class":258},[145,11510,9175],{"class":262},[145,11512,11513,11515,11517],{"class":147,"line":472},[145,11514,6733],{"class":262},[145,11516,266],{"class":258},[145,11518,560],{"class":262},[145,11520,11521,11523,11525,11527,11529,11531,11533,11535,11537],{"class":147,"line":483},[145,11522,566],{"class":258},[145,11524,466],{"class":159},[145,11526,571],{"class":155},[145,11528,574],{"class":159},[145,11530,577],{"class":155},[145,11532,580],{"class":262},[145,11534,583],{"class":155},[145,11536,466],{"class":159},[145,11538,469],{"class":262},[145,11540,11541,11543,11545],{"class":147,"line":489},[145,11542,594],{"class":593},[145,11544,266],{"class":258},[145,11546,599],{"class":155},[145,11548,11549],{"class":147,"line":494},[145,11550,605],{"class":262},[145,11552,11553,11556,11558],{"class":147,"line":499},[145,11554,11555],{"class":262},"        result ",[145,11557,266],{"class":258},[145,11559,11560],{"class":262}," resp.json()\n",[145,11562,11563,11565,11567,11570,11572],{"class":147,"line":519},[145,11564,633],{"class":262},[145,11566,266],{"class":258},[145,11568,11569],{"class":262}," result.get(",[145,11571,641],{"class":159},[145,11573,392],{"class":262},[145,11575,11576],{"class":147,"line":525},[145,11577,357],{"emptyLinePlaceholder":58},[145,11579,11580,11582,11584,11586,11588],{"class":147,"line":536},[145,11581,746],{"class":258},[145,11583,749],{"class":262},[145,11585,752],{"class":258},[145,11587,755],{"class":159},[145,11589,412],{"class":262},[145,11591,11592,11594,11596,11598,11601,11603,11606,11609,11611,11613,11615,11617,11619],{"class":147,"line":541},[145,11593,5392],{"class":155},[145,11595,424],{"class":262},[145,11597,457],{"class":258},[145,11599,11600],{"class":159},"\"Video ready: ",[145,11602,577],{"class":155},[145,11604,11605],{"class":262},"result[",[145,11607,11608],{"class":159},"'results'",[145,11610,1359],{"class":262},[145,11612,663],{"class":155},[145,11614,1331],{"class":262},[145,11616,583],{"class":155},[145,11618,466],{"class":159},[145,11620,392],{"class":262},[145,11622,11623,11625],{"class":147,"line":552},[145,11624,763],{"class":258},[145,11626,1515],{"class":262},[145,11628,11629,11631,11633,11635,11637],{"class":147,"line":563},[145,11630,772],{"class":258},[145,11632,749],{"class":262},[145,11634,752],{"class":258},[145,11636,779],{"class":159},[145,11638,412],{"class":262},[145,11640,11641,11643,11645,11647,11650,11652,11655,11658,11660,11662,11664],{"class":147,"line":590},[145,11642,5392],{"class":155},[145,11644,424],{"class":262},[145,11646,457],{"class":258},[145,11648,11649],{"class":159},"\"Generation failed: ",[145,11651,577],{"class":155},[145,11653,11654],{"class":262},"result.get(",[145,11656,11657],{"class":159},"'error'",[145,11659,108],{"class":262},[145,11661,583],{"class":155},[145,11663,466],{"class":159},[145,11665,392],{"class":262},[145,11667,11668,11670],{"class":147,"line":602},[145,11669,763],{"class":258},[145,11671,1515],{"class":262},[145,11673,11674],{"class":147,"line":608},[145,11675,357],{"emptyLinePlaceholder":58},[145,11677,11678,11680,11682,11684,11687,11689,11691,11693,11695,11697,11699,11701,11704],{"class":147,"line":614},[145,11679,696],{"class":155},[145,11681,424],{"class":262},[145,11683,457],{"class":258},[145,11685,11686],{"class":159},"\"Status: ",[145,11688,577],{"class":155},[145,11690,718],{"class":262},[145,11692,583],{"class":155},[145,11694,114],{"class":159},[145,11696,577],{"class":155},[145,11698,708],{"class":262},[145,11700,583],{"class":155},[145,11702,11703],{"class":159},"s elapsed)\"",[145,11705,392],{"class":262},[145,11707,11708],{"class":147,"line":625},[145,11709,11710],{"class":262},"        time.sleep(interval)\n",[145,11712,11713,11715,11717],{"class":147,"line":630},[145,11714,671],{"class":262},[145,11716,9364],{"class":258},[145,11718,11719],{"class":262}," interval\n",[145,11721,11722],{"class":147,"line":647},[145,11723,357],{"emptyLinePlaceholder":58},[145,11725,11726,11728,11730,11733],{"class":147,"line":668},[145,11727,878],{"class":155},[145,11729,424],{"class":262},[145,11731,11732],{"class":159},"\"Timeout reached\"",[145,11734,392],{"class":262},[145,11736,11737,11739],{"class":147,"line":688},[145,11738,1512],{"class":258},[145,11740,11741],{"class":155}," None\n",[11,11743,11744],{},"Este código base maneja la autenticación y el sondeo de tareas. Cada caso a continuación se construye sobre él.",[11,11746,11747,11749,11750,11754],{},[23,11748,8829],{}," en ",[37,11751,11753],{"href":211,"rel":11752},[41],"evolink.ai"," para seguir los ejemplos a continuación.",[45,11756],{},[48,11758,11760],{"id":11759},"caso-1-plano-de-seguimiento-continuo","Caso 1: Plano de seguimiento continuo",[11,11762,11763,11764,11767,11768,1580],{},"El plano de seguimiento continuo es una de las técnicas de cámara más espectaculares en el cine. La cámara sigue a un sujeto a través de múltiples entornos en una sola toma continua — sin cortes. Piense en la famosa escena del Copacabana en ",[2434,11765,11766],{},"Goodfellas"," o la pelea del pasillo en ",[2434,11769,11770],{},"Oldboy",[11,11772,11773],{},"Con Seedance 2.0, usted replica esto subiendo un video de referencia que demuestra un movimiento de seguimiento continuo, y luego genera contenido nuevo que sigue la misma trayectoria de cámara.",[92,11775,11777],{"id":11776},"lo-que-necesita","Lo que necesita",[11,11779,11780,11783],{},[23,11781,11782],{},"Video de referencia:"," Cualquier clip que muestre un movimiento de cámara de seguimiento continuo (2–15 segundos). Un plano de gimbal caminando, un seguimiento con dron o un clip de Steadicam funcionan bien.",[11,11785,11786,11789,11790,11793],{},[23,11787,11788],{},"Prompt:"," Describa el ",[2434,11791,11792],{},"contenido nuevo"," a generar, mientras referencia el movimiento de cámara de su video.",[92,11795,11797],{"id":11796},"el-prompt","El prompt",[136,11799,11802],{"className":11800,"code":11801,"language":1999},[1997],"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,11803,11801],{"__ignoreMap":141},[11,11805,11806],{},"Elementos clave de este prompt:",[97,11808,11809,11817,11823],{},[73,11810,11811,11814,11815],{},[23,11812,11813],{},"Líneas 1–3:"," Indica explícitamente al modelo que extraiga el movimiento de cámara de ",[28,11816,11211],{},[73,11818,11819,11822],{},[23,11820,11821],{},"Líneas 5–8:"," Describe contenido completamente nuevo — el modelo genera este tema",[73,11824,11825,11828],{},[23,11826,11827],{},"\"No cuts\":"," Refuerza el requisito de toma continua",[92,11830,11832],{"id":11831},"código-python-completo","Código Python completo",[136,11834,11836],{"className":326,"code":11835,"language":328,"meta":141,"style":141},"# 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,11837,11838,11843,11847,11855,11867,11877,11885,11895,11901,11906,11911,11921,11926,11931,11936,11941,11946,11950,11962,11972,11980,11984,11988,11992,12006,12027],{"__ignoreMap":141},[145,11839,11840],{"class":147,"line":148},[145,11841,11842],{"class":174},"# Case 1: One-Take Tracking Shot\n",[145,11844,11845],{"class":147,"line":166},[145,11846,357],{"emptyLinePlaceholder":58},[145,11848,11849,11851,11853],{"class":147,"line":178},[145,11850,6332],{"class":262},[145,11852,266],{"class":258},[145,11854,1219],{"class":262},[145,11856,11857,11859,11861,11863,11865],{"class":147,"line":187},[145,11858,6341],{"class":258},[145,11860,466],{"class":159},[145,11862,571],{"class":155},[145,11864,1232],{"class":159},[145,11866,469],{"class":262},[145,11868,11869,11871,11873,11875],{"class":147,"line":360},[145,11870,6354],{"class":593},[145,11872,266],{"class":258},[145,11874,440],{"class":155},[145,11876,469],{"class":262},[145,11878,11879,11881,11883],{"class":147,"line":366},[145,11880,6365],{"class":593},[145,11882,266],{"class":258},[145,11884,1678],{"class":262},[145,11886,11887,11889,11891,11893],{"class":147,"line":378},[145,11888,1078],{"class":159},[145,11890,454],{"class":262},[145,11892,1083],{"class":159},[145,11894,469],{"class":262},[145,11896,11897,11899],{"class":147,"line":395},[145,11898,1095],{"class":159},[145,11900,1098],{"class":262},[145,11902,11903],{"class":147,"line":400},[145,11904,11905],{"class":159},"            \"Replicate @Video1's camera movement exactly — continuous \"\n",[145,11907,11908],{"class":147,"line":415},[145,11909,11910],{"class":159},"            \"one-take tracking shot, maintaining the same speed, \"\n",[145,11912,11913,11916,11919],{"class":147,"line":432},[145,11914,11915],{"class":159},"            \"trajectory, and smooth forward motion throughout.",[145,11917,11918],{"class":155},"\\n\\n",[145,11920,5185],{"class":159},[145,11922,11923],{"class":147,"line":437},[145,11924,11925],{"class":159},"            \"Apply this camera work to a new scene: a parkour runner \"\n",[145,11927,11928],{"class":147,"line":448},[145,11929,11930],{"class":159},"            \"sprinting through narrow city alleyways, leaping over \"\n",[145,11932,11933],{"class":147,"line":472},[145,11934,11935],{"class":159},"            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n",[145,11937,11938],{"class":147,"line":483},[145,11939,11940],{"class":159},"            \"overlooking the city skyline. Golden sunset lighting. \"\n",[145,11942,11943],{"class":147,"line":489},[145,11944,11945],{"class":159},"            \"Dynamic and energetic. No cuts.\"\n",[145,11947,11948],{"class":147,"line":494},[145,11949,1122],{"class":262},[145,11951,11952,11955,11957,11960],{"class":147,"line":499},[145,11953,11954],{"class":159},"        \"video_urls\"",[145,11956,10632],{"class":262},[145,11958,11959],{"class":159},"\"https://your-cdn.com/tracking_reference.mp4\"",[145,11961,10638],{"class":262},[145,11963,11964,11966,11968,11970],{"class":147,"line":519},[145,11965,1128],{"class":159},[145,11967,454],{"class":262},[145,11969,513],{"class":155},[145,11971,469],{"class":262},[145,11973,11974,11976,11978],{"class":147,"line":525},[145,11975,1145],{"class":159},[145,11977,454],{"class":262},[145,11979,8282],{"class":159},[145,11981,11982],{"class":147,"line":536},[145,11983,1192],{"class":262},[145,11985,11986],{"class":147,"line":541},[145,11987,392],{"class":262},[145,11989,11990],{"class":147,"line":552},[145,11991,357],{"emptyLinePlaceholder":58},[145,11993,11994,11997,11999,12002,12004],{"class":147,"line":563},[145,11995,11996],{"class":262},"task_id ",[145,11998,266],{"class":258},[145,12000,12001],{"class":262}," response.json()[",[145,12003,1428],{"class":159},[145,12005,644],{"class":262},[145,12007,12008,12010,12012,12014,12017,12019,12021,12023,12025],{"class":147,"line":590},[145,12009,6387],{"class":155},[145,12011,424],{"class":262},[145,12013,457],{"class":258},[145,12015,12016],{"class":159},"\"Task created: ",[145,12018,577],{"class":155},[145,12020,580],{"class":262},[145,12022,583],{"class":155},[145,12024,466],{"class":159},[145,12026,392],{"class":262},[145,12028,12029,12032,12034],{"class":147,"line":602},[145,12030,12031],{"class":262},"result ",[145,12033,266],{"class":258},[145,12035,12036],{"class":262}," poll_task(task_id)\n",[92,12038,12040],{"id":12039},"qué-esperar","Qué esperar",[11,12042,12043,12044,1580],{},"El video generado mostrará a un corredor de parkour en un entorno urbano — pero el movimiento de cámara (velocidad de seguimiento, impulso hacia adelante, movimiento continuo fluido) proviene de su video de referencia. El modelo no copia el sujeto ni el escenario de la referencia. Copia ",[2434,12045,12046],{},"cómo se mueve la cámara",[56,12048,60,12049],{"controls":58,"playsInline":58,"style":59},[62,12050],{"src":12051,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%9F%8E%E5%B8%82%E8%B7%91%E9%85%B7.mp4",[11,12053,12054],{},[2434,12055,12056],{},"Ejemplo de salida: Plano de seguimiento continuo siguiendo a un corredor de parkour a través de entornos urbanos. La cámara mantiene un movimiento continuo hacia adelante con estabilidad suave similar a un gimbal.",[11,12058,12059,12062],{},[23,12060,12061],{},"Pruébelo usted mismo:"," Reemplace con su propio video de referencia — un plano de seguimiento con dron, un clip de dashcam de auto o un video de gimbal caminando — y cambie el prompt para que coincida con la escena deseada. El movimiento de cámara se transfiere.",[45,12064],{},[48,12066,12068],{"id":12067},"caso-2-zoom-de-hitchcock-dolly-zoom","Caso 2: Zoom de Hitchcock (Dolly Zoom)",[11,12070,12071,12072,12075],{},"El dolly zoom — inventado para ",[2434,12073,12074],{},"Vértigo"," (1958) de Alfred Hitchcock — es una de las técnicas de cámara más desorientadoras y poderosas del cine. La cámara se mueve físicamente hacia (o desde) el sujeto mientras el lente hace zoom en la dirección opuesta. El sujeto mantiene el mismo tamaño en el encuadre, pero el fondo se deforma dramáticamente. Crea una sensación visceral de inquietud, revelación o cambio emocional.",[11,12077,12078],{},"En el cine real, esto requiere un riel de dolly y una sincronización precisa del zoom. Con Seedance 2.0, solo necesita un clip de referencia.",[92,12080,11777],{"id":12081},"lo-que-necesita-1",[11,12083,12084,12086],{},[23,12085,11782],{}," Un clip que demuestre el efecto de dolly zoom. Puede encontrar ejemplos en YouTube buscando \"dolly zoom effect\" o \"vertigo effect tutorial\". El clip debe durar 3–8 segundos mostrando la compresión/expansión del fondo mientras el sujeto permanece estacionario.",[11,12088,12089,12091],{},[23,12090,11788],{}," Nuevo tema con referencia explícita al dolly zoom.",[92,12093,11797],{"id":12094},"el-prompt-1",[136,12096,12099],{"className":12097,"code":12098,"language":1999},[1997],"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,12100,12098],{"__ignoreMap":141},[92,12102,11832],{"id":12103},"código-python-completo-1",[136,12105,12107],{"className":326,"code":12106,"language":328,"meta":141,"style":141},"# 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,12108,12109,12114,12118,12126,12138,12148,12156,12166,12172,12177,12182,12187,12196,12201,12206,12211,12216,12221,12225,12236,12246,12254,12258,12262,12266,12278,12298],{"__ignoreMap":141},[145,12110,12111],{"class":147,"line":148},[145,12112,12113],{"class":174},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n",[145,12115,12116],{"class":147,"line":166},[145,12117,357],{"emptyLinePlaceholder":58},[145,12119,12120,12122,12124],{"class":147,"line":178},[145,12121,6332],{"class":262},[145,12123,266],{"class":258},[145,12125,1219],{"class":262},[145,12127,12128,12130,12132,12134,12136],{"class":147,"line":187},[145,12129,6341],{"class":258},[145,12131,466],{"class":159},[145,12133,571],{"class":155},[145,12135,1232],{"class":159},[145,12137,469],{"class":262},[145,12139,12140,12142,12144,12146],{"class":147,"line":360},[145,12141,6354],{"class":593},[145,12143,266],{"class":258},[145,12145,440],{"class":155},[145,12147,469],{"class":262},[145,12149,12150,12152,12154],{"class":147,"line":366},[145,12151,6365],{"class":593},[145,12153,266],{"class":258},[145,12155,1678],{"class":262},[145,12157,12158,12160,12162,12164],{"class":147,"line":378},[145,12159,1078],{"class":159},[145,12161,454],{"class":262},[145,12163,1083],{"class":159},[145,12165,469],{"class":262},[145,12167,12168,12170],{"class":147,"line":395},[145,12169,1095],{"class":159},[145,12171,1098],{"class":262},[145,12173,12174],{"class":147,"line":400},[145,12175,12176],{"class":159},"            \"Replicate @Video1's camera technique exactly — the dolly \"\n",[145,12178,12179],{"class":147,"line":415},[145,12180,12181],{"class":159},"            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n",[145,12183,12184],{"class":147,"line":432},[145,12185,12186],{"class":159},"            \"while zooming out, keeping the subject the same size while \"\n",[145,12188,12189,12192,12194],{"class":147,"line":437},[145,12190,12191],{"class":159},"            \"the background dramatically stretches.",[145,12193,11918],{"class":155},[145,12195,5185],{"class":159},[145,12197,12198],{"class":147,"line":448},[145,12199,12200],{"class":159},"            \"Apply this effect to: a detective standing in a dim \"\n",[145,12202,12203],{"class":147,"line":472},[145,12204,12205],{"class":159},"            \"corridor. As the dolly zoom activates, the corridor behind \"\n",[145,12207,12208],{"class":147,"line":483},[145,12209,12210],{"class":159},"            \"him stretches impossibly long, creating a sense of dawning \"\n",[145,12212,12213],{"class":147,"line":489},[145,12214,12215],{"class":159},"            \"horror. Dramatic side lighting with deep shadows. \"\n",[145,12217,12218],{"class":147,"line":494},[145,12219,12220],{"class":159},"            \"Film noir atmosphere.\"\n",[145,12222,12223],{"class":147,"line":499},[145,12224,1122],{"class":262},[145,12226,12227,12229,12231,12234],{"class":147,"line":519},[145,12228,11954],{"class":159},[145,12230,10632],{"class":262},[145,12232,12233],{"class":159},"\"https://your-cdn.com/dolly_zoom_reference.mp4\"",[145,12235,10638],{"class":262},[145,12237,12238,12240,12242,12244],{"class":147,"line":525},[145,12239,1128],{"class":159},[145,12241,454],{"class":262},[145,12243,3513],{"class":155},[145,12245,469],{"class":262},[145,12247,12248,12250,12252],{"class":147,"line":536},[145,12249,1145],{"class":159},[145,12251,454],{"class":262},[145,12253,8282],{"class":159},[145,12255,12256],{"class":147,"line":541},[145,12257,1192],{"class":262},[145,12259,12260],{"class":147,"line":552},[145,12261,392],{"class":262},[145,12263,12264],{"class":147,"line":563},[145,12265,357],{"emptyLinePlaceholder":58},[145,12267,12268,12270,12272,12274,12276],{"class":147,"line":590},[145,12269,11996],{"class":262},[145,12271,266],{"class":258},[145,12273,12001],{"class":262},[145,12275,1428],{"class":159},[145,12277,644],{"class":262},[145,12279,12280,12282,12284,12286,12288,12290,12292,12294,12296],{"class":147,"line":602},[145,12281,6387],{"class":155},[145,12283,424],{"class":262},[145,12285,457],{"class":258},[145,12287,12016],{"class":159},[145,12289,577],{"class":155},[145,12291,580],{"class":262},[145,12293,583],{"class":155},[145,12295,466],{"class":159},[145,12297,392],{"class":262},[145,12299,12300,12302,12304],{"class":147,"line":608},[145,12301,12031],{"class":262},[145,12303,266],{"class":258},[145,12305,12036],{"class":262},[92,12307,12309],{"id":12308},"por-qué-funciona","Por qué funciona",[11,12311,12312,12313,12316],{},"El dolly zoom es notoriamente difícil de describir en texto. Escribir \"zoom in while moving backward\" a menudo produce resultados confusos en otras herramientas de video con IA. Al proporcionar un video de referencia que ",[2434,12314,12315],{},"demuestra"," la técnica, Seedance 2.0 puede analizar los cambios de relación espacial — cómo el fondo se comprime/expande en relación con el primer plano — y reproducirlos con precisión.",[11,12318,12319,12321],{},[23,12320,10991],{}," Cuanto más limpio y aislado sea el dolly zoom en su video de referencia, mejor. Evite clips de referencia con mucho movimiento del sujeto o cambios de escena — el modelo podría confundir el movimiento de cámara con el movimiento del sujeto.",[45,12323],{},[48,12325,12327],{"id":12326},"caso-3-cámara-orbital-rotación-de-360","Caso 3: Cámara orbital (rotación de 360°)",[11,12329,12330],{},"El plano orbital rota la cámara alrededor de un sujeto, creando una revelación dramática o estableciendo la presencia de un personaje. Es un elemento básico de videoclips musicales, presentaciones de héroes y presentaciones de productos.",[92,12332,11777],{"id":12333},"lo-que-necesita-2",[11,12335,12336,12338],{},[23,12337,11782],{}," Un clip que muestre una cámara orbitando alrededor de un sujeto. Una rotación suave de 180° o 360° funciona mejor. Las tomas de producto en plataforma giratoria o las revelaciones de personajes son referencias ideales.",[11,12340,12341,12343],{},[23,12342,11788],{}," Nuevo sujeto + referencia orbital explícita.",[92,12345,11797],{"id":12346},"el-prompt-2",[136,12348,12351],{"className":12349,"code":12350,"language":1999},[1997],"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,12352,12350],{"__ignoreMap":141},[92,12354,11832],{"id":12355},"código-python-completo-2",[136,12357,12359],{"className":326,"code":12358,"language":328,"meta":141,"style":141},"# 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,12360,12361,12366,12370,12378,12390,12400,12408,12418,12424,12429,12434,12443,12448,12453,12458,12463,12468,12472,12483,12493,12501,12505,12509,12513,12525,12545],{"__ignoreMap":141},[145,12362,12363],{"class":147,"line":148},[145,12364,12365],{"class":174},"# Case 3: Orbital Camera (360 Rotation)\n",[145,12367,12368],{"class":147,"line":166},[145,12369,357],{"emptyLinePlaceholder":58},[145,12371,12372,12374,12376],{"class":147,"line":178},[145,12373,6332],{"class":262},[145,12375,266],{"class":258},[145,12377,1219],{"class":262},[145,12379,12380,12382,12384,12386,12388],{"class":147,"line":187},[145,12381,6341],{"class":258},[145,12383,466],{"class":159},[145,12385,571],{"class":155},[145,12387,1232],{"class":159},[145,12389,469],{"class":262},[145,12391,12392,12394,12396,12398],{"class":147,"line":360},[145,12393,6354],{"class":593},[145,12395,266],{"class":258},[145,12397,440],{"class":155},[145,12399,469],{"class":262},[145,12401,12402,12404,12406],{"class":147,"line":366},[145,12403,6365],{"class":593},[145,12405,266],{"class":258},[145,12407,1678],{"class":262},[145,12409,12410,12412,12414,12416],{"class":147,"line":378},[145,12411,1078],{"class":159},[145,12413,454],{"class":262},[145,12415,1083],{"class":159},[145,12417,469],{"class":262},[145,12419,12420,12422],{"class":147,"line":395},[145,12421,1095],{"class":159},[145,12423,1098],{"class":262},[145,12425,12426],{"class":147,"line":400},[145,12427,12428],{"class":159},"            \"Replicate @Video1's orbital camera movement — the smooth \"\n",[145,12430,12431],{"class":147,"line":415},[145,12432,12433],{"class":159},"            \"360 degree rotation around the subject, maintaining consistent \"\n",[145,12435,12436,12439,12441],{"class":147,"line":432},[145,12437,12438],{"class":159},"            \"distance and speed throughout the arc.",[145,12440,11918],{"class":155},[145,12442,5185],{"class":159},[145,12444,12445],{"class":147,"line":437},[145,12446,12447],{"class":159},"            \"Apply this camera movement to: a lone astronaut standing \"\n",[145,12449,12450],{"class":147,"line":448},[145,12451,12452],{"class":159},"            \"on the surface of Mars. Red desert landscape stretches to \"\n",[145,12454,12455],{"class":147,"line":472},[145,12456,12457],{"class":159},"            \"the horizon. The orbital camera reveals the astronaut from \"\n",[145,12459,12460],{"class":147,"line":483},[145,12461,12462],{"class":159},"            \"all angles as dust particles float in the thin atmosphere. \"\n",[145,12464,12465],{"class":147,"line":489},[145,12466,12467],{"class":159},"            \"Epic cinematic scale. Golden hour Martian lighting.\"\n",[145,12469,12470],{"class":147,"line":494},[145,12471,1122],{"class":262},[145,12473,12474,12476,12478,12481],{"class":147,"line":499},[145,12475,11954],{"class":159},[145,12477,10632],{"class":262},[145,12479,12480],{"class":159},"\"https://your-cdn.com/orbital_reference.mp4\"",[145,12482,10638],{"class":262},[145,12484,12485,12487,12489,12491],{"class":147,"line":519},[145,12486,1128],{"class":159},[145,12488,454],{"class":262},[145,12490,513],{"class":155},[145,12492,469],{"class":262},[145,12494,12495,12497,12499],{"class":147,"line":525},[145,12496,1145],{"class":159},[145,12498,454],{"class":262},[145,12500,8282],{"class":159},[145,12502,12503],{"class":147,"line":536},[145,12504,1192],{"class":262},[145,12506,12507],{"class":147,"line":541},[145,12508,392],{"class":262},[145,12510,12511],{"class":147,"line":552},[145,12512,357],{"emptyLinePlaceholder":58},[145,12514,12515,12517,12519,12521,12523],{"class":147,"line":563},[145,12516,11996],{"class":262},[145,12518,266],{"class":258},[145,12520,12001],{"class":262},[145,12522,1428],{"class":159},[145,12524,644],{"class":262},[145,12526,12527,12529,12531,12533,12535,12537,12539,12541,12543],{"class":147,"line":590},[145,12528,6387],{"class":155},[145,12530,424],{"class":262},[145,12532,457],{"class":258},[145,12534,12016],{"class":159},[145,12536,577],{"class":155},[145,12538,580],{"class":262},[145,12540,583],{"class":155},[145,12542,466],{"class":159},[145,12544,392],{"class":262},[145,12546,12547,12549,12551],{"class":147,"line":602},[145,12548,12031],{"class":262},[145,12550,266],{"class":258},[145,12552,12036],{"class":262},[92,12554,12556],{"id":12555},"cómo-elegir-la-referencia-orbital-adecuada","Cómo elegir la referencia orbital adecuada",[11,12558,12559],{},"No todos los planos orbitales son iguales. El video de referencia determina:",[1849,12561,12562,12572],{},[1852,12563,12564],{},[1855,12565,12566,12569],{},[1858,12567,12568],{},"Calidad de la referencia",[1858,12570,12571],{},"Calidad del resultado",[1865,12573,12574,12582,12590,12598],{},[1855,12575,12576,12579],{},[1870,12577,12578],{},"Rotación suave y estable a velocidad constante",[1870,12580,12581],{},"Orbital limpio y profesional",[1855,12583,12584,12587],{},[1870,12585,12586],{},"Rotación manual con movimiento",[1870,12588,12589],{},"Órbita orgánica, estilo documental",[1855,12591,12592,12595],{},[1870,12593,12594],{},"Giro rápido envolvente",[1870,12596,12597],{},"Revelación dinámica y enérgica",[1855,12599,12600,12603],{},[1870,12601,12602],{},"Órbita parcial lenta de 90°",[1870,12604,12605],{},"Cambio de ángulo sutil y dramático",[11,12607,12608],{},"Elija una referencia que coincida con la energía que desea. Un video de producto en plataforma giratoria le da una rotación mecánicamente suave. Un recorrido a mano alzada le da movimiento orgánico.",[45,12610],{},[48,12612,12614],{"id":12613},"avanzado-combinar-movimiento-de-cámara-con-otras-referencias","Avanzado: Combinar movimiento de cámara con otras referencias",[11,12616,12617],{},"El verdadero poder del sistema de referencias de Seedance 2.0 emerge cuando combina movimiento de cámara con otros tipos de entrada. No está limitado a una sola referencia — puede usar hasta 3 referencias de video y 9 referencias de imagen (12 archivos en total).",[92,12619,12621],{"id":12620},"cámara-personaje-estilo","Cámara + Personaje + Estilo",[11,12623,12624],{},"Aquí una combinación de tres entradas:",[97,12626,12627,12632,12637],{},[73,12628,12629,12631],{},[28,12630,11211],{}," — movimiento de cámara (plano orbital)",[73,12633,12634,12636],{},[28,12635,2722],{}," — apariencia del personaje (un diseño de personaje específico)",[73,12638,12639,12641],{},[28,12640,2732],{}," — referencia de estilo (un estilo artístico o paleta de colores particular)",[136,12643,12645],{"className":326,"code":12644,"language":328,"meta":141,"style":141},"# 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,12646,12647,12652,12656,12664,12676,12686,12694,12704,12710,12715,12724,12729,12738,12743,12752,12757,12762,12767,12772,12776,12782,12789,12794,12798,12804,12809,12813,12823,12831,12835,12839,12843,12855,12875],{"__ignoreMap":141},[145,12648,12649],{"class":147,"line":148},[145,12650,12651],{"class":174},"# Advanced: Camera + Character + Style combination\n",[145,12653,12654],{"class":147,"line":166},[145,12655,357],{"emptyLinePlaceholder":58},[145,12657,12658,12660,12662],{"class":147,"line":178},[145,12659,6332],{"class":262},[145,12661,266],{"class":258},[145,12663,1219],{"class":262},[145,12665,12666,12668,12670,12672,12674],{"class":147,"line":187},[145,12667,6341],{"class":258},[145,12669,466],{"class":159},[145,12671,571],{"class":155},[145,12673,1232],{"class":159},[145,12675,469],{"class":262},[145,12677,12678,12680,12682,12684],{"class":147,"line":360},[145,12679,6354],{"class":593},[145,12681,266],{"class":258},[145,12683,440],{"class":155},[145,12685,469],{"class":262},[145,12687,12688,12690,12692],{"class":147,"line":366},[145,12689,6365],{"class":593},[145,12691,266],{"class":258},[145,12693,1678],{"class":262},[145,12695,12696,12698,12700,12702],{"class":147,"line":378},[145,12697,1078],{"class":159},[145,12699,454],{"class":262},[145,12701,1083],{"class":159},[145,12703,469],{"class":262},[145,12705,12706,12708],{"class":147,"line":395},[145,12707,1095],{"class":159},[145,12709,1098],{"class":262},[145,12711,12712],{"class":147,"line":400},[145,12713,12714],{"class":159},"            \"Replicate @Video1's orbital camera movement — smooth \"\n",[145,12716,12717,12720,12722],{"class":147,"line":415},[145,12718,12719],{"class":159},"            \"rotation around the subject.",[145,12721,11918],{"class":155},[145,12723,5185],{"class":159},[145,12725,12726],{"class":147,"line":432},[145,12727,12728],{"class":159},"            \"@Image1 is the character — maintain this character's \"\n",[145,12730,12731,12734,12736],{"class":147,"line":437},[145,12732,12733],{"class":159},"            \"appearance exactly.",[145,12735,11918],{"class":155},[145,12737,5185],{"class":159},[145,12739,12740],{"class":147,"line":448},[145,12741,12742],{"class":159},"            \"@Image2 is the visual style reference — match its color \"\n",[145,12744,12745,12748,12750],{"class":147,"line":472},[145,12746,12747],{"class":159},"            \"palette, lighting mood, and artistic treatment.",[145,12749,11918],{"class":155},[145,12751,5185],{"class":159},[145,12753,12754],{"class":147,"line":483},[145,12755,12756],{"class":159},"            \"Scene: The character from @Image1 stands in the center \"\n",[145,12758,12759],{"class":147,"line":489},[145,12760,12761],{"class":159},"            \"of a grand cathedral. The orbital camera from @Video1 \"\n",[145,12763,12764],{"class":147,"line":494},[145,12765,12766],{"class":159},"            \"slowly reveals the architecture. Visual style matches \"\n",[145,12768,12769],{"class":147,"line":499},[145,12770,12771],{"class":159},"            \"@Image2 throughout.\"\n",[145,12773,12774],{"class":147,"line":519},[145,12775,1122],{"class":262},[145,12777,12778,12780],{"class":147,"line":525},[145,12779,2503],{"class":159},[145,12781,2506],{"class":262},[145,12783,12784,12787],{"class":147,"line":536},[145,12785,12786],{"class":159},"            \"https://your-cdn.com/character_design.png\"",[145,12788,469],{"class":262},[145,12790,12791],{"class":147,"line":541},[145,12792,12793],{"class":159},"            \"https://your-cdn.com/art_style_reference.jpg\"\n",[145,12795,12796],{"class":147,"line":552},[145,12797,2516],{"class":262},[145,12799,12800,12802],{"class":147,"line":563},[145,12801,11954],{"class":159},[145,12803,2506],{"class":262},[145,12805,12806],{"class":147,"line":590},[145,12807,12808],{"class":159},"            \"https://your-cdn.com/orbital_reference.mp4\"\n",[145,12810,12811],{"class":147,"line":602},[145,12812,2516],{"class":262},[145,12814,12815,12817,12819,12821],{"class":147,"line":608},[145,12816,1128],{"class":159},[145,12818,454],{"class":262},[145,12820,513],{"class":155},[145,12822,469],{"class":262},[145,12824,12825,12827,12829],{"class":147,"line":614},[145,12826,1145],{"class":159},[145,12828,454],{"class":262},[145,12830,8282],{"class":159},[145,12832,12833],{"class":147,"line":625},[145,12834,1192],{"class":262},[145,12836,12837],{"class":147,"line":630},[145,12838,392],{"class":262},[145,12840,12841],{"class":147,"line":647},[145,12842,357],{"emptyLinePlaceholder":58},[145,12844,12845,12847,12849,12851,12853],{"class":147,"line":668},[145,12846,11996],{"class":262},[145,12848,266],{"class":258},[145,12850,12001],{"class":262},[145,12852,1428],{"class":159},[145,12854,644],{"class":262},[145,12856,12857,12859,12861,12863,12865,12867,12869,12871,12873],{"class":147,"line":688},[145,12858,6387],{"class":155},[145,12860,424],{"class":262},[145,12862,457],{"class":258},[145,12864,12016],{"class":159},[145,12866,577],{"class":155},[145,12868,580],{"class":262},[145,12870,583],{"class":155},[145,12872,466],{"class":159},[145,12874,392],{"class":262},[145,12876,12877,12879,12881],{"class":147,"line":693},[145,12878,12031],{"class":262},[145,12880,266],{"class":258},[145,12882,12036],{"class":262},[92,12884,12886],{"id":12885},"estrategia-de-asignación-de-referencias","Estrategia de asignación de referencias",[11,12888,12889],{},"Al mezclar múltiples tipos de referencia, sea estratégico con su presupuesto de 12 archivos:",[1849,12891,12892,12907],{},[1852,12893,12894],{},[1855,12895,12896,12898,12901,12904],{},[1858,12897,8035],{},[1858,12899,12900],{},"Refs de video",[1858,12902,12903],{},"Refs de imagen",[1858,12905,12906],{},"Refs de audio",[1865,12908,12909,12921,12933,12945,12957],{},[1855,12910,12911,12914,12917,12919],{},[1870,12912,12913],{},"Solo replicación de cámara",[1870,12915,12916],{},"1 (cámara)",[1870,12918,663],{},[1870,12920,663],{},[1855,12922,12923,12926,12928,12931],{},[1870,12924,12925],{},"Cámara + personaje",[1870,12927,12916],{},[1870,12929,12930],{},"1 (personaje)",[1870,12932,663],{},[1855,12934,12935,12938,12940,12943],{},[1870,12936,12937],{},"Cámara + personaje + estilo",[1870,12939,12916],{},[1870,12941,12942],{},"2 (personaje + estilo)",[1870,12944,663],{},[1855,12946,12947,12950,12953,12955],{},[1870,12948,12949],{},"Cámara + coreografía + personaje",[1870,12951,12952],{},"2 (cámara + baile)",[1870,12954,12930],{},[1870,12956,663],{},[1855,12958,12959,12962,12964,12967],{},[1870,12960,12961],{},"Producción completa",[1870,12963,12916],{},[1870,12965,12966],{},"3 (personaje + escena + estilo)",[1870,12968,12969],{},"1 (música)",[11,12971,12972,12975],{},[23,12973,12974],{},"Regla general:"," Comience con 2–3 referencias. Agregar más no siempre mejora los resultados — puede introducir señales contradictorias. Utilice el número mínimo de referencias necesarias para comunicar su intención.",[11,12977,12978,12979,1580],{},"Para más información sobre estrategias de múltiples referencias, consulte nuestro artículo ",[37,12980,11339],{"href":2781},[45,12982],{},[48,12984,12986],{"id":12985},"errores-comunes-y-cómo-corregirlos","Errores comunes y cómo corregirlos",[92,12988,12990],{"id":12989},"error-1-no-especificar-qué-referenciar","Error 1: No especificar qué referenciar",[11,12992,12993],{},[23,12994,12995],{},"Incorrecto:",[136,12997,13000],{"className":12998,"code":12999,"language":1999},[1997],"Use @Video1. A knight rides a horse through a valley.\n",[28,13001,12999],{"__ignoreMap":141},[11,13003,13004,13005,1580],{},"El modelo no sabe si usted quiere el movimiento de cámara, el movimiento del sujeto, el estilo visual o todo de ",[28,13006,11211],{},[11,13008,13009],{},[23,13010,13011],{},"Correcto:",[136,13013,13016],{"className":13014,"code":13015,"language":1999},[1997],"Replicate @Video1's camera movement and tracking trajectory.\nA knight rides a horse through a green valley at sunrise.\n",[28,13017,13015],{"__ignoreMap":141},[92,13019,13021],{"id":13020},"error-2-video-de-referencia-demasiado-largo-o-complejo","Error 2: Video de referencia demasiado largo o complejo",[11,13023,13024],{},"Los videos de referencia deben durar 2–15 segundos y mostrar un movimiento de cámara limpio e identificable. Un clip de 15 segundos con tres técnicas de cámara diferentes (panorámica, luego zoom, luego órbita) genera señales confusas.",[11,13026,13027,13030],{},[23,13028,13029],{},"Solución:"," Recorte su referencia para aislar el movimiento de cámara específico que desea. Utilice el ejemplo más simple y limpio de la técnica.",[92,13032,13034],{"id":13033},"error-3-confundir-movimiento-de-cámara-con-movimiento-del-sujeto","Error 3: Confundir movimiento de cámara con movimiento del sujeto",[11,13036,13037,13038,13041,13042,13045],{},"Un video de referencia de alguien bailando contiene dos cosas: cómo se mueve la ",[2434,13039,13040],{},"cámara"," y cómo se mueve el ",[2434,13043,13044],{},"sujeto",". Si solo quiere el trabajo de cámara, dígalo explícitamente:",[136,13047,13050],{"className":13048,"code":13049,"language":1999},[1997],"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,13051,13049],{"__ignoreMap":141},[92,13053,13055],{"id":13054},"error-4-prompt-y-referencia-contradictorios","Error 4: Prompt y referencia contradictorios",[11,13057,13058],{},"Si su referencia muestra un dolly push-in lento y suave pero su prompt dice \"fast-paced action with rapid cuts\", el modelo recibe señales contradictorias.",[11,13060,13061,13063,13064,13067,13068,1580],{},[23,13062,13029],{}," Alinee su prompt de texto con la energía de su video de referencia. El prompt describe el ",[2434,13065,13066],{},"contenido","; la referencia demuestra la ",[2434,13069,13070],{},"técnica",[92,13072,13074],{"id":13073},"error-5-esperar-resultados-perfectos-a-la-primera","Error 5: Esperar resultados perfectos a la primera",[11,13076,13077],{},"La replicación de cámara es sofisticada. Su primer intento puede no coincidir perfectamente con la referencia. Itere:",[70,13079,13080,13083,13086,13089],{},[73,13081,13082],{},"Comience con un prompt simple + referencia limpia",[73,13084,13085],{},"Revise la salida — ¿el movimiento de cámara se acerca?",[73,13087,13088],{},"Ajuste el lenguaje del prompt para ser más específico sobre lo que falla",[73,13090,13091],{},"Pruebe con un video de referencia diferente si la técnica no se transfiere",[45,13093],{},[48,13095,13096],{"id":8835},"Preguntas frecuentes",[92,13098,13100],{"id":13099},"puedo-combinar-movimiento-de-cámara-de-un-video-con-coreografía-de-otro","¿Puedo combinar movimiento de cámara de un video con coreografía de otro?",[11,13102,13103,13104,454,13106,13108,13109,13112],{},"Sí. Utilice dos referencias ",[28,13105,2773],{},[28,13107,11211],{}," para el movimiento de cámara y ",[28,13110,13111],{},"@Video2"," para la coreografía/acción. Especifique en el prompt: \"Replicate @Video1's camera movement and @Video2's dance choreography.\" Seedance 2.0 admite hasta 3 referencias de video simultáneamente.",[92,13114,13116],{"id":13115},"qué-formato-y-duración-de-video-funciona-mejor-para-referencias-de-cámara","¿Qué formato y duración de video funciona mejor para referencias de cámara?",[11,13118,13119],{},"Formato MP4, resolución 480p–720p, duración de 2–15 segundos, tamaño de archivo inferior a 50 MB. Para referencias de movimiento de cámara, más corto suele ser mejor — un clip limpio de 3–5 segundos de una sola técnica de cámara se transfiere de forma más fiable que un clip largo con múltiples técnicas.",[92,13121,13123],{"id":13122},"en-qué-se-diferencia-esto-del-control-de-cámara-de-sora-o-kling","¿En qué se diferencia esto del control de cámara de Sora o Kling?",[11,13125,13126,13127,13129],{},"Sora 2 y Kling 3.0 utilizan dirección de cámara basada en texto — usted describe el movimiento con palabras (\"dolly in\", \"pan left\"). Los resultados dependen de qué tan bien el modelo interprete su texto. Seedance 2.0 utiliza control de cámara basado en referencias — usted le muestra al modelo lo que quiere mediante etiquetas ",[28,13128,2773],{},". Esto produce una replicación de cámara más precisa y consistente, especialmente para movimientos complejos como zooms de Hitchcock o planos de seguimiento continuo que son difíciles de describir en texto.",[92,13131,13133],{"id":13132},"puedo-usar-una-grabación-de-pantalla-o-video-de-teléfono-como-referencia-de-cámara","¿Puedo usar una grabación de pantalla o video de teléfono como referencia de cámara?",[11,13135,13136],{},"Sí. Cualquier video que demuestre el movimiento de cámara que desea funciona como referencia. Un video de teléfono que filmó mientras caminaba produce un plano de seguimiento con cámara en mano. Una grabación de pantalla de un clip de película transfiere el lenguaje de cámara de esa película. El modelo extrae el comportamiento de la cámara independientemente de la calidad de producción.",[92,13138,13140],{"id":13139},"la-replicación-de-cámara-funciona-con-la-generación-de-imagen-a-video","¿La replicación de cámara funciona con la generación de imagen a video?",[11,13142,13143,13144,13146,13147,13149],{},"Sí. Puede combinar ",[28,13145,11211],{}," (referencia de movimiento de cámara) con ",[28,13148,2722],{}," (primer fotograma / personaje) para generar un video que comience desde su imagen y mueva la cámara según su referencia de video. Esto es poderoso para videos de productos y presentaciones de personajes.",[45,13151],{},[48,13153,13155],{"id":13154},"comience-a-replicar-cualquier-movimiento-de-cámara","Comience a replicar cualquier movimiento de cámara",[11,13157,13158,13159,13161],{},"El movimiento de cámara ya no está limitado por el equipo o la experiencia. Con un video de referencia y el sistema de etiquetas ",[28,13160,2773],{}," de Seedance 2.0, puede replicar cualquier técnica de cámara — desde sutiles cambios de enfoque hasta zooms de Hitchcock completos — y aplicarla a cualquier contenido que pueda describir.",[11,13163,13164],{},"Los tres casos de este tutorial cubren las técnicas de cámara más solicitadas:",[97,13166,13167,13173,13179],{},[73,13168,13169,13172],{},[23,13170,13171],{},"Seguimiento continuo"," para movimiento inmersivo y sin cortes",[73,13174,13175,13178],{},[23,13176,13177],{},"Dolly zoom"," para tensión dramática e impacto psicológico",[73,13180,13181,13184],{},[23,13182,13183],{},"Plano orbital"," para revelaciones de personajes y presentaciones de productos",[11,13186,13187],{},"Cada uno funciona de la misma manera: suba una referencia, etiquétela, describa su escena, deje que el modelo se encargue de la cámara.",[11,13189,13190,13191,13195],{},"¿Listo para probarlo? ",[37,13192,13194],{"href":211,"rel":13193},[41],"Regístrese para obtener una clave API gratuita de EvoLink"," y comience a generar videos cinematográficos con IA con control preciso de cámara.",[45,13197],{},[11,13199,13200],{},[2434,13201,13202],{},"Lectura relacionada:",[97,13204,13205,13215],{},[73,13206,13207,13210,13211,13214],{},[37,13208,13209],{"href":1578},"Prompts de Seedance 2.0: Guía completa para generación de video multimodal"," — domine el ",[37,13212,13213],{"href":1578},"formato de prompts tipo guion"," para escenas complejas",[73,13216,13217,13220,13221],{},[37,13218,13219],{"href":2781},"Referencias Multimodales en Seedance 2.0: La Guía Definitiva de @Tags"," — inmersión profunda en el ",[37,13222,13223],{"href":2781},"sistema completo de referencias @tag",[45,13225],{},[11,13227,13228],{},[2434,13229,13230],{},"Última actualización: 20 de febrero de 2026 | Escrito por J, Growth Lead en EvoLink",[11008,13232,13233],{},"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":141,"searchDepth":166,"depth":166,"links":13235},[13236,13237,13241,13246,13252,13258,13264,13268,13275,13282],{"id":11144,"depth":166,"text":11145},{"id":11192,"depth":166,"text":11193,"children":13238},[13239,13240],{"id":11205,"depth":178,"text":11206},{"id":11247,"depth":178,"text":11248},{"id":11344,"depth":166,"text":11345,"children":13242},[13243,13244,13245],{"id":11348,"depth":178,"text":11349},{"id":11372,"depth":178,"text":11373},{"id":11389,"depth":178,"text":11390},{"id":11759,"depth":166,"text":11760,"children":13247},[13248,13249,13250,13251],{"id":11776,"depth":178,"text":11777},{"id":11796,"depth":178,"text":11797},{"id":11831,"depth":178,"text":11832},{"id":12039,"depth":178,"text":12040},{"id":12067,"depth":166,"text":12068,"children":13253},[13254,13255,13256,13257],{"id":12081,"depth":178,"text":11777},{"id":12094,"depth":178,"text":11797},{"id":12103,"depth":178,"text":11832},{"id":12308,"depth":178,"text":12309},{"id":12326,"depth":166,"text":12327,"children":13259},[13260,13261,13262,13263],{"id":12333,"depth":178,"text":11777},{"id":12346,"depth":178,"text":11797},{"id":12355,"depth":178,"text":11832},{"id":12555,"depth":178,"text":12556},{"id":12613,"depth":166,"text":12614,"children":13265},[13266,13267],{"id":12620,"depth":178,"text":12621},{"id":12885,"depth":178,"text":12886},{"id":12985,"depth":166,"text":12986,"children":13269},[13270,13271,13272,13273,13274],{"id":12989,"depth":178,"text":12990},{"id":13020,"depth":178,"text":13021},{"id":13033,"depth":178,"text":13034},{"id":13054,"depth":178,"text":13055},{"id":13073,"depth":178,"text":13074},{"id":8835,"depth":166,"text":13096,"children":13276},[13277,13278,13279,13280,13281],{"id":13099,"depth":178,"text":13100},{"id":13115,"depth":178,"text":13116},{"id":13122,"depth":178,"text":13123},{"id":13132,"depth":178,"text":13133},{"id":13139,"depth":178,"text":13140},{"id":13154,"depth":166,"text":13155},"Aprenda a replicar zooms de Hitchcock, planos de seguimiento continuo y cámaras orbitales usando la API de Seedance 2.0. 3 ejemplos completos en Python con etiquetas @Video.",{"date":13285,"image":11099,"seoTitle":13286},"2026-02-20","Replique movimientos de cámara con la API de Seedance 2.0 | Tutorial","/es/blog/seedance-2-camera-movement-api",{"title":11081,"description":13283},"es/blog/seedance-2-camera-movement-api","D3QWgA_cnz8roYiRGMMSUS8Se0o6jOKHLUGY-vQrs4I",{"id":13292,"title":13293,"body":13294,"description":17176,"extension":11069,"meta":17177,"navigation":58,"path":17182,"seo":17183,"stem":17184,"__hash__":17185},"content/es/blog/seedance-2-copyright-api-guide.md","Controversia de derechos de autor de Seedance 2.0: lo que los desarrolladores de API necesitan saber",{"type":8,"value":13295,"toc":17131},[13296,13299,13302,13306,13309,13312,13316,13327,13330,13342,13357,13360,13364,13380,13389,13409,13418,13436,13445,13464,13472,13476,13479,13511,13519,13523,13526,13530,13533,13541,13544,13548,13551,13557,13563,13569,13575,13588,13592,13595,13718,13721,13724,13728,13731,13734,13737,13740,13744,13747,13751,13766,13792,13796,13799,13805,13811,13817,13823,13826,13830,13833,13839,13845,13851,13857,13874,13880,13886,13894,13898,13904,13907,13911,13914,13919,13922,13925,13928,13933,13936,13953,13956,13960,14060,14064,14067,14156,14164,14182,14186,14192,14195,14199,14202,14304,14307,14311,14314,14384,14388,14391,14411,14414,14434,14437,14441,14444,14868,14871,15097,15100,15104,15112,15232,15237,15246,15250,15253,15910,15915,15919,15936,15939,15943,15946,15954,16069,16074,16078,16084,16253,16257,16273,16277,16280,16463,16469,16484,16488,16491,16906,16910,16913,16916,16922,16924,16928,16941,16944,16952,16956,16959,16963,16969,16973,16976,17055,17062,17064,17068,17071,17074,17106,17109,17123,17128],[11,13297,13298],{},"El lanzamiento de la API de Seedance 2.0 — originalmente programado para el 24 de febrero de 2026 — esta en pausa. Cinco grandes estudios de Hollywood han enviado cartas de cese y desistimiento a ByteDance, la Asociacion Cinematografica de America (MPA) ha calificado a Seedance 2.0 como \"una maquina construida para la infraccion sistematica\", y quienes desarrollan sobre este modelo ahora enfrentan preguntas reales sobre plazos, riesgo legal y viabilidad comercial.",[11,13300,13301],{},"Si estas integrando Seedance 2.0 en tu pipeline de generacion de video, esta guia cubre todo lo que necesitas saber: la cronologia completa de los derechos de autor, por que Hollywood esta apuntando a este modelo especificamente, que significa el retraso de la API en la practica, como proteger tus proyectos comerciales, estrategias seguras de prompt engineering con ejemplos de codigo, y como mantener tu pipeline en funcionamiento a traves de una API unificada multimodelo mientras la situacion se resuelve.",[48,13303,13305],{"id":13304},"que-paso-cronologia-de-los-derechos-de-autor-de-seedance-20","Que paso: cronologia de los derechos de autor de Seedance 2.0",[11,13307,13308],{},"La crisis de derechos de autor de Seedance 2.0 no surgio de la noche a la manana, pero escalo de forma notable una vez que comenzo. En una sola semana de febrero de 2026, ByteDance paso de recibir quejas informales a enfrentar acciones legales coordinadas de todos los grandes estudios de Hollywood.",[11,13310,13311],{},"Esta es la cronologia verificada basada en reportes de los principales medios de comunicacion:",[92,13313,13315],{"id":13314},"semana-1-la-reaccion-se-intensifica-14-16-de-febrero","Semana 1: la reaccion se intensifica (14-16 de febrero)",[11,13317,13318,7696,13321,13326],{},[23,13319,13320],{},"15 de febrero de 2026",[37,13322,13325],{"href":13323,"rel":13324},"https://techcrunch.com",[41],"TechCrunch reporta"," que los estudios de Hollywood estan \"descontentos\" con las capacidades de Seedance 2.0. El articulo detalla como el modelo puede generar contenido de video que se asemeja notablemente a peliculas y programas de television protegidos por derechos de autor. En este punto, las quejas aun son informales — no se ha tomado ninguna accion legal, pero el tono es severo.",[11,13328,13329],{},"El detonante fue una oleada de publicaciones en redes sociales mostrando a Seedance 2.0 generando escenas con personajes reconocibles de Disney, superheroes de Marvel y secuencias que claramente imitaban peliculas especificas. Estas demostraciones se viralizaron, y Hollywood lo noto.",[11,13331,13332,13335,13336,13341],{},[23,13333,13334],{},"16 de febrero de 2026"," — La historia se convierte en noticia general en multiples medios. ",[37,13337,13340],{"href":13338,"rel":13339},"https://www.cnbc.com",[41],"CNBC reporta"," que ByteDance ha reconocido las preocupaciones y se ha comprometido a agregar medidas de proteccion a Seedance 2.0. La cita mas significativa proviene del CEO de la MPA, Charles Rivkin, quien describe la situacion como \"uso no autorizado a escala masiva\".",[11,13343,13344,13345,13350,13351,13356],{},"El mismo dia, ",[37,13346,13349],{"href":13347,"rel":13348},"https://www.aljazeera.com",[41],"Al Jazeera cubre"," el compromiso publico de ByteDance de implementar correcciones. ",[37,13352,13355],{"href":13353,"rel":13354},"https://www.nbcnews.com",[41],"NBC News"," tambien reporta la respuesta de ByteDance. El comunicado de la empresa esta cuidadosamente redactado — reconoce las preocupaciones sin admitir culpa, y promete \"protecciones de contenido mejoradas\" sin especificar cuales serian ni cuando llegarian.",[11,13358,13359],{},"En esta etapa, muchos desarrolladores asumieron que se trataba de una controversia tipica de la industria tecnologica que se disiparia con algo de gestion de relaciones publicas y ajustes menores al producto. No fue asi.",[92,13361,13363],{"id":13362},"semana-2-accion-legal-coordinada-20-22-de-febrero","Semana 2: accion legal coordinada (20-22 de febrero)",[11,13365,13366,13369,13370,13375,13376,13379],{},[23,13367,13368],{},"20 de febrero de 2026"," — La situacion escala de problema de relaciones publicas a crisis legal. ",[37,13371,13374],{"href":13372,"rel":13373},"https://www.axios.com",[41],"Axios reporta"," que cinco estudios — Disney, Warner Bros. Discovery, Paramount, Netflix y Sony — han enviado cartas de cese y desistimiento ",[23,13377,13378],{},"individuales"," a ByteDance. Este es un detalle critico: no son cartas conjuntas a traves de la MPA (aunque eso viene despues). El equipo legal de cada estudio decidio independientemente que Seedance 2.0 representaba una amenaza suficiente como para justificar una accion legal directa.",[11,13381,13382,13383,13388],{},"El lenguaje en estas cartas, segun reporto ",[37,13384,13387],{"href":13385,"rel":13386},"https://copyrightlately.com",[41],"Copyright Lately",", es inusualmente agresivo para comunicaciones iniciales de cese y desistimiento:",[97,13390,13391,13397,13403],{},[73,13392,13393,13396],{},[23,13394,13395],{},"Disney"," califico a Seedance 2.0 como un \"robo virtual a mano armada\" de contenido protegido — un lenguaje que enmarca el asunto no como un accidente sino como un robo deliberado",[73,13398,13399,13402],{},[23,13400,13401],{},"Paramount"," declaro que los resultados de Seedance 2.0 eran \"indistinguibles\" de su material protegido — una afirmacion juridicamente significativa que podria respaldar un caso de infraccion",[73,13404,13405,13408],{},[23,13406,13407],{},"Warner Bros. Discovery, Netflix y Sony"," presentaron cada uno sus propias cartas con un lenguaje igualmente contundente",[11,13410,13411,13412,13417],{},"Las discusiones en la comunidad de ",[37,13413,13416],{"href":13414,"rel":13415},"https://reddit.com/r/comfyui",[41],"Reddit r/comfyui (20/2)"," comienzan a revelar informes de que el lanzamiento planificado de la API se ha retrasado debido a preocupaciones sobre deepfakes y derechos de autor. Los foros de desarrolladores se encienden con especulaciones sobre plazos e implicaciones.",[11,13419,13420,13423,13424,13429,13430,13435],{},[23,13421,13422],{},"21 de febrero de 2026"," — La MPA formaliza la posicion de la industria. Tanto ",[37,13425,13428],{"href":13426,"rel":13427},"https://www.hollywoodreporter.com",[41],"The Hollywood Reporter"," como ",[37,13431,13434],{"href":13432,"rel":13433},"https://variety.com",[41],"Variety"," reportan que la MPA ha enviado su propia carta de cese y desistimiento a ByteDance, calificando a Seedance 2.0 como una herramienta para la \"infraccion sistematica\". Se trata de la asociacion comercial de la industria — representando a los cinco estudios mas otros — sumando su peso institucional a las acciones individuales de los estudios.",[11,13437,13438,13439,13444],{},"Las ",[37,13440,13443],{"href":13441,"rel":13442},"https://news.ycombinator.com",[41],"discusiones en Hacker News (21/2)"," confirman que el lanzamiento de la API ha sido oficialmente pospuesto, con ByteDance supuestamente agregando \"medidas de proteccion previas al lanzamiento\" antes de proceder.",[11,13446,13447,7696,13450,13455,13456,13459,13460,13463],{},[23,13448,13449],{},"22 de febrero de 2026",[37,13451,13454],{"href":13452,"rel":13453},"https://the-decoder.com",[41],"The Decoder reporta"," la caracterizacion completa de la MPA sobre Seedance 2.0: \"una maquina construida para la infraccion sistematica\". Esta frase — cuidadosamente elegida por los abogados de la MPA — va mas alla de afirmar que la herramienta ",[2434,13457,13458],{},"puede"," usarse para infringir. Asegura que la herramienta fue ",[2434,13461,13462],{},"disenada"," para infringir, lo cual tiene implicaciones legales significativas si el caso llega a los tribunales.",[11,13465,13344,13466,13471],{},[37,13467,13470],{"href":13468,"rel":13469},"https://www.chosun.com",[41],"Chosun (Corea del Sur)"," reporta que ByteDance ha retrasado oficialmente el lanzamiento de la API de Seedance 2.0 debido a las disputas de derechos de autor. Esta es la primera confirmacion directa de un medio con fuentes dentro de ByteDance de que la cronologia de la API ha cambiado especificamente por la accion legal — no solo por retrasos rutinarios de desarrollo.",[92,13473,13475],{"id":13474},"situacion-actual-23-de-febrero-de-2026","Situacion actual (23 de febrero de 2026)",[11,13477,13478],{},"A dia de hoy:",[97,13480,13481,13487,13493,13499,13505],{},[73,13482,13483,13486],{},[23,13484,13485],{},"Cinco cartas de cese y desistimiento individuales"," de Disney, WBD, Paramount, Netflix y Sony",[73,13488,13489,13492],{},[23,13490,13491],{},"Una carta de cese y desistimiento institucional"," de la MPA",[73,13494,13495,13498],{},[23,13496,13497],{},"Lanzamiento de la API pospuesto"," del 24 de febrero a una fecha futura sin especificar",[73,13500,13501,13504],{},[23,13502,13503],{},"ByteDance se ha comprometido con medidas de proteccion"," pero no ha especificado detalles de implementacion ni plazos",[73,13506,13507,13510],{},[23,13508,13509],{},"Aun no se han presentado demandas"," — pero las cartas de cese y desistimiento son tipicamente el preludio de litigios si las demandas no se satisfacen",[18,13512,13513],{},[11,13514,13515,13518],{},[23,13516,13517],{},"Conclusion clave para desarrolladores:"," Esto no es un problema menor de relaciones publicas que se resolvera rapido. La naturaleza coordinada de la respuesta legal — cinco estudios mas la MPA — significa que ByteDance enfrenta una presion enorme para realizar cambios significativos antes de que la API se lance. Planifica en consecuencia.",[48,13520,13522],{"id":13521},"por-que-hollywood-apunta-a-seedance-20-especificamente","Por que Hollywood apunta a Seedance 2.0 especificamente",[11,13524,13525],{},"Existen otras herramientas de generacion de video con IA — Kling, Sora, Veo, Runway Gen-3, Pika — asi que, por que Seedance 2.0 esta recibiendo este nivel de accion legal? La respuesta reside en una combinacion especifica de capacidades, calidad de salida y ausencia de medidas de proteccion que lo hicieron especialmente amenazante para el contenido de Hollywood.",[92,13527,13529],{"id":13528},"la-cuestion-de-los-datos-de-entrenamiento","La cuestion de los datos de entrenamiento",[11,13531,13532],{},"La alegacion central subyacente a todas las cartas de cese y desistimiento es que Seedance 2.0 fue entrenado con contenido cinematografico y televisivo protegido sin autorizacion. Esto no es exclusivo de Seedance — practicamente todos los grandes modelos generativos enfrentan preguntas similares — pero el lenguaje de la MPA sugiere que creen que el dataset de entrenamiento de ByteDance se nutrio de manera particularmente intensa de contenido de Hollywood.",[11,13534,13535,13536,13540],{},"La frase \"uso no autorizado a escala masiva\" del CEO de la MPA, Rivkin (",[37,13537,13539],{"href":13338,"rel":13538},[41],"CNBC, 16/2","), implica que los estudios tienen evidencia (o al menos fuertes sospechas) sobre la composicion de los datos de entrenamiento. La caracterizacion de Disney como \"robo a mano armada\" sugiere que creen que esto fue deliberado y no incidental.",[11,13542,13543],{},"Lo que hace que la cuestion de los datos de entrenamiento sea particularmente sensible para Seedance 2.0 es la posicion de ByteDance como empresa tecnologica china. ByteDance opera TikTok, que aloja miles de millones de clips — muchos con contenido protegido subido por usuarios. Los estudios pueden sospechar (aunque esto no se ha confirmado publicamente) que los datos de entrenamiento de Seedance 2.0 incluyeron la vasta biblioteca de TikTok de clips de peliculas, segmentos de television y videos musicales subidos por usuarios.",[92,13545,13547],{"id":13546},"el-problema-de-la-fidelidad-del-resultado","El problema de la fidelidad del resultado",[11,13549,13550],{},"Lo que separa a Seedance 2.0 de las herramientas de video con IA anteriores es la calidad de su salida, particularmente en las areas que mas importan a Hollywood. El modelo destaca precisamente en las capacidades que facilitan la infraccion de derechos de autor:",[11,13552,13553,13556],{},[23,13554,13555],{},"Consistencia de personajes entre tomas."," Seedance 2.0 mantiene una apariencia coherente del personaje a lo largo de un video — misma cara, misma ropa, mismas proporciones. Los modelos anteriores a menudo producian personajes que cambiaban de apariencia entre fotogramas. Esta consistencia significa que si alguien genera contenido con un personaje protegido, el personaje se parece a ese personaje durante todo el video, no solo en un fotograma.",[11,13558,13559,13562],{},[23,13560,13561],{},"Control preciso de expresiones faciales y emociones."," El modelo puede generar interpretaciones emocionales matizadas — un personaje pasando de la sorpresa a la alegria, o de la calma al panico. Esto permite crear nuevas \"interpretaciones\" de personajes protegidos que se sienten autenticas respecto a sus personalidades establecidas.",[11,13564,13565,13568],{},[23,13566,13567],{},"Trabajo de camara cinematografico."," Seedance 2.0 reproduce tecnicas cinematograficas especificas: zooms tipo Hitchcock, tomas de seguimiento, movimientos de grua, secuencias en plano secuencia. Estas son las firmas visuales del cine de Hollywood, y el modelo puede replicarlas con alta fidelidad.",[11,13570,13571,13574],{},[23,13572,13573],{},"Generacion de audio nativa."," A diferencia de la mayoria de competidores, Seedance 2.0 genera audio sincronizado — dialogos, efectos de sonido y musica — junto con el video. Esto significa que el contenido generado no es solo una copia visual; son obras audiovisuales completas que pueden incluir voces de personajes.",[11,13576,13577,13580,13581,13584,13585,1580],{},[23,13578,13579],{},"Referencias multimodales."," El sistema ",[28,13582,13583],{},"@-reference"," permite subir imagenes, videos y audio como referencias creativas. Alguien podria subir una imagen de un personaje protegido y un clip mostrando movimientos de camara especificos, y el modelo combinaria ambos en contenido nuevo. Para mas informacion sobre este sistema, consulta nuestra ",[37,13586,13587],{"href":2781},"Guia de etiquetas multimodales @Tags",[92,13589,13591],{"id":13590},"las-medidas-de-proteccion-ausentes","Las medidas de proteccion ausentes",[11,13593,13594],{},"En su lanzamiento, Seedance 2.0 aparentemente tenia un filtrado de contenido minimo. Los usuarios podian generar videos con personajes reconocibles de Disney, heroes de Marvel, escenas de Star Wars y otra propiedad intelectual protegida sin ninguna intervencion a nivel de sistema. Esto contrastaba marcadamente con los competidores:",[1849,13596,13597,13620],{},[1852,13598,13599],{},[1855,13600,13601,13604,13608,13611,13614,13617],{},[1858,13602,13603],{},"Plataforma",[1858,13605,13607],{"align":13606},"center","Filtros de copyright",[1858,13609,13610],{"align":13606},"Bloqueo de personajes",[1858,13612,13613],{"align":13606},"Deteccion de celebridades",[1858,13615,13616],{"align":13606},"Marca de agua",[1858,13618,13619],{"align":13606},"Politica de contenido",[1865,13621,13622,13639,13656,13671,13688,13703],{},[1855,13623,13624,13627,13630,13632,13634,13636],{},[1870,13625,13626],{},"Seedance 2.0 (al lanzamiento)",[1870,13628,13629],{"align":13606},"❌",[1870,13631,13629],{"align":13606},[1870,13633,13629],{"align":13606},[1870,13635,13629],{"align":13606},[1870,13637,13638],{"align":13606},"Minima",[1855,13640,13641,13644,13647,13649,13651,13653],{},[1870,13642,13643],{},"OpenAI Sora",[1870,13645,13646],{"align":13606},"✅",[1870,13648,13646],{"align":13606},[1870,13650,13646],{"align":13606},[1870,13652,13646],{"align":13606},[1870,13654,13655],{"align":13606},"Estricta",[1855,13657,13658,13661,13663,13665,13667,13669],{},[1870,13659,13660],{},"Google Veo 2",[1870,13662,13646],{"align":13606},[1870,13664,13646],{"align":13606},[1870,13666,13646],{"align":13606},[1870,13668,13646],{"align":13606},[1870,13670,13655],{"align":13606},[1855,13672,13673,13676,13679,13681,13683,13685],{},[1870,13674,13675],{},"Runway Gen-3",[1870,13677,13678],{"align":13606},"Parcial",[1870,13680,13678],{"align":13606},[1870,13682,13629],{"align":13606},[1870,13684,13646],{"align":13606},[1870,13686,13687],{"align":13606},"Moderada",[1855,13689,13690,13693,13695,13697,13699,13701],{},[1870,13691,13692],{},"Kling",[1870,13694,13678],{"align":13606},[1870,13696,13629],{"align":13606},[1870,13698,13678],{"align":13606},[1870,13700,13646],{"align":13606},[1870,13702,13687],{"align":13606},[1855,13704,13705,13708,13710,13712,13714,13716],{},[1870,13706,13707],{},"Pika",[1870,13709,13678],{"align":13606},[1870,13711,13629],{"align":13606},[1870,13713,13629],{"align":13606},[1870,13715,13646],{"align":13606},[1870,13717,13687],{"align":13606},[11,13719,13720],{},"OpenAI y Google invirtieron fuertemente en sistemas de seguridad de contenido antes de lanzar sus modelos de video. Sora tiene multiples capas de filtrado: bloquea prompts que hacen referencia a personajes protegidos por nombre, detecta rostros generados que se asemejan a figuras publicas reales, aplica marcas de agua visibles e invisibles, y tiene procesos de revision humana para casos limite.",[11,13722,13723],{},"ByteDance aparentemente priorizo la capacidad sobre la seguridad en el lanzamiento inicial de Seedance 2.0 — y el resultado fue un modelo capaz de producir contenido con calidad de Hollywood a partir de la propia propiedad intelectual de Hollywood, sin nada que lo detuviera.",[92,13725,13727],{"id":13726},"por-que-otras-herramientas-de-video-con-ia-no-han-enfrentado-acciones-similares","Por que otras herramientas de video con IA no han enfrentado acciones similares",[11,13729,13730],{},"La respuesta simple: una combinacion de menor calidad de salida, filtros de seguridad mas robustos y presencia legal en Estados Unidos que las hace mas faciles de negociar.",[11,13732,13733],{},"Sora y Veo son producidos por empresas estadounidenses (OpenAI y Google) con equipos legales establecidos y relaciones existentes con los titulares de derechos. Estas empresas han interactuado proactivamente con los titulares de derechos, implementado filtrado de contenido robusto y, en algunos casos, buscado acuerdos de licencia.",[11,13735,13736],{},"Runway y Kling han enfrentado algunas criticas pero no han alcanzado el umbral de fidelidad de salida en el que los abogados de Hollywood los consideren una amenaza existencial. Seedance 2.0 cruzo ese umbral.",[11,13738,13739],{},"La combinacion de la fidelidad de salida mas alta de su clase, la ausencia de medidas de proteccion y una empresa matriz con sede fuera de la jurisdiccion estadounidense creo la tormenta perfecta para la accion legal.",[48,13741,13743],{"id":13742},"el-retraso-de-la-api-lo-que-sabemos","El retraso de la API: lo que sabemos",[11,13745,13746],{},"La API de Seedance 2.0 estaba originalmente programada para su lanzamiento publico el 24 de febrero de 2026. Esa fecha se ha pospuesto sin una fecha de reemplazo confirmada.",[92,13748,13750],{"id":13749},"lo-que-bytedance-ha-prometido","Lo que ByteDance ha prometido",[11,13752,13753,13754,290,13758,2774,13762,323],{},"En respuesta a la presion legal, ByteDance se ha comprometido a implementar varias medidas de proteccion antes del lanzamiento de la API. Segun reportes de ",[37,13755,13757],{"href":13338,"rel":13756},[41],"CNBC (16/2)",[37,13759,13761],{"href":13441,"rel":13760},[41],"Hacker News (21/2)",[37,13763,13765],{"href":13347,"rel":13764},[41],"Al Jazeera (16/2)",[97,13767,13768,13774,13780,13786],{},[73,13769,13770,13773],{},[23,13771,13772],{},"Deteccion y bloqueo facial"," — Impedir la generacion de personas reales reconocibles. Esto incluye actores, figuras publicas y potencialmente cualquier individuo real cuyo rostro aparezca en los datos de entrenamiento. El sistema necesitaria comparar los rostros generados con una base de datos de personas conocidas.",[73,13775,13776,13779],{},[23,13777,13778],{},"Intercepcion de personajes protegidos"," — Bloquear prompts que hagan referencia a propiedad intelectual conocida. Esto implica filtrado a nivel de texto (detectar \"Spider-Man\" o \"Elsa\") mas deteccion a nivel visual (detectar imagenes de referencia subidas de personajes protegidos). Ambos son tecnicamente complejos a escala.",[73,13781,13782,13785],{},[23,13783,13784],{},"Marca de agua digital"," — Agregar marcas de agua invisibles a todo el contenido generado para el rastreo de procedencia. Esto permite a los titulares de derechos identificar el contenido generado por IA y rastrearlo hasta la plataforma y potencialmente hasta quien lo genero.",[73,13787,13788,13791],{},[23,13789,13790],{},"Deteccion de similitud de contenido"," — Filtrado mas amplio para prevenir la generacion de contenido que coincida estrechamente con obras protegidas especificas. Esto podria implicar comparar los fotogramas generados con una base de datos de contenido protegido — computacionalmente costoso pero legalmente necesario.",[92,13793,13795],{"id":13794},"el-desafio-de-implementacion","El desafio de implementacion",[11,13797,13798],{},"Estas medidas de proteccion no son triviales de construir. Cada una implica ingenieria significativa:",[11,13800,13801,13804],{},[23,13802,13803],{},"El filtrado a nivel de texto"," es lo mas facil — mantener una lista de bloqueo de nombres de personajes, nombres de franquicias y terminos de marca registrada. Pero tambien es lo mas facil de eludir (\"un raton con orejas redondas usando pantalones cortos rojos\").",[11,13806,13807,13810],{},[23,13808,13809],{},"La deteccion a nivel visual"," es mas dificil. El sistema necesita reconocer personajes protegidos incluso cuando se describen de forma indirecta, y detectar cuando la salida generada se asemeja a contenido protegido especifico. Esto requiere entrenar modelos de deteccion separados sobre el propio contenido protegido — lo cual plantea sus propias cuestiones de licencia.",[11,13812,13813,13816],{},[23,13814,13815],{},"El reconocimiento facial"," para bloqueo de celebridades/actores requiere una base de datos facial completa y comparacion en tiempo real durante la generacion. Necesita manejar multiples angulos, condiciones de iluminacion y estilos artisticos.",[11,13818,13819,13822],{},[23,13820,13821],{},"La marca de agua digital"," que sobreviva a la compresion, el recorte y la conversion de formato es un area de investigacion activa. ByteDance necesita marcas de agua que sean imperceptibles para los espectadores pero lo suficientemente robustas para sobrevivir al procesamiento que implica la distribucion tipica en redes sociales.",[11,13824,13825],{},"La MPA no va a aceptar un ejercicio de casillas marcadas. Estas medidas de proteccion necesitan funcionar de verdad, y verificarlo lleva tiempo.",[92,13827,13829],{"id":13828},"que-significa-esto-para-los-desarrolladores-ahora-mismo","Que significa esto para los desarrolladores ahora mismo",[11,13831,13832],{},"Si has estado construyendo sobre la API de Seedance 2.0, el retraso genera varios problemas practicos inmediatos:",[11,13834,13835,13838],{},[23,13836,13837],{},"1. Sin fecha de lanzamiento confirmada."," ByteDance no ha anunciado una nueva cronologia. Las medidas de proteccion necesitan satisfacer a los equipos legales de cinco grandes estudios mas la MPA — ese no es un proceso rapido. Las estimaciones realistas van de semanas a meses, dependiendo de cuan agresivos sean los requisitos de proteccion.",[11,13840,13841,13844],{},[23,13842,13843],{},"2. El comportamiento de la API cambiara."," La adicion de filtrado de contenido implica nuevos codigos de error, manejo modificado de prompts e inputs rechazados que antes funcionaban en la interfaz web. Los prompts que hagan referencia a estilos visuales especificos demasiado cercanos a material protegido probablemente fallaran. Necesitaras manejar estos rechazos de forma elegante en tu codigo.",[11,13846,13847,13850],{},[23,13848,13849],{},"3. Incertidumbre en precios."," La infraestructura de filtrado de contenido cuesta dinero — tanto el computo para deteccion en tiempo real como la ingenieria para construirla y mantenerla. Es plausible que los costos por generacion aumenten para cubrir la carga adicional. ByteDance tambien podria implementar precios escalonados segun el nivel de filtrado de contenido aplicado.",[11,13852,13853,13856],{},[23,13854,13855],{},"4. Los terminos de servicio se endurecerán."," Espera politicas de uso mas estrictas, particularmente en torno a:",[97,13858,13859,13862,13865,13868,13871],{},[73,13860,13861],{},"Uso comercial del contenido generado",[73,13863,13864],{},"Responsabilidad por resultados infractores",[73,13866,13867],{},"Requisitos de documentacion de prompts",[73,13869,13870],{},"Restricciones en ciertas categorias de generacion de contenido",[73,13872,13873],{},"Clausulas de indemnizacion (o su ausencia)",[11,13875,13876,13879],{},[23,13877,13878],{},"5. Limites de velocidad y procesos de revision."," Para usuarios empresariales de la API, ByteDance podria implementar procesos de revision adicionales para cuentas de alto volumen o ciertas categorias de contenido.",[11,13881,13882,13885],{},[23,13883,13884],{},"6. Riesgo de plataformas derivadas."," Si estas construyendo un producto sobre la API de Seedance 2.0 y ofreces generacion de video a tus propios usuarios, heredas cualquier vacio de responsabilidad que exista. Tus usuarios podrian generar contenido infractor a traves de tu plataforma, y tu podrias enfrentar reclamaciones de los titulares de derechos.",[11,13887,13888,13889,13893],{},"Para quienes necesitan capacidades de generacion de video hoy y no pueden esperar a que se resuelva el retraso de Seedance, implementar failover multimodelo es la solucion pragmatica. Cubrimos esto en detalle en la ",[37,13890,13892],{"href":13891},"#como-acceder-a-la-api-de-seedance-20-a-traves-de-evolink","seccion de integracion con EvoLink"," a continuacion.",[48,13895,13897],{"id":13896},"que-significa-esto-para-tus-proyectos-comerciales","Que significa esto para tus proyectos comerciales",[11,13899,13900,13901],{},"La pregunta central que todo desarrollador que construye sobre generacion de video con IA se esta haciendo: ",[23,13902,13903],{},"Puedo usar de forma segura el contenido generado por la API de Seedance 2.0 en productos comerciales?",[11,13905,13906],{},"La respuesta honesta: depende enteramente de que generas y como lo generas. El riesgo no es binario — existe en un espectro, y comprender donde cae tu caso de uso especifico en ese espectro es esencial.",[92,13908,13910],{"id":13909},"dos-capas-distintas-de-riesgo-de-derechos-de-autor","Dos capas distintas de riesgo de derechos de autor",[11,13912,13913],{},"El riesgo de derechos de autor en contenido generado por IA existe en dos dimensiones legales separadas. Confundirlas conduce a una cautela excesiva (evitar la tecnologia por completo) o a una complacencia peligrosa (asumir que todo esta bien). Ninguna de las dos te conviene.",[11,13915,13916],{},[23,13917,13918],{},"Capa 1: responsabilidad por datos de entrenamiento (riesgo a nivel de modelo)",[11,13920,13921],{},"Esta es la preocupacion principal de la MPA y la base de las cartas de cese y desistimiento. Si Seedance 2.0 fue entrenado con contenido protegido sin licencia, ByteDance enfrenta posibles danos estatutarios. Pero la pregunta critica para los desarrolladores: esa responsabilidad se extiende a los usuarios de la API?",[11,13923,13924],{},"A febrero de 2026, ningun tribunal estadounidense ha dictaminado que los usuarios de un modelo de IA sean responsables de la composicion de los datos de entrenamiento del modelo. Los precedentes mas cercanos provienen de los casos en curso contra Stability AI, Midjourney y otros — pero estos apuntan a los creadores del modelo, no a los usuarios finales.",[11,13926,13927],{},"Sin embargo, el panorama legal esta evolucionando rapidamente. Si un tribunal eventualmente establece que el contenido generado por IA derivado de datos de entrenamiento infractores es en si mismo una obra derivada, los desarrolladores que comercializaron ese contenido podrian enfrentar reclamaciones retroactivas. La probabilidad es discutible; el impacto potencial no lo es.",[11,13929,13930],{},[23,13931,13932],{},"Capa 2: responsabilidad por el contenido de salida (riesgo a nivel de usuario)",[11,13934,13935],{},"Este es el riesgo mas inmediato y accionable para los desarrolladores. Independientemente de la cuestion de los datos de entrenamiento, si tu video generado con Seedance:",[97,13937,13938,13941,13944,13947,13950],{},[73,13939,13940],{},"Contiene personajes protegidos reconocibles (Mickey Mouse, Spider-Man, Darth Vader)",[73,13942,13943],{},"Replica de cerca escenas o secuencias protegidas especificas",[73,13945,13946],{},"Presenta personas reales reconocibles sin su consentimiento",[73,13948,13949],{},"Reproduce logotipos de marcas registradas, elementos de marca o identidades visuales distintivas",[73,13951,13952],{},"Imita el estilo visual protegido de un artista o estudio especifico de forma lo suficientemente cercana como para causar confusion",[11,13954,13955],{},"...entonces enfrentas responsabilidad directa por infraccion de derechos de autor, marca registrada o derecho de imagen. Este riesgo existe independientemente de la cuestion de los datos de entrenamiento e independientemente de que modelo de IA uses.",[92,13957,13959],{"id":13958},"espectro-de-riesgo-para-casos-de-uso-comunes","Espectro de riesgo para casos de uso comunes",[1849,13961,13962,13975],{},[1852,13963,13964],{},[1855,13965,13966,13969,13972],{},[1858,13967,13968],{},"Caso de uso",[1858,13970,13971],{},"Nivel de riesgo",[1858,13973,13974],{},"Factores clave",[1865,13976,13977,13988,13998,14008,14019,14029,14040,14050],{},[1855,13978,13979,13982,13985],{},[1870,13980,13981],{},"Video original de presentacion de producto usando tus propias imagenes",[1870,13983,13984],{},"🟢 Bajo",[1870,13986,13987],{},"Tus activos, descripcion generica, sin referencias a PI",[1855,13989,13990,13993,13995],{},[1870,13991,13992],{},"Video de marketing con personajes y escenas originales",[1870,13994,13984],{},[1870,13996,13997],{},"Direccion creativa original, sin PI existente",[1855,13999,14000,14003,14005],{},[1870,14001,14002],{},"Metraje generico tipo stock (naturaleza, paisajes urbanos, abstracto)",[1870,14004,13984],{},[1870,14006,14007],{},"Sin personajes ni PI involucrada",[1855,14009,14010,14013,14016],{},[1870,14011,14012],{},"Video que imita el estilo visual de una pelicula especifica",[1870,14014,14015],{},"🟡 Medio",[1870,14017,14018],{},"El estilo por si solo no es protegible, pero una replica demasiado cercana es riesgosa",[1855,14020,14021,14024,14026],{},[1870,14022,14023],{},"Contenido con personajes originales que se asemejan a personajes protegidos",[1870,14025,14015],{},[1870,14027,14028],{},"\"Inspirado en\" vs. \"sustancialmente similar\" — una zona gris",[1855,14030,14031,14034,14037],{},[1870,14032,14033],{},"Video con personajes protegidos reconocibles",[1870,14035,14036],{},"🔴 Alto",[1870,14038,14039],{},"Infraccion directa sin importar la herramienta utilizada",[1855,14041,14042,14045,14047],{},[1870,14043,14044],{},"Contenido con apariencia de celebridades reales",[1870,14046,14036],{},[1870,14048,14049],{},"Violaciones del derecho de imagen",[1855,14051,14052,14055,14057],{},[1870,14053,14054],{},"Replica de escenas protegidas especificas",[1870,14056,14036],{},[1870,14058,14059],{},"Copia directa de expresion protegible",[92,14061,14063],{"id":14062},"lista-de-verificacion-de-cumplimiento-empresarial","Lista de verificacion de cumplimiento empresarial",[11,14065,14066],{},"Antes de usar cualquier herramienta de generacion de video con IA para contenido comercial, repasa esta lista de verificacion:",[97,14068,14071,14084,14093,14102,14111,14120,14129,14138,14147],{"className":14069},[14070],"contains-task-list",[73,14072,14075,14079,14080,14083],{"className":14073},[14074],"task-list-item",[14076,14077],"input",{"disabled":58,"type":14078},"checkbox"," ",[23,14081,14082],{},"Revisa los Terminos de Servicio de la plataforma"," — Especificamente: quien es propietario del resultado? Que derechos comerciales se otorgan? Que restricciones de uso aplican? La plataforma te indemniza contra reclamaciones de infraccion?",[73,14085,14087,14079,14089,14092],{"className":14086},[14074],[14076,14088],{"disabled":58,"type":14078},[23,14090,14091],{},"Establece una politica interna de uso de IA"," — Documenta que tipos de contenido estan aprobados para generacion con IA y cuales requieren creacion humana. Capacita a tu equipo sobre la politica.",[73,14094,14096,14079,14098,14101],{"className":14095},[14074],[14076,14097],{"disabled":58,"type":14078},[23,14099,14100],{},"Audita cada prompt antes de enviarlo"," — Alguno hace referencia a personajes protegidos especificos, personas reales o propiedades de marca registrada? Implementa revision de prompts para proyectos comerciales.",[73,14103,14105,14079,14107,14110],{"className":14104},[14074],[14076,14106],{"disabled":58,"type":14078},[23,14108,14109],{},"Verifica la similitud del resultado antes de publicar"," — El contenido generado se asemeja estrechamente a alguna obra protegida especifica? Usa busqueda inversa de imagenes/video y revision humana.",[73,14112,14114,14079,14116,14119],{"className":14113},[14074],[14076,14115],{"disabled":58,"type":14078},[23,14117,14118],{},"Documenta todo tu proceso"," — Mantén registros de prompts, parametros, intencion creativa y los pasos de revision tomados. Esto establece buena fe si se te cuestiona.",[73,14121,14123,14079,14125,14128],{"className":14122},[14074],[14076,14124],{"disabled":58,"type":14078},[23,14126,14127],{},"Obtén revision legal para contenido de alto impacto"," — Para campanas publicitarias, entretenimiento de marca o contenido de amplia distribucion, que un abogado de propiedad intelectual revise tanto los terminos de la plataforma como tus resultados especificos.",[73,14130,14132,14079,14134,14137],{"className":14131},[14074],[14076,14133],{"disabled":58,"type":14078},[23,14135,14136],{},"Considera un seguro E&O"," — Los seguros de errores y omisiones que cubren explicitamente contenido generado por IA son cada vez mas accesibles y, para produccion de video comercial, cada vez mas necesarios.",[73,14139,14141,14079,14143,14146],{"className":14140},[14074],[14076,14142],{"disabled":58,"type":14078},[23,14144,14145],{},"Monitorea los desarrollos legales"," — Suscribete a actualizaciones legales sobre derechos de autor e IA. El panorama cambia mensualmente. Lo que es practica aceptable hoy podria ser litigado manana.",[73,14148,14150,14079,14152,14155],{"className":14149},[14074],[14076,14151],{"disabled":58,"type":14078},[23,14153,14154],{},"Planifica la retirada de contenido"," — Si una resolucion judicial cambia el calculo de riesgo para contenido que ya has publicado, ten un proceso para identificar y abordar los activos afectados.",[18,14157,14158],{},[11,14159,14160,14163],{},[23,14161,14162],{},"Conclusion:"," El contenido generico y original generado a partir de prompts descriptivos — sin nombres de personajes, sin referencias de marca, sin apariencia de actores, sin replica deliberada de obras especificas — conlleva el menor riesgo. El contenido que replica intencionada o negligentemente PI existente conlleva el mayor riesgo, y usar una API no te aisla de esa responsabilidad.",[14165,14166,14168,14173,14176],"div",{"style":14167},"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; padding: 2em; margin: 2em 0; color: white;",[11,14169,14170],{},[23,14171,14172],{},"Necesitas generacion de video que no se detenga cuando un modelo se retrasa?",[11,14174,14175],{},"EvoLink proporciona una API unificada para Seedance 2.0, Kling, Veo, Sora y mas. Si Seedance no esta disponible, tu pipeline de produccion no se rompe — cambia de modelo automaticamente.",[11,14177,14178],{},[37,14179,14181],{"href":14180},"/docs/video-generation","Explora la API de generacion de video →",[48,14183,14185],{"id":14184},"practicas-seguras-de-prompts-evitar-activadores-de-copyright","Practicas seguras de prompts: evitar activadores de copyright",[11,14187,14188,14189],{},"Ya sea que uses Seedance 2.0, Sora, Veo o cualquier otro modelo de generacion de video con IA, las practicas seguras de prompts protegen tus proyectos del riesgo de derechos de autor. El principio fundamental: ",[23,14190,14191],{},"describe lo que quieres crear, no lo que quieres copiar.",[11,14193,14194],{},"Esta seccion proporciona directrices concretas y accionables con ejemplos de codigo que puedes usar directamente en tu integracion con la API de Seedance 2.0.",[92,14196,14198],{"id":14197},"patrones-de-prompts-a-evitar","Patrones de prompts a evitar",[11,14200,14201],{},"Estos patrones probablemente activaran los filtros de copyright (una vez implementados) y crean riesgo legal independientemente del filtrado:",[1849,14203,14204,14217],{},[1852,14205,14206],{},[1855,14207,14208,14211,14214],{},[1858,14209,14210],{},"❌ Patron de prompt peligroso",[1858,14212,14213],{},"Por que es riesgoso",[1858,14215,14216],{},"Exposicion legal",[1865,14218,14219,14230,14240,14251,14261,14271,14282,14293],{},[1855,14220,14221,14224,14227],{},[1870,14222,14223],{},"\"Generate a video of Spider-Man swinging through New York\"",[1870,14225,14226],{},"Referencia directa a personaje protegido",[1870,14228,14229],{},"Infraccion de derechos de autor",[1855,14231,14232,14235,14238],{},[1870,14233,14234],{},"\"Create a scene that looks like it's from Frozen\"",[1870,14236,14237],{},"Replica deliberada de obra protegida",[1870,14239,14229],{},[1855,14241,14242,14245,14248],{},[1870,14243,14244],{},"\"Make a video featuring someone who looks like Scarlett Johansson\"",[1870,14246,14247],{},"Violacion de derechos de imagen",[1870,14249,14250],{},"Derecho de imagen",[1855,14252,14253,14256,14259],{},[1870,14254,14255],{},"\"Replicate the opening sequence of Blade Runner 2049\"",[1870,14257,14258],{},"Copia directa de escena",[1870,14260,14229],{},[1855,14262,14263,14266,14269],{},[1870,14264,14265],{},"\"A character that looks like Elsa with ice powers\"",[1870,14267,14268],{},"Referencia indirecta a personaje protegido",[1870,14270,14229],{},[1855,14272,14273,14276,14279],{},[1870,14274,14275],{},"\"Generate a video with the Nike swoosh logo\"",[1870,14277,14278],{},"Uso de marca registrada",[1870,14280,14281],{},"Infraccion de marca registrada",[1855,14283,14284,14287,14290],{},[1870,14285,14286],{},"\"A wizard school that looks like Hogwarts\"",[1870,14288,14289],{},"Replica de escenario con marca registrada",[1870,14291,14292],{},"Dilucion de marca registrada",[1855,14294,14295,14298,14301],{},[1870,14296,14297],{},"\"An anime girl in the exact style of Studio Ghibli\"",[1870,14299,14300],{},"Replica del estilo de un estudio",[1870,14302,14303],{},"Zona gris, potencialmente riesgoso",[11,14305,14306],{},"Las referencias indirectas son particularmente peligrosas porque podrian pasar los filtros a nivel de texto mientras siguen produciendo resultados infractores. \"Una princesa con cabello rubio platinado, poderes de hielo y un vestido azul\" no dice \"Elsa\", pero el resultado casi con certeza se parece a Elsa.",[92,14308,14310],{"id":14309},"patrones-de-prompts-que-funcionan-de-forma-segura","Patrones de prompts que funcionan de forma segura",[11,14312,14313],{},"Estos patrones generan contenido atractivo y original sin complicaciones de derechos de autor:",[1849,14315,14316,14326],{},[1852,14317,14318],{},[1855,14319,14320,14323],{},[1858,14321,14322],{},"✅ Patron de prompt seguro",[1858,14324,14325],{},"Por que funciona",[1865,14327,14328,14336,14344,14352,14360,14368,14376],{},[1855,14329,14330,14333],{},[1870,14331,14332],{},"\"A superhero in an original red and gold suit flies over a futuristic city at sunset\"",[1870,14334,14335],{},"Personaje original, escenario original",[1855,14337,14338,14341],{},[1870,14339,14340],{},"\"Cinematic drone shot over a coastal city at golden hour, warm color palette, anamorphic lens\"",[1870,14342,14343],{},"Escena generica con descripcion de tecnica cinematografica",[1855,14345,14346,14349],{},[1870,14347,14348],{},"\"A young woman in a flowing blue dress walks through a sunlit Mediterranean village\"",[1870,14350,14351],{},"Personaje original, escenario generico",[1855,14353,14354,14357],{},[1870,14355,14356],{},"\"Product showcase: silver smartwatch rotating on marble surface, studio lighting\"",[1870,14358,14359],{},"Tu propio producto, presentacion generica",[1855,14361,14362,14365],{},[1870,14363,14364],{},"\"@Image1 as first frame, tracking shot following the subject through a forest\"",[1870,14366,14367],{},"Tus propios activos de referencia",[1855,14369,14370,14373],{},[1870,14371,14372],{},"\"Anime-style warrior in ornate jade armor standing on a cliff overlooking a stormy sea\"",[1870,14374,14375],{},"Personaje original en una categoria de estilo generico",[1855,14377,14378,14381],{},[1870,14379,14380],{},"\"Pixar-quality 3D animation: a wise old cat in spectacles sits at a cafe table\"",[1870,14382,14383],{},"Referencia de calidad de estilo (no una propiedad especifica de Pixar)",[92,14385,14387],{"id":14386},"la-distincion-entre-estilo-y-personaje","La distincion entre estilo y personaje",[11,14389,14390],{},"Este es un matiz que importa legalmente. En general, puedes hacer referencia a:",[97,14392,14393,14399,14405],{},[73,14394,14395,14398],{},[23,14396,14397],{},"Estilos artisticos de forma amplia"," — \"estilo anime\", \"3D calidad Pixar\", \"estetica de pintura al oleo\", \"cinematografia noir\"",[73,14400,14401,14404],{},[23,14402,14403],{},"Tecnicas cinematograficas"," — \"zoom Hitchcock\", \"toma de seguimiento con Steadicam\", \"angulo holandes\"",[73,14406,14407,14410],{},[23,14408,14409],{},"Convenciones de genero"," — \"paisaje urbano cyberpunk\", \"aldea medieval de fantasia\", \"opera espacial\"",[11,14412,14413],{},"No deberias hacer referencia a:",[97,14415,14416,14422,14428],{},[73,14417,14418,14421],{},[23,14419,14420],{},"Obras especificas"," — \"como la escena de persecucion de The Dark Knight\"",[73,14423,14424,14427],{},[23,14425,14426],{},"Personajes especificos"," — incluso descritos de forma indirecta",[73,14429,14430,14433],{},[23,14431,14432],{},"Estilos propietarios de estudios especificos"," — si la descripcion es lo suficientemente especifica como para identificar la fuente",[11,14435,14436],{},"La linea es difusa, y ante la duda, hazlo mas generico.",[92,14438,14440],{"id":14439},"ejemplo-de-codigo-prompts-seguros-vs-peligrosos-en-la-practica","Ejemplo de codigo: prompts seguros vs. peligrosos en la practica",[11,14442,14443],{},"Aqui esta la configuracion completa para todos los ejemplos de codigo en esta guia, usando la API de Seedance 2.0 a traves de EvoLink:",[136,14445,14447],{"className":326,"code":14446,"language":328,"meta":141,"style":141},"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,14448,14449,14455,14461,14465,14477,14485,14493,14509,14517,14521,14525,14534,14539,14547,14559,14569,14577,14581,14585,14593,14605,14639,14643,14648,14656,14665,14685,14693,14697,14702,14711,14715,14732,14750,14771,14777,14793,14825,14829,14859],{"__ignoreMap":141},[145,14450,14451,14453],{"class":147,"line":148},[145,14452,335],{"class":258},[145,14454,352],{"class":262},[145,14456,14457,14459],{"class":147,"line":166},[145,14458,335],{"class":258},[145,14460,345],{"class":262},[145,14462,14463],{"class":147,"line":178},[145,14464,357],{"emptyLinePlaceholder":58},[145,14466,14467,14469,14471,14474],{"class":147,"line":187},[145,14468,381],{"class":155},[145,14470,372],{"class":258},[145,14472,14473],{"class":159}," \"your-evolink-api-key\"",[145,14475,14476],{"class":174},"  # Get yours at evolink.ai/early-access\n",[145,14478,14479,14481,14483],{"class":147,"line":360},[145,14480,369],{"class":155},[145,14482,372],{"class":258},[145,14484,9077],{"class":159},[145,14486,14487,14489,14491],{"class":147,"line":366},[145,14488,440],{"class":155},[145,14490,372],{"class":258},[145,14492,445],{"class":262},[145,14494,14495,14497,14499,14501,14503,14505,14507],{"class":147,"line":378},[145,14496,451],{"class":159},[145,14498,454],{"class":262},[145,14500,457],{"class":258},[145,14502,460],{"class":159},[145,14504,463],{"class":155},[145,14506,466],{"class":159},[145,14508,469],{"class":262},[145,14510,14511,14513,14515],{"class":147,"line":395},[145,14512,475],{"class":159},[145,14514,454],{"class":262},[145,14516,480],{"class":159},[145,14518,14519],{"class":147,"line":400},[145,14520,486],{"class":262},[145,14522,14523],{"class":147,"line":415},[145,14524,357],{"emptyLinePlaceholder":58},[145,14526,14527,14529,14532],{"class":147,"line":432},[145,14528,502],{"class":258},[145,14530,14531],{"class":151}," generate_video",[145,14533,5651],{"class":262},[145,14535,14536],{"class":147,"line":437},[145,14537,14538],{"class":159},"    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n",[145,14540,14541,14543,14545],{"class":147,"line":448},[145,14542,903],{"class":262},[145,14544,266],{"class":258},[145,14546,1219],{"class":262},[145,14548,14549,14551,14553,14555,14557],{"class":147,"line":472},[145,14550,1225],{"class":258},[145,14552,466],{"class":159},[145,14554,571],{"class":155},[145,14556,1232],{"class":159},[145,14558,469],{"class":262},[145,14560,14561,14563,14565,14567],{"class":147,"line":483},[145,14562,1244],{"class":593},[145,14564,266],{"class":258},[145,14566,440],{"class":155},[145,14568,469],{"class":262},[145,14570,14571,14573,14575],{"class":147,"line":489},[145,14572,1260],{"class":593},[145,14574,266],{"class":258},[145,14576,2603],{"class":262},[145,14578,14579],{"class":147,"line":494},[145,14580,1274],{"class":262},[145,14582,14583],{"class":147,"line":499},[145,14584,924],{"class":262},[145,14586,14587,14589,14591],{"class":147,"line":519},[145,14588,1289],{"class":262},[145,14590,266],{"class":258},[145,14592,622],{"class":262},[145,14594,14595,14597,14599,14601,14603],{"class":147,"line":525},[145,14596,7023],{"class":262},[145,14598,266],{"class":258},[145,14600,638],{"class":262},[145,14602,1428],{"class":159},[145,14604,644],{"class":262},[145,14606,14607,14609,14611,14613,14615,14617,14619,14621,14624,14626,14628,14631,14633,14635,14637],{"class":147,"line":536},[145,14608,878],{"class":155},[145,14610,424],{"class":262},[145,14612,457],{"class":258},[145,14614,12016],{"class":159},[145,14616,577],{"class":155},[145,14618,580],{"class":262},[145,14620,583],{"class":155},[145,14622,14623],{"class":159}," (model: ",[145,14625,577],{"class":155},[145,14627,1325],{"class":262},[145,14629,14630],{"class":159},"'model'",[145,14632,1331],{"class":262},[145,14634,583],{"class":155},[145,14636,5331],{"class":159},[145,14638,392],{"class":262},[145,14640,14641],{"class":147,"line":541},[145,14642,357],{"emptyLinePlaceholder":58},[145,14644,14645],{"class":147,"line":552},[145,14646,14647],{"class":174},"    # Poll for completion\n",[145,14649,14650,14652,14654],{"class":147,"line":563},[145,14651,544],{"class":258},[145,14653,547],{"class":155},[145,14655,412],{"class":262},[145,14657,14658,14661,14663],{"class":147,"line":590},[145,14659,14660],{"class":262},"        status_resp ",[145,14662,266],{"class":258},[145,14664,560],{"class":262},[145,14666,14667,14669,14671,14673,14675,14677,14679,14681,14683],{"class":147,"line":602},[145,14668,566],{"class":258},[145,14670,466],{"class":159},[145,14672,571],{"class":155},[145,14674,574],{"class":159},[145,14676,577],{"class":155},[145,14678,580],{"class":262},[145,14680,583],{"class":155},[145,14682,466],{"class":159},[145,14684,469],{"class":262},[145,14686,14687,14689,14691],{"class":147,"line":608},[145,14688,594],{"class":593},[145,14690,266],{"class":258},[145,14692,599],{"class":155},[145,14694,14695],{"class":147,"line":614},[145,14696,605],{"class":262},[145,14698,14699],{"class":147,"line":625},[145,14700,14701],{"class":262},"        status_resp.raise_for_status()\n",[145,14703,14704,14706,14708],{"class":147,"line":630},[145,14705,11555],{"class":262},[145,14707,266],{"class":258},[145,14709,14710],{"class":262}," status_resp.json()\n",[145,14712,14713],{"class":147,"line":647},[145,14714,357],{"emptyLinePlaceholder":58},[145,14716,14717,14719,14721,14723,14726,14728,14730],{"class":147,"line":668},[145,14718,746],{"class":258},[145,14720,1453],{"class":262},[145,14722,641],{"class":159},[145,14724,14725],{"class":262},"] ",[145,14727,752],{"class":258},[145,14729,755],{"class":159},[145,14731,412],{"class":262},[145,14733,14734,14736,14738,14740,14743,14745,14748],{"class":147,"line":688},[145,14735,7209],{"class":262},[145,14737,266],{"class":258},[145,14739,1453],{"class":262},[145,14741,14742],{"class":159},"\"task_info\"",[145,14744,1359],{"class":262},[145,14746,14747],{"class":159},"\"video_url\"",[145,14749,644],{"class":262},[145,14751,14752,14754,14756,14758,14761,14763,14765,14767,14769],{"class":147,"line":693},[145,14753,5392],{"class":155},[145,14755,424],{"class":262},[145,14757,457],{"class":258},[145,14759,14760],{"class":159},"\"✅ Video ready: ",[145,14762,577],{"class":155},[145,14764,1484],{"class":262},[145,14766,583],{"class":155},[145,14768,466],{"class":159},[145,14770,392],{"class":262},[145,14772,14773,14775],{"class":147,"line":738},[145,14774,763],{"class":258},[145,14776,1515],{"class":262},[145,14778,14779,14781,14783,14785,14787,14789,14791],{"class":147,"line":743},[145,14780,772],{"class":258},[145,14782,1453],{"class":262},[145,14784,641],{"class":159},[145,14786,14725],{"class":262},[145,14788,752],{"class":258},[145,14790,779],{"class":159},[145,14792,412],{"class":262},[145,14794,14795,14797,14799,14801,14803,14806,14808,14810,14812,14814,14817,14819,14821,14823],{"class":147,"line":760},[145,14796,813],{"class":258},[145,14798,816],{"class":155},[145,14800,424],{"class":262},[145,14802,457],{"class":258},[145,14804,14805],{"class":159},"\"Task failed: ",[145,14807,577],{"class":155},[145,14809,11654],{"class":262},[145,14811,11657],{"class":159},[145,14813,290],{"class":262},[145,14815,14816],{"class":159},"'Unknown'",[145,14818,108],{"class":262},[145,14820,583],{"class":155},[145,14822,466],{"class":159},[145,14824,392],{"class":262},[145,14826,14827],{"class":147,"line":769},[145,14828,357],{"emptyLinePlaceholder":58},[145,14830,14831,14833,14835,14837,14840,14842,14844,14847,14849,14851,14853,14855,14857],{"class":147,"line":784},[145,14832,696],{"class":155},[145,14834,424],{"class":262},[145,14836,457],{"class":258},[145,14838,14839],{"class":159},"\"⏳ Progress: ",[145,14841,577],{"class":155},[145,14843,11654],{"class":262},[145,14845,14846],{"class":159},"'progress'",[145,14848,290],{"class":262},[145,14850,663],{"class":155},[145,14852,108],{"class":262},[145,14854,583],{"class":155},[145,14856,733],{"class":159},[145,14858,392],{"class":262},[145,14860,14861,14864,14866],{"class":147,"line":810},[145,14862,14863],{"class":262},"        time.sleep(",[145,14865,513],{"class":155},[145,14867,392],{"class":262},[11,14869,14870],{},"Ahora compara un prompt peligroso con su equivalente seguro — ambos logrando un resultado creativo similar:",[136,14872,14874],{"className":326,"code":14873,"language":328,"meta":141,"style":141},"# ❌ 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,14875,14876,14881,14890,14900,14909,14914,14919,14926,14936,14946,14956,14964,14968,14973,14977,14982,14991,15001,15010,15015,15020,15025,15030,15035,15042,15052,15062,15072,15080,15084,15088],{"__ignoreMap":141},[145,14877,14878],{"class":147,"line":148},[145,14879,14880],{"class":174},"# ❌ DANGEROUS — references copyrighted character and specific film\n",[145,14882,14883,14886,14888],{"class":147,"line":166},[145,14884,14885],{"class":262},"dangerous_payload ",[145,14887,266],{"class":258},[145,14889,445],{"class":262},[145,14891,14892,14894,14896,14898],{"class":147,"line":178},[145,14893,3485],{"class":159},[145,14895,454],{"class":262},[145,14897,1083],{"class":159},[145,14899,469],{"class":262},[145,14901,14902,14904,14906],{"class":147,"line":187},[145,14903,3496],{"class":159},[145,14905,454],{"class":262},[145,14907,14908],{"class":159},"\"Spider-Man swings between skyscrapers in New York City, \"\n",[145,14910,14911],{"class":147,"line":360},[145,14912,14913],{"class":159},"              \"wearing his classic red and blue suit. He shoots a web \"\n",[145,14915,14916],{"class":147,"line":366},[145,14917,14918],{"class":159},"              \"line and does a backflip, landing on a rooftop. \"\n",[145,14920,14921,14924],{"class":147,"line":378},[145,14922,14923],{"class":159},"              \"Marvel cinematic style, dramatic lighting.\"",[145,14925,469],{"class":262},[145,14927,14928,14930,14932,14934],{"class":147,"line":395},[145,14929,3508],{"class":159},[145,14931,454],{"class":262},[145,14933,513],{"class":155},[145,14935,469],{"class":262},[145,14937,14938,14940,14942,14944],{"class":147,"line":400},[145,14939,3520],{"class":159},[145,14941,454],{"class":262},[145,14943,1150],{"class":159},[145,14945,469],{"class":262},[145,14947,14948,14950,14952,14954],{"class":147,"line":415},[145,14949,3532],{"class":159},[145,14951,454],{"class":262},[145,14953,1167],{"class":159},[145,14955,469],{"class":262},[145,14957,14958,14960,14962],{"class":147,"line":432},[145,14959,3548],{"class":159},[145,14961,454],{"class":262},[145,14963,3553],{"class":155},[145,14965,14966],{"class":147,"line":437},[145,14967,486],{"class":262},[145,14969,14970],{"class":147,"line":448},[145,14971,14972],{"class":174},"# This will likely be rejected by copyright filters AND exposes you legally\n",[145,14974,14975],{"class":147,"line":472},[145,14976,357],{"emptyLinePlaceholder":58},[145,14978,14979],{"class":147,"line":483},[145,14980,14981],{"class":174},"# ✅ SAFE — original character, similar visual impact\n",[145,14983,14984,14987,14989],{"class":147,"line":489},[145,14985,14986],{"class":262},"safe_payload ",[145,14988,266],{"class":258},[145,14990,445],{"class":262},[145,14992,14993,14995,14997,14999],{"class":147,"line":494},[145,14994,3485],{"class":159},[145,14996,454],{"class":262},[145,14998,1083],{"class":159},[145,15000,469],{"class":262},[145,15002,15003,15005,15007],{"class":147,"line":499},[145,15004,3496],{"class":159},[145,15006,454],{"class":262},[145,15008,15009],{"class":159},"\"A masked vigilante in a sleek crimson and silver suit \"\n",[145,15011,15012],{"class":147,"line":519},[145,15013,15014],{"class":159},"              \"swings between futuristic skyscrapers using retractable \"\n",[145,15016,15017],{"class":147,"line":525},[145,15018,15019],{"class":159},"              \"grappling cables. Dynamic tracking shot follows the arc \"\n",[145,15021,15022],{"class":147,"line":536},[145,15023,15024],{"class":159},"              \"of movement as the figure performs an acrobatic flip \"\n",[145,15026,15027],{"class":147,"line":541},[145,15028,15029],{"class":159},"              \"mid-air and lands on a glass rooftop. Cinematic action \"\n",[145,15031,15032],{"class":147,"line":552},[145,15033,15034],{"class":159},"              \"sequence, golden hour lighting, anamorphic lens flare. \"\n",[145,15036,15037,15040],{"class":147,"line":563},[145,15038,15039],{"class":159},"              \"The city below is a mix of neon signs and steam vents.\"",[145,15041,469],{"class":262},[145,15043,15044,15046,15048,15050],{"class":147,"line":590},[145,15045,3508],{"class":159},[145,15047,454],{"class":262},[145,15049,513],{"class":155},[145,15051,469],{"class":262},[145,15053,15054,15056,15058,15060],{"class":147,"line":602},[145,15055,3520],{"class":159},[145,15057,454],{"class":262},[145,15059,1150],{"class":159},[145,15061,469],{"class":262},[145,15063,15064,15066,15068,15070],{"class":147,"line":608},[145,15065,3532],{"class":159},[145,15067,454],{"class":262},[145,15069,1167],{"class":159},[145,15071,469],{"class":262},[145,15073,15074,15076,15078],{"class":147,"line":614},[145,15075,3548],{"class":159},[145,15077,454],{"class":262},[145,15079,3553],{"class":155},[145,15081,15082],{"class":147,"line":625},[145,15083,486],{"class":262},[145,15085,15086],{"class":147,"line":630},[145,15087,357],{"emptyLinePlaceholder":58},[145,15089,15090,15092,15094],{"class":147,"line":647},[145,15091,12031],{"class":262},[145,15093,266],{"class":258},[145,15095,15096],{"class":262}," generate_video(safe_payload)\n",[11,15098,15099],{},"El prompt seguro produce video igualmente atractivo — diseno de personaje original, accion dinamica, calidad cinematografica — sin hacer referencia a ninguna propiedad protegida. El resultado es comercialmente utilizable porque es expresion creativa original.",[92,15101,15103],{"id":15102},"contenido-de-productos-y-marcas-usar-tus-propios-activos-de-forma-segura","Contenido de productos y marcas: usar tus propios activos de forma segura",[11,15105,15106,15107,2774,15109,15111],{},"Para videos de productos comerciales, el enfoque mas seguro y efectivo es referenciar tus propios activos a traves de las etiquetas de referencia ",[28,15108,3960],{},[28,15110,2773],{},". Esto produce contenido libre de problemas de derechos de autor por diseno:",[136,15113,15115],{"className":326,"code":15114,"language":328,"meta":141,"style":141},"# ✅ 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,15116,15117,15122,15131,15141,15150,15155,15160,15165,15170,15177,15189,15199,15209,15219,15228],{"__ignoreMap":141},[145,15118,15119],{"class":147,"line":148},[145,15120,15121],{"class":174},"# ✅ Product showcase using your own brand assets\n",[145,15123,15124,15127,15129],{"class":147,"line":166},[145,15125,15126],{"class":262},"product_payload ",[145,15128,266],{"class":258},[145,15130,445],{"class":262},[145,15132,15133,15135,15137,15139],{"class":147,"line":178},[145,15134,3485],{"class":159},[145,15136,454],{"class":262},[145,15138,1083],{"class":159},[145,15140,469],{"class":262},[145,15142,15143,15145,15147],{"class":147,"line":187},[145,15144,3496],{"class":159},[145,15146,454],{"class":262},[145,15148,15149],{"class":159},"\"@Image1 as the hero product. Cinematic product reveal: \"\n",[145,15151,15152],{"class":147,"line":360},[145,15153,15154],{"class":159},"              \"camera orbits slowly around the product on a clean white \"\n",[145,15156,15157],{"class":147,"line":366},[145,15158,15159],{"class":159},"              \"marble surface. Soft studio lighting with a single dramatic \"\n",[145,15161,15162],{"class":147,"line":378},[145,15163,15164],{"class":159},"              \"key light creating elegant shadows. Shallow depth of field. \"\n",[145,15166,15167],{"class":147,"line":395},[145,15168,15169],{"class":159},"              \"Premium commercial photography aesthetic. Camera movement: \"\n",[145,15171,15172,15175],{"class":147,"line":400},[145,15173,15174],{"class":159},"              \"smooth 180-degree orbit, then slow push-in to detail shot.\"",[145,15176,469],{"class":262},[145,15178,15179,15182,15184,15187],{"class":147,"line":415},[145,15180,15181],{"class":159},"    \"image_urls\"",[145,15183,10632],{"class":262},[145,15185,15186],{"class":159},"\"https://your-cdn.com/your-product-photo.jpg\"",[145,15188,10638],{"class":262},[145,15190,15191,15193,15195,15197],{"class":147,"line":432},[145,15192,3508],{"class":159},[145,15194,454],{"class":262},[145,15196,3513],{"class":155},[145,15198,469],{"class":262},[145,15200,15201,15203,15205,15207],{"class":147,"line":437},[145,15202,3520],{"class":159},[145,15204,454],{"class":262},[145,15206,3525],{"class":159},[145,15208,469],{"class":262},[145,15210,15211,15213,15215,15217],{"class":147,"line":448},[145,15212,3532],{"class":159},[145,15214,454],{"class":262},[145,15216,1167],{"class":159},[145,15218,469],{"class":262},[145,15220,15221,15223,15225],{"class":147,"line":472},[145,15222,3548],{"class":159},[145,15224,454],{"class":262},[145,15226,15227],{"class":155},"False\n",[145,15229,15230],{"class":147,"line":483},[145,15231,486],{"class":262},[11,15233,15234],{},[2434,15235,15236],{},"Usa la misma configuracion y funcion de polling del primer ejemplo anterior.",[11,15238,15239,15240,15242,15243,1580],{},"Para mas tecnicas de prompt engineering — incluyendo el formato de guion por tomas con descripciones basadas en tiempo y combinaciones avanzadas de ",[28,15241,13583],{}," — consulta nuestra completa ",[37,15244,15245],{"href":1578},"Guia de prompts de Seedance 2.0",[92,15247,15249],{"id":15248},"construir-una-capa-de-seguridad-de-prompts-en-tu-aplicacion","Construir una capa de seguridad de prompts en tu aplicacion",[11,15251,15252],{},"Si estas construyendo un producto que permite a tus usuarios generar contenido de video, considera implementar una verificacion de seguridad de prompts del lado del cliente antes de enviar solicitudes a la API:",[136,15254,15256],{"className":326,"code":15255,"language":328,"meta":141,"style":141},"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,15257,15258,15265,15269,15274,15283,15288,15315,15342,15364,15369,15396,15413,15418,15430,15435,15452,15456,15460,15469,15525,15567,15617,15621,15625,15644,15649,15659,15668,15672,15686,15697,15718,15722,15736,15748,15768,15772,15778,15798,15806,15816,15830,15834,15838,15843,15852,15857,15861,15868,15873,15878,15882,15890,15895,15899,15905],{"__ignoreMap":141},[145,15259,15260,15262],{"class":147,"line":148},[145,15261,335],{"class":258},[145,15263,15264],{"class":262}," re\n",[145,15266,15267],{"class":147,"line":166},[145,15268,357],{"emptyLinePlaceholder":58},[145,15270,15271],{"class":147,"line":178},[145,15272,15273],{"class":174},"# Basic copyright safety check — extend as needed\n",[145,15275,15276,15279,15281],{"class":147,"line":187},[145,15277,15278],{"class":155},"BLOCKED_TERMS",[145,15280,372],{"class":258},[145,15282,445],{"class":262},[145,15284,15285],{"class":147,"line":360},[145,15286,15287],{"class":174},"    # Characters\n",[145,15289,15290,15293,15295,15298,15300,15303,15305,15308,15310,15313],{"class":147,"line":366},[145,15291,15292],{"class":159},"    \"spider-man\"",[145,15294,290],{"class":262},[145,15296,15297],{"class":159},"\"spiderman\"",[145,15299,290],{"class":262},[145,15301,15302],{"class":159},"\"batman\"",[145,15304,290],{"class":262},[145,15306,15307],{"class":159},"\"superman\"",[145,15309,290],{"class":262},[145,15311,15312],{"class":159},"\"iron man\"",[145,15314,469],{"class":262},[145,15316,15317,15320,15322,15325,15327,15330,15332,15335,15337,15340],{"class":147,"line":378},[145,15318,15319],{"class":159},"    \"mickey mouse\"",[145,15321,290],{"class":262},[145,15323,15324],{"class":159},"\"elsa\"",[145,15326,290],{"class":262},[145,15328,15329],{"class":159},"\"buzz lightyear\"",[145,15331,290],{"class":262},[145,15333,15334],{"class":159},"\"pikachu\"",[145,15336,290],{"class":262},[145,15338,15339],{"class":159},"\"mario\"",[145,15341,469],{"class":262},[145,15343,15344,15347,15349,15352,15354,15357,15359,15362],{"class":147,"line":395},[145,15345,15346],{"class":159},"    \"harry potter\"",[145,15348,290],{"class":262},[145,15350,15351],{"class":159},"\"darth vader\"",[145,15353,290],{"class":262},[145,15355,15356],{"class":159},"\"baby yoda\"",[145,15358,290],{"class":262},[145,15360,15361],{"class":159},"\"grogu\"",[145,15363,469],{"class":262},[145,15365,15366],{"class":147,"line":400},[145,15367,15368],{"class":174},"    # Franchises\n",[145,15370,15371,15374,15376,15379,15381,15384,15386,15389,15391,15394],{"class":147,"line":415},[145,15372,15373],{"class":159},"    \"marvel\"",[145,15375,290],{"class":262},[145,15377,15378],{"class":159},"\"disney\"",[145,15380,290],{"class":262},[145,15382,15383],{"class":159},"\"pixar movie\"",[145,15385,290],{"class":262},[145,15387,15388],{"class":159},"\"star wars\"",[145,15390,290],{"class":262},[145,15392,15393],{"class":159},"\"pokemon\"",[145,15395,469],{"class":262},[145,15397,15398,15401,15403,15406,15408,15411],{"class":147,"line":432},[145,15399,15400],{"class":159},"    \"lord of the rings\"",[145,15402,290],{"class":262},[145,15404,15405],{"class":159},"\"game of thrones\"",[145,15407,290],{"class":262},[145,15409,15410],{"class":159},"\"hogwarts\"",[145,15412,469],{"class":262},[145,15414,15415],{"class":147,"line":437},[145,15416,15417],{"class":174},"    # Studios (when used to replicate their specific works)\n",[145,15419,15420,15423,15425,15428],{"class":147,"line":448},[145,15421,15422],{"class":159},"    \"studio ghibli film\"",[145,15424,290],{"class":262},[145,15426,15427],{"class":159},"\"dreamworks movie\"",[145,15429,469],{"class":262},[145,15431,15432],{"class":147,"line":472},[145,15433,15434],{"class":174},"    # Brands\n",[145,15436,15437,15440,15442,15445,15447,15450],{"class":147,"line":483},[145,15438,15439],{"class":159},"    \"nike swoosh\"",[145,15441,290],{"class":262},[145,15443,15444],{"class":159},"\"coca-cola\"",[145,15446,290],{"class":262},[145,15448,15449],{"class":159},"\"apple logo\"",[145,15451,469],{"class":262},[145,15453,15454],{"class":147,"line":489},[145,15455,486],{"class":262},[145,15457,15458],{"class":147,"line":494},[145,15459,357],{"emptyLinePlaceholder":58},[145,15461,15462,15465,15467],{"class":147,"line":499},[145,15463,15464],{"class":155},"BLOCKED_PATTERNS",[145,15466,372],{"class":258},[145,15468,8637],{"class":262},[145,15470,15471,15474,15476,15480,15483,15486,15488,15491,15493,15495,15498,15500,15502,15504,15506,15508,15511,15513,15516,15518,15520,15522],{"class":147,"line":519},[145,15472,15473],{"class":258},"    r",[145,15475,466],{"class":159},[145,15477,15479],{"class":15478},"sns5M","looks",[145,15481,15482],{"class":258},"?",[145,15484,15485],{"class":155},"\\s",[145,15487,5246],{"class":258},[145,15489,15490],{"class":15478},"like",[145,15492,15485],{"class":155},[145,15494,5246],{"class":258},[145,15496,15497],{"class":155},"\\w",[145,15499,5246],{"class":258},[145,15501,15485],{"class":155},[145,15503,5246],{"class":258},[145,15505,424],{"class":155},[145,15507,6531],{"class":15478},[145,15509,15510],{"class":258},"|",[145,15512,965],{"class":15478},[145,15514,15515],{"class":155},")\\s",[145,15517,5246],{"class":258},[145,15519,466],{"class":159},[145,15521,1235],{"class":262},[145,15523,15524],{"class":174},"# \"looks like X from Y\"\n",[145,15526,15527,15529,15531,15533,15536,15538,15541,15543,15545,15547,15549,15551,15553,15555,15557,15560,15562,15564],{"class":147,"line":525},[145,15528,15473],{"class":258},[145,15530,466],{"class":159},[145,15532,424],{"class":155},[145,15534,15535],{"class":15478},"scene",[145,15537,15510],{"class":258},[145,15539,15540],{"class":15478},"sequence",[145,15542,15515],{"class":155},[145,15544,5246],{"class":258},[145,15546,424],{"class":155},[145,15548,6531],{"class":15478},[145,15550,15510],{"class":258},[145,15552,965],{"class":15478},[145,15554,15515],{"class":155},[145,15556,5246],{"class":258},[145,15558,15559],{"class":155},"[A-Z]",[145,15561,466],{"class":159},[145,15563,1235],{"class":262},[145,15565,15566],{"class":174},"# \"scene from [Movie]\"\n",[145,15568,15569,15571,15573,15575,15577,15579,15582,15584,15586,15588,15590,15592,15595,15597,15599,15602,15604,15606,15608,15610,15612,15614],{"class":147,"line":536},[145,15570,15473],{"class":258},[145,15572,466],{"class":159},[145,15574,965],{"class":15478},[145,15576,15485],{"class":155},[145,15578,5246],{"class":258},[145,15580,15581],{"class":15478},"the",[145,15583,15485],{"class":155},[145,15585,5246],{"class":258},[145,15587,11008],{"class":15478},[145,15589,15485],{"class":155},[145,15591,5246],{"class":258},[145,15593,15594],{"class":15478},"of",[145,15596,15485],{"class":155},[145,15598,5246],{"class":258},[145,15600,15601],{"class":155},"[A-Z]\\w",[145,15603,5246],{"class":258},[145,15605,15485],{"class":155},[145,15607,5246],{"class":258},[145,15609,15559],{"class":155},[145,15611,466],{"class":159},[145,15613,1235],{"class":262},[145,15615,15616],{"class":174},"# \"in the style of [Studio Name]\"\n",[145,15618,15619],{"class":147,"line":541},[145,15620,644],{"class":262},[145,15622,15623],{"class":147,"line":552},[145,15624,357],{"emptyLinePlaceholder":58},[145,15626,15627,15629,15632,15635,15637,15640,15642],{"class":147,"line":563},[145,15628,502],{"class":258},[145,15630,15631],{"class":151}," check_prompt_safety",[145,15633,15634],{"class":262},"(prompt: ",[145,15636,8443],{"class":155},[145,15638,15639],{"class":262},") -> ",[145,15641,8568],{"class":155},[145,15643,412],{"class":262},[145,15645,15646],{"class":147,"line":590},[145,15647,15648],{"class":159},"    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n",[145,15650,15651,15654,15656],{"class":147,"line":602},[145,15652,15653],{"class":262},"    prompt_lower ",[145,15655,266],{"class":258},[145,15657,15658],{"class":262}," prompt.lower()\n",[145,15660,15661,15664,15666],{"class":147,"line":608},[145,15662,15663],{"class":262},"    issues ",[145,15665,266],{"class":258},[145,15667,5679],{"class":262},[145,15669,15670],{"class":147,"line":614},[145,15671,357],{"emptyLinePlaceholder":58},[145,15673,15674,15676,15679,15681,15684],{"class":147,"line":625},[145,15675,4938],{"class":258},[145,15677,15678],{"class":262}," term ",[145,15680,965],{"class":258},[145,15682,15683],{"class":155}," BLOCKED_TERMS",[145,15685,412],{"class":262},[145,15687,15688,15690,15692,15694],{"class":147,"line":630},[145,15689,746],{"class":258},[145,15691,15678],{"class":262},[145,15693,965],{"class":258},[145,15695,15696],{"class":262}," prompt_lower:\n",[145,15698,15699,15702,15704,15707,15709,15712,15714,15716],{"class":147,"line":647},[145,15700,15701],{"class":262},"            issues.append(",[145,15703,457],{"class":258},[145,15705,15706],{"class":159},"\"Blocked term found: '",[145,15708,577],{"class":155},[145,15710,15711],{"class":262},"term",[145,15713,583],{"class":155},[145,15715,5912],{"class":159},[145,15717,392],{"class":262},[145,15719,15720],{"class":147,"line":668},[145,15721,357],{"emptyLinePlaceholder":58},[145,15723,15724,15726,15729,15731,15734],{"class":147,"line":688},[145,15725,4938],{"class":258},[145,15727,15728],{"class":262}," pattern ",[145,15730,965],{"class":258},[145,15732,15733],{"class":155}," BLOCKED_PATTERNS",[145,15735,412],{"class":262},[145,15737,15738,15740,15743,15746],{"class":147,"line":693},[145,15739,746],{"class":258},[145,15741,15742],{"class":262}," re.search(pattern, prompt, re.",[145,15744,15745],{"class":155},"IGNORECASE",[145,15747,516],{"class":262},[145,15749,15750,15752,15754,15757,15759,15762,15764,15766],{"class":147,"line":738},[145,15751,15701],{"class":262},[145,15753,457],{"class":258},[145,15755,15756],{"class":159},"\"Risky pattern detected: ",[145,15758,577],{"class":155},[145,15760,15761],{"class":262},"pattern",[145,15763,583],{"class":155},[145,15765,466],{"class":159},[145,15767,392],{"class":262},[145,15769,15770],{"class":147,"line":743},[145,15771,357],{"emptyLinePlaceholder":58},[145,15773,15774,15776],{"class":147,"line":760},[145,15775,1512],{"class":258},[145,15777,445],{"class":262},[145,15779,15780,15783,15785,15788,15791,15793,15796],{"class":147,"line":769},[145,15781,15782],{"class":159},"        \"safe\"",[145,15784,454],{"class":262},[145,15786,15787],{"class":155},"len",[145,15789,15790],{"class":262},"(issues) ",[145,15792,752],{"class":258},[145,15794,15795],{"class":155}," 0",[145,15797,469],{"class":262},[145,15799,15800,15803],{"class":147,"line":784},[145,15801,15802],{"class":159},"        \"issues\"",[145,15804,15805],{"class":262},": issues,\n",[145,15807,15808,15811,15813],{"class":147,"line":810},[145,15809,15810],{"class":159},"        \"recommendation\"",[145,15812,454],{"class":262},[145,15814,15815],{"class":159},"\"Revise prompt to use original descriptions\"\n",[145,15817,15818,15821,15824,15827],{"class":147,"line":837},[145,15819,15820],{"class":258},"                          if",[145,15822,15823],{"class":262}," issues ",[145,15825,15826],{"class":258},"else",[145,15828,15829],{"class":159}," \"Prompt appears safe\"\n",[145,15831,15832],{"class":147,"line":842},[145,15833,1192],{"class":262},[145,15835,15836],{"class":147,"line":848},[145,15837,357],{"emptyLinePlaceholder":58},[145,15839,15840],{"class":147,"line":853},[145,15841,15842],{"class":174},"# Usage\n",[145,15844,15845,15847,15849],{"class":147,"line":858},[145,15846,12031],{"class":262},[145,15848,266],{"class":258},[145,15850,15851],{"class":262}," check_prompt_safety(\n",[145,15853,15854],{"class":147,"line":869},[145,15855,15856],{"class":159},"    \"A Spider-Man style hero swinging through New York\"\n",[145,15858,15859],{"class":147,"line":875},[145,15860,392],{"class":262},[145,15862,15863,15865],{"class":147,"line":900},[145,15864,6387],{"class":155},[145,15866,15867],{"class":262},"(result)\n",[145,15869,15870],{"class":147,"line":921},[145,15871,15872],{"class":174},"# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n",[145,15874,15875],{"class":147,"line":927},[145,15876,15877],{"class":174},"#  'recommendation': 'Revise prompt to use original descriptions'}\n",[145,15879,15880],{"class":147,"line":932},[145,15881,357],{"emptyLinePlaceholder":58},[145,15883,15884,15886,15888],{"class":147,"line":956},[145,15885,12031],{"class":262},[145,15887,266],{"class":258},[145,15889,15851],{"class":262},[145,15891,15892],{"class":147,"line":981},[145,15893,15894],{"class":159},"    \"A masked hero in crimson armor swings between futuristic towers\"\n",[145,15896,15897],{"class":147,"line":987},[145,15898,392],{"class":262},[145,15900,15901,15903],{"class":147,"line":992},[145,15902,6387],{"class":155},[145,15904,15867],{"class":262},[145,15906,15907],{"class":147,"line":1009},[145,15908,15909],{"class":174},"# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[11,15911,15912],{},[2434,15913,15914],{},"Este es un punto de partida basico. Un sistema de produccion deberia usar deteccion basada en NLP mas sofisticada, listas de bloqueo actualizadas regularmente y revision humana para casos limite.",[48,15916,15918],{"id":15917},"como-acceder-a-la-api-de-seedance-20-a-traves-de-evolink","Como acceder a la API de Seedance 2.0 a traves de EvoLink",[18,15920,15921],{},[11,15922,15923,15924,15927,15928,15931,15932,15935],{},"⚠️ ",[23,15925,15926],{},"Aviso importante:"," EvoLink es un gateway de API unificado para multiples modelos de generacion de video. EvoLink ",[23,15929,15930],{},"no"," actua como intermediario de cumplimiento y ",[23,15933,15934],{},"no garantiza"," el estatus de derechos de autor de los resultados de ningun modelo. El cumplimiento de derechos de autor es responsabilidad del desarrollador. EvoLink proporciona acceso e infraestructura — no proteccion legal.",[11,15937,15938],{},"Con eso claramente establecido, esto es lo que EvoLink ofrece a los desarrolladores que trabajan con Seedance 2.0.",[92,15940,15942],{"id":15941},"integracion-de-api-lista-ahora-activa-cuando-bytedance-lo-habilite","Integracion de API: lista ahora, activa cuando ByteDance lo habilite",[11,15944,15945],{},"EvoLink ha completado su adaptador de API para Seedance 2.0. El endpoint, los parametros y el formato de respuesta estan finalizados y documentados. Cuando ByteDance habilite oficialmente la API tras implementar sus medidas de proteccion de derechos de autor, tu integracion con EvoLink se activa inmediatamente — sin necesidad de cambios en el codigo.",[11,15947,15948,15949,323],{},"La integracion sigue la especificacion de la ",[37,15950,15953],{"href":15951,"rel":15952},"https://docs.evolink.ai/en/api-manual/video-series/seedance2.0/seedance-2.0-video-generate",[41],"API de generacion de video EvoLink Seedance 2.0",[136,15955,15957],{"className":326,"code":15956,"language":328,"meta":141,"style":141},"# 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,15958,15959,15964,15973,15983,15992,15997,16002,16007,16014,16024,16034,16044,16052,16056,16060],{"__ignoreMap":141},[145,15960,15961],{"class":147,"line":148},[145,15962,15963],{"class":174},"# Text-to-video: Seedance 2.0 via EvoLink\n",[145,15965,15966,15969,15971],{"class":147,"line":166},[145,15967,15968],{"class":262},"text_to_video ",[145,15970,266],{"class":258},[145,15972,445],{"class":262},[145,15974,15975,15977,15979,15981],{"class":147,"line":178},[145,15976,3485],{"class":159},[145,15978,454],{"class":262},[145,15980,1083],{"class":159},[145,15982,469],{"class":262},[145,15984,15985,15987,15989],{"class":147,"line":187},[145,15986,3496],{"class":159},[145,15988,454],{"class":262},[145,15990,15991],{"class":159},"\"A wise old cat in round spectacles sits at a cozy cafe \"\n",[145,15993,15994],{"class":147,"line":360},[145,15995,15996],{"class":159},"              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n",[145,15998,15999],{"class":147,"line":366},[145,16000,16001],{"class":159},"              \"curls upward. The cat speaks in a calm, measured tone. \"\n",[145,16003,16004],{"class":147,"line":378},[145,16005,16006],{"class":159},"              \"Warm afternoon light through the cafe window, Pixar-quality \"\n",[145,16008,16009,16012],{"class":147,"line":395},[145,16010,16011],{"class":159},"              \"3D animation, warm color palette, expressive character acting.\"",[145,16013,469],{"class":262},[145,16015,16016,16018,16020,16022],{"class":147,"line":400},[145,16017,3508],{"class":159},[145,16019,454],{"class":262},[145,16021,513],{"class":155},[145,16023,469],{"class":262},[145,16025,16026,16028,16030,16032],{"class":147,"line":415},[145,16027,3520],{"class":159},[145,16029,454],{"class":262},[145,16031,1150],{"class":159},[145,16033,469],{"class":262},[145,16035,16036,16038,16040,16042],{"class":147,"line":432},[145,16037,3532],{"class":159},[145,16039,454],{"class":262},[145,16041,1167],{"class":159},[145,16043,469],{"class":262},[145,16045,16046,16048,16050],{"class":147,"line":437},[145,16047,3548],{"class":159},[145,16049,454],{"class":262},[145,16051,3553],{"class":155},[145,16053,16054],{"class":147,"line":448},[145,16055,486],{"class":262},[145,16057,16058],{"class":147,"line":472},[145,16059,357],{"emptyLinePlaceholder":58},[145,16061,16062,16064,16066],{"class":147,"line":483},[145,16063,12031],{"class":262},[145,16065,266],{"class":258},[145,16067,16068],{"class":262}," generate_video(text_to_video)\n",[11,16070,16071],{},[2434,16072,16073],{},"Usa la misma configuracion y funcion de polling del primer ejemplo de codigo.",[92,16075,16077],{"id":16076},"generacion-multimodal-completa-imagenes-videos-audio","Generacion multimodal completa: imagenes + videos + audio",[11,16079,16080,16081,16083],{},"La caracteristica destacada de Seedance 2.0 es su sistema multimodal ",[28,16082,13583],{}," — la capacidad de combinar entradas de imagen, video y audio como referencias creativas dentro de una sola solicitud de generacion. A traves de EvoLink, todas las modalidades de entrada estan completamente soportadas:",[136,16085,16087],{"className":326,"code":16086,"language":328,"meta":141,"style":141},"# 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,16088,16089,16094,16103,16113,16122,16127,16132,16137,16142,16149,16155,16160,16165,16172,16177,16181,16188,16193,16197,16208,16218,16228,16236,16240,16244],{"__ignoreMap":141},[145,16090,16091],{"class":147,"line":148},[145,16092,16093],{"class":174},"# Multimodal generation — character ref + camera ref + audio sync\n",[145,16095,16096,16099,16101],{"class":147,"line":166},[145,16097,16098],{"class":262},"multimodal_payload ",[145,16100,266],{"class":258},[145,16102,445],{"class":262},[145,16104,16105,16107,16109,16111],{"class":147,"line":178},[145,16106,3485],{"class":159},[145,16108,454],{"class":262},[145,16110,1083],{"class":159},[145,16112,469],{"class":262},[145,16114,16115,16117,16119],{"class":147,"line":187},[145,16116,3496],{"class":159},[145,16118,454],{"class":262},[145,16120,16121],{"class":159},"\"@Image1 as character reference — dancer in athletic wear. \"\n",[145,16123,16124],{"class":147,"line":360},[145,16125,16126],{"class":159},"              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n",[145,16128,16129],{"class":147,"line":366},[145,16130,16131],{"class":159},"              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n",[145,16133,16134],{"class":147,"line":378},[145,16135,16136],{"class":159},"              \"and motion energy to the beat. The dancer performs energetically \"\n",[145,16138,16139],{"class":147,"line":395},[145,16140,16141],{"class":159},"              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n",[145,16143,16144,16147],{"class":147,"line":400},[145,16145,16146],{"class":159},"              \"with the rhythm. Smoke effects catch the colored lighting.\"",[145,16148,469],{"class":262},[145,16150,16151,16153],{"class":147,"line":415},[145,16152,15181],{"class":159},[145,16154,2506],{"class":262},[145,16156,16157],{"class":147,"line":432},[145,16158,16159],{"class":159},"        \"https://your-cdn.com/character-design.png\"\n",[145,16161,16162],{"class":147,"line":437},[145,16163,16164],{"class":262},"    ],\n",[145,16166,16167,16170],{"class":147,"line":448},[145,16168,16169],{"class":159},"    \"video_urls\"",[145,16171,2506],{"class":262},[145,16173,16174],{"class":147,"line":472},[145,16175,16176],{"class":159},"        \"https://your-cdn.com/camera-reference.mp4\"\n",[145,16178,16179],{"class":147,"line":483},[145,16180,16164],{"class":262},[145,16182,16183,16186],{"class":147,"line":489},[145,16184,16185],{"class":159},"    \"audio_urls\"",[145,16187,2506],{"class":262},[145,16189,16190],{"class":147,"line":494},[145,16191,16192],{"class":159},"        \"https://your-cdn.com/background-track.mp3\"\n",[145,16194,16195],{"class":147,"line":499},[145,16196,16164],{"class":262},[145,16198,16199,16201,16203,16206],{"class":147,"line":519},[145,16200,3508],{"class":159},[145,16202,454],{"class":262},[145,16204,16205],{"class":155},"12",[145,16207,469],{"class":262},[145,16209,16210,16212,16214,16216],{"class":147,"line":525},[145,16211,3520],{"class":159},[145,16213,454],{"class":262},[145,16215,1150],{"class":159},[145,16217,469],{"class":262},[145,16219,16220,16222,16224,16226],{"class":147,"line":536},[145,16221,3532],{"class":159},[145,16223,454],{"class":262},[145,16225,1167],{"class":159},[145,16227,469],{"class":262},[145,16229,16230,16232,16234],{"class":147,"line":541},[145,16231,3548],{"class":159},[145,16233,454],{"class":262},[145,16235,3553],{"class":155},[145,16237,16238],{"class":147,"line":552},[145,16239,486],{"class":262},[145,16241,16242],{"class":147,"line":563},[145,16243,357],{"emptyLinePlaceholder":58},[145,16245,16246,16248,16250],{"class":147,"line":590},[145,16247,12031],{"class":262},[145,16249,266],{"class":258},[145,16251,16252],{"class":262}," generate_video(multimodal_payload)\n",[11,16254,16255],{},[2434,16256,16073],{},[14165,16258,16259,16264,16267],{"style":14167},[11,16260,16261],{},[23,16262,16263],{},"Empieza con la API de generacion de video de EvoLink",[11,16265,16266],{},"Nivel gratuito disponible. Una clave API, multiples modelos. Integracion con Seedance 2.0 lista — se activa en el momento en que ByteDance abra el acceso.",[11,16268,16269],{},[37,16270,16272],{"href":16271},"/early-access","Obtén tu clave API gratuita →",[92,16274,16276],{"id":16275},"referencia-completa-de-parametros-de-la-api","Referencia completa de parametros de la API",[11,16278,16279],{},"Aqui esta el conjunto completo de parametros soportados a traves de EvoLink para Seedance 2.0:",[1849,16281,16282,16297],{},[1852,16283,16284],{},[1855,16285,16286,16289,16291,16294],{},[1858,16287,16288],{},"Parametro",[1858,16290,3218],{},[1858,16292,16293],{"align":13606},"Requerido",[1858,16295,16296],{},"Descripcion",[1865,16298,16299,16313,16333,16348,16363,16378,16391,16410,16437,16450],{},[1855,16300,16301,16305,16307,16309],{},[1870,16302,16303],{},[28,16304,1559],{},[1870,16306,3238],{},[1870,16308,13646],{"align":13606},[1870,16310,16311],{},[28,16312,1083],{},[1855,16314,16315,16319,16321,16323],{},[1870,16316,16317],{},[28,16318,1574],{},[1870,16320,3238],{},[1870,16322,13646],{"align":13606},[1870,16324,16325,16326,290,16328,290,16330],{},"Hasta 2000 tokens. Soporta referencias ",[28,16327,2722],{},[28,16329,11211],{},[28,16331,16332],{},"@Audio1",[1855,16334,16335,16339,16343,16345],{},[1870,16336,16337],{},[28,16338,2710],{},[1870,16340,3238,16341],{},[145,16342],{},[1870,16344,3241],{"align":13606},[1870,16346,16347],{},"Hasta 9 imagenes, max 30MB cada una. Formatos: jpeg, png, webp, bmp, tiff, gif",[1855,16349,16350,16354,16358,16360],{},[1870,16351,16352],{},[28,16353,3382],{},[1870,16355,3238,16356],{},[145,16357],{},[1870,16359,3241],{"align":13606},[1870,16361,16362],{},"Hasta 3 videos, total 2-15s, max 50MB cada uno. Formatos: mp4, mov",[1855,16364,16365,16369,16373,16375],{},[1870,16366,16367],{},[28,16368,3399],{},[1870,16370,3238,16371],{},[145,16372],{},[1870,16374,3241],{"align":13606},[1870,16376,16377],{},"Hasta 3 pistas de audio, total ≤15s, max 15MB cada una. Formatos: mp3, wav",[1855,16379,16380,16384,16386,16388],{},[1870,16381,16382],{},[28,16383,1587],{},[1870,16385,3273],{},[1870,16387,3241],{"align":13606},[1870,16389,16390],{},"4-15 segundos (por defecto: 5)",[1855,16392,16393,16397,16399,16401],{},[1870,16394,16395],{},[28,16396,1595],{},[1870,16398,3238],{},[1870,16400,3241],{"align":13606},[1870,16402,16403,290,16405,16407,16408],{},[28,16404,3829],{},[28,16406,1150],{}," (por defecto), ",[28,16409,3525],{},[1855,16411,16412,16416,16418,16420],{},[1870,16413,16414],{},[28,16415,1615],{},[1870,16417,3238],{},[1870,16419,3241],{"align":13606},[1870,16421,16422,16407,16424,290,16426,290,16428,290,16430,290,16432,290,16434],{},[28,16423,1167],{},[28,16425,3537],{},[28,16427,5943],{},[28,16429,5948],{},[28,16431,5953],{},[28,16433,3649],{},[28,16435,16436],{},"\"adaptive\"",[1855,16438,16439,16443,16445,16447],{},[1870,16440,16441],{},[28,16442,1635],{},[1870,16444,3345],{},[1870,16446,3241],{"align":13606},[1870,16448,16449],{},"Habilitar generacion de audio sincronizado (por defecto: true)",[1855,16451,16452,16456,16458,16460],{},[1870,16453,16454],{},[28,16455,3416],{},[1870,16457,3238],{},[1870,16459,3241],{"align":13606},[1870,16461,16462],{},"URL de webhook HTTPS para notificacion de finalizacion de tarea",[11,16464,16465,16468],{},[23,16466,16467],{},"Limites de entrada:"," Maximo 12 archivos en total entre todas las modalidades. Las subidas de rostros humanos realistas se rechazan automaticamente. Todas las URLs deben ser directamente accesibles por el servidor.",[11,16470,16471,16474,16475,16480,16481,16483],{},[23,16472,16473],{},"Flujo de tareas:"," La API devuelve un ID de tarea inmediatamente. Consulta el ",[37,16476,16479],{"href":16477,"rel":16478},"https://docs.evolink.ai/en/api-manual/task-management/get-task-detail",[41],"endpoint de estado de tarea"," o usa el webhook ",[28,16482,3416],{}," para recibir notificaciones de finalizacion. Las URLs de video generadas son validas durante 24 horas — descargalas y almacenalas oportunamente.",[92,16485,16487],{"id":16486},"failover-multimodelo-manten-tu-pipeline-funcionando-durante-el-retraso","Failover multimodelo: manten tu pipeline funcionando durante el retraso",[11,16489,16490],{},"Aqui es donde la arquitectura de API unificada de EvoLink ofrece un valor concreto durante el retraso de Seedance 2.0 por derechos de autor. En lugar de construir y mantener integraciones separadas para cada modelo, implementas failover automatico con una sola ruta de codigo:",[136,16492,16494],{"className":326,"code":16493,"language":328,"meta":141,"style":141},"# 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,16495,16496,16501,16510,16520,16530,16540,16551,16555,16559,16582,16599,16604,16613,16627,16633,16642,16650,16657,16665,16673,16681,16689,16694,16703,16724,16730,16740,16753,16783,16787,16791,16815,16819,16824,16833,16843,16848,16853,16860,16871,16882,16893,16902],{"__ignoreMap":141},[145,16497,16498],{"class":147,"line":148},[145,16499,16500],{"class":174},"# Multi-model failover — your pipeline never stops\n",[145,16502,16503,16506,16508],{"class":147,"line":166},[145,16504,16505],{"class":155},"MODEL_PRIORITY",[145,16507,372],{"class":258},[145,16509,8637],{"class":262},[145,16511,16512,16515,16517],{"class":147,"line":178},[145,16513,16514],{"class":159},"    \"seedance-2.0\"",[145,16516,1235],{"class":262},[145,16518,16519],{"class":174},"# Preferred: best multimodal capabilities\n",[145,16521,16522,16525,16527],{"class":147,"line":187},[145,16523,16524],{"class":159},"    \"kling\"",[145,16526,1086],{"class":262},[145,16528,16529],{"class":174},"# Fallback 1: strong motion quality\n",[145,16531,16532,16535,16537],{"class":147,"line":360},[145,16533,16534],{"class":159},"    \"veo-2\"",[145,16536,1086],{"class":262},[145,16538,16539],{"class":174},"# Fallback 2: high visual fidelity\n",[145,16541,16542,16545,16548],{"class":147,"line":366},[145,16543,16544],{"class":159},"    \"sora\"",[145,16546,16547],{"class":262},",           ",[145,16549,16550],{"class":174},"# Fallback 3: robust safety, good adherence\n",[145,16552,16553],{"class":147,"line":378},[145,16554,644],{"class":262},[145,16556,16557],{"class":147,"line":395},[145,16558,357],{"emptyLinePlaceholder":58},[145,16560,16561,16563,16566,16569,16571,16573,16576,16578,16580],{"class":147,"line":400},[145,16562,502],{"class":258},[145,16564,16565],{"class":151}," generate_with_failover",[145,16567,16568],{"class":262},"(prompt, duration",[145,16570,266],{"class":258},[145,16572,513],{"class":155},[145,16574,16575],{"class":262},", quality",[145,16577,266],{"class":258},[145,16579,1150],{"class":159},[145,16581,469],{"class":262},[145,16583,16584,16587,16589,16591,16593,16596],{"class":147,"line":415},[145,16585,16586],{"class":262},"                           aspect_ratio",[145,16588,266],{"class":258},[145,16590,1167],{"class":159},[145,16592,290],{"class":262},[145,16594,16595],{"class":258},"**",[145,16597,16598],{"class":262},"kwargs):\n",[145,16600,16601],{"class":147,"line":432},[145,16602,16603],{"class":159},"    \"\"\"Try models in priority order. First success wins.\"\"\"\n",[145,16605,16606,16608,16610],{"class":147,"line":437},[145,16607,5674],{"class":262},[145,16609,266],{"class":258},[145,16611,16612],{"class":262}," {}\n",[145,16614,16615,16617,16620,16622,16625],{"class":147,"line":448},[145,16616,4938],{"class":258},[145,16618,16619],{"class":262}," model ",[145,16621,965],{"class":258},[145,16623,16624],{"class":155}," MODEL_PRIORITY",[145,16626,412],{"class":262},[145,16628,16629,16631],{"class":147,"line":472},[145,16630,4954],{"class":258},[145,16632,412],{"class":262},[145,16634,16635,16638,16640],{"class":147,"line":483},[145,16636,16637],{"class":262},"            payload ",[145,16639,266],{"class":258},[145,16641,445],{"class":262},[145,16643,16644,16647],{"class":147,"line":489},[145,16645,16646],{"class":159},"                \"model\"",[145,16648,16649],{"class":262},": model,\n",[145,16651,16652,16655],{"class":147,"line":494},[145,16653,16654],{"class":159},"                \"prompt\"",[145,16656,8261],{"class":262},[145,16658,16659,16662],{"class":147,"line":499},[145,16660,16661],{"class":159},"                \"duration\"",[145,16663,16664],{"class":262},": duration,\n",[145,16666,16667,16670],{"class":147,"line":519},[145,16668,16669],{"class":159},"                \"quality\"",[145,16671,16672],{"class":262},": quality,\n",[145,16674,16675,16678],{"class":147,"line":525},[145,16676,16677],{"class":159},"                \"aspect_ratio\"",[145,16679,16680],{"class":262},": aspect_ratio,\n",[145,16682,16683,16686],{"class":147,"line":536},[145,16684,16685],{"class":258},"                **",[145,16687,16688],{"class":262},"kwargs\n",[145,16690,16691],{"class":147,"line":541},[145,16692,16693],{"class":262},"            }\n",[145,16695,16696,16698,16700],{"class":147,"line":552},[145,16697,8343],{"class":262},[145,16699,266],{"class":258},[145,16701,16702],{"class":262}," generate_video(payload)\n",[145,16704,16705,16707,16709,16711,16714,16716,16718,16720,16722],{"class":147,"line":563},[145,16706,5392],{"class":155},[145,16708,424],{"class":262},[145,16710,457],{"class":258},[145,16712,16713],{"class":159},"\"✅ Generated with: ",[145,16715,577],{"class":155},[145,16717,1559],{"class":262},[145,16719,583],{"class":155},[145,16721,466],{"class":159},[145,16723,392],{"class":262},[145,16725,16726,16728],{"class":147,"line":590},[145,16727,763],{"class":258},[145,16729,1515],{"class":262},[145,16731,16732,16734,16736,16738],{"class":147,"line":602},[145,16733,5352],{"class":258},[145,16735,816],{"class":155},[145,16737,6870],{"class":258},[145,16739,5462],{"class":262},[145,16741,16742,16745,16747,16750],{"class":147,"line":608},[145,16743,16744],{"class":262},"            errors[model] ",[145,16746,266],{"class":258},[145,16748,16749],{"class":155}," str",[145,16751,16752],{"class":262},"(e)\n",[145,16754,16755,16757,16759,16761,16764,16766,16768,16770,16773,16775,16777,16779,16781],{"class":147,"line":614},[145,16756,5392],{"class":155},[145,16758,424],{"class":262},[145,16760,457],{"class":258},[145,16762,16763],{"class":159},"\"⚠️ ",[145,16765,577],{"class":155},[145,16767,1559],{"class":262},[145,16769,583],{"class":155},[145,16771,16772],{"class":159}," unavailable: ",[145,16774,577],{"class":155},[145,16776,5509],{"class":262},[145,16778,583],{"class":155},[145,16780,466],{"class":159},[145,16782,392],{"class":262},[145,16784,16785],{"class":147,"line":625},[145,16786,5446],{"class":258},[145,16788,16789],{"class":147,"line":630},[145,16790,357],{"emptyLinePlaceholder":58},[145,16792,16793,16795,16797,16799,16801,16804,16806,16809,16811,16813],{"class":147,"line":647},[145,16794,418],{"class":258},[145,16796,816],{"class":155},[145,16798,424],{"class":262},[145,16800,457],{"class":258},[145,16802,16803],{"class":159},"\"All models failed: ",[145,16805,577],{"class":155},[145,16807,16808],{"class":262},"errors",[145,16810,583],{"class":155},[145,16812,466],{"class":159},[145,16814,392],{"class":262},[145,16816,16817],{"class":147,"line":668},[145,16818,357],{"emptyLinePlaceholder":58},[145,16820,16821],{"class":147,"line":688},[145,16822,16823],{"class":174},"# Your application code stays the same regardless of model availability\n",[145,16825,16826,16828,16830],{"class":147,"line":693},[145,16827,12031],{"class":262},[145,16829,266],{"class":258},[145,16831,16832],{"class":262}," generate_with_failover(\n",[145,16834,16835,16838,16840],{"class":147,"line":738},[145,16836,16837],{"class":593},"    prompt",[145,16839,266],{"class":258},[145,16841,16842],{"class":159},"\"Cinematic drone shot over a mountain lake at sunrise. \"\n",[145,16844,16845],{"class":147,"line":743},[145,16846,16847],{"class":159},"           \"Mist rises from the water surface. Golden light breaks \"\n",[145,16849,16850],{"class":147,"line":760},[145,16851,16852],{"class":159},"           \"through clouds and reflects off the still water. \"\n",[145,16854,16855,16858],{"class":147,"line":769},[145,16856,16857],{"class":159},"           \"Slow, majestic camera movement.\"",[145,16859,469],{"class":262},[145,16861,16862,16865,16867,16869],{"class":147,"line":784},[145,16863,16864],{"class":593},"    duration",[145,16866,266],{"class":258},[145,16868,513],{"class":155},[145,16870,469],{"class":262},[145,16872,16873,16876,16878,16880],{"class":147,"line":810},[145,16874,16875],{"class":593},"    quality",[145,16877,266],{"class":258},[145,16879,1150],{"class":159},[145,16881,469],{"class":262},[145,16883,16884,16887,16889,16891],{"class":147,"line":837},[145,16885,16886],{"class":593},"    aspect_ratio",[145,16888,266],{"class":258},[145,16890,1167],{"class":159},[145,16892,469],{"class":262},[145,16894,16895,16898,16900],{"class":147,"line":842},[145,16896,16897],{"class":593},"    generate_audio",[145,16899,266],{"class":258},[145,16901,3553],{"class":155},[145,16903,16904],{"class":147,"line":848},[145,16905,392],{"class":262},[11,16907,16908],{},[2434,16909,16073],{},[11,16911,16912],{},"Mientras Seedance 2.0 sigue retrasado, tu pipeline genera video a traves de Kling, Veo o Sora mediante el mismo endpoint de EvoLink. En el momento en que Seedance vuelva a estar en linea, se integra en la lista de prioridades — sin migracion, sin cambios de codigo, sin tiempo de inactividad.",[11,16914,16915],{},"Esto no se trata solo del retraso actual. La disponibilidad de modelos es inherentemente impredecible — limites de velocidad, ventanas de mantenimiento, cambios de politica y, si, acciones legales pueden dejar fuera de linea a cualquier modelo en cualquier momento. Construir de forma agnostica al modelo desde el primer dia es una decision estrategica que rinde dividendos cada vez que el panorama cambia.",[11,16917,16918,16919,1580],{},"Para la documentacion completa de la API incluyendo gestion de tareas, webhooks, manejo de errores y ejemplos de SDK en Python, Node.js y cURL, consulta la ",[37,16920,16921],{"href":14180},"documentacion de la API de generacion de video de EvoLink",[48,16923,13096],{"id":8835},[92,16925,16927],{"id":16926},"la-api-de-seedance-20-sigue-en-camino-de-lanzarse","La API de Seedance 2.0 sigue en camino de lanzarse?",[11,16929,16930,16931,16935,16936,16940],{},"Si, pero la cronologia es incierta. ByteDance retraso el lanzamiento originalmente planeado para el 24 de febrero de 2026 para implementar medidas de proteccion de derechos de autor que incluyen deteccion facial, bloqueo de personajes protegidos y marca de agua digital (",[37,16932,16934],{"href":13468,"rel":16933},[41],"Chosun, 22/2","; ",[37,16937,16939],{"href":13441,"rel":16938},[41],"Hacker News, 21/2","). No se ha anunciado publicamente una fecha de lanzamiento de reemplazo. El retraso durara hasta que la implementacion de medidas de proteccion de ByteDance satisfaga tanto a su propio equipo legal como, presumiblemente, aborde las preocupaciones centrales planteadas en la carta de cese y desistimiento de la MPA. Las estimaciones realistas van de semanas a meses.",[92,16942,16943],{"id":8966},"Puedo usar Seedance 2.0 para proyectos comerciales?",[11,16945,16946,16947,16951],{},"Depende enteramente de lo que generes. El contenido creado a partir de prompts originales que describen personajes y escenas originales — sin hacer referencia a propiedades protegidas, personas reales o marcas registradas — conlleva el menor riesgo legal. El contenido que replica deliberada o negligentemente PI existente conlleva un riesgo significativo, y esto es cierto independientemente del modelo de IA que lo genere. Cuando la API se lance, revisa cuidadosamente los Terminos de Servicio de Seedance 2.0 para disposiciones especificas de uso comercial, y consulta con abogados de propiedad intelectual para proyectos comerciales de alto impacto o amplia distribucion. Consulta la ",[37,16948,16950],{"href":16949},"#lista-de-verificacion-de-cumplimiento-empresarial","lista de verificacion de cumplimiento"," anterior para un marco practico.",[92,16953,16955],{"id":16954},"se-eliminaran-mis-videos-existentes-de-seedance","Se eliminaran mis videos existentes de Seedance?",[11,16957,16958],{},"No hay indicios de que ByteDance planee eliminar retroactivamente contenido ya generado a traves de la interfaz web de Seedance 2.0. Las cartas de cese y desistimiento de la MPA apuntan a las practicas de ByteDance como plataforma — no a usuarios individuales ni a sus resultados. Sin embargo, si has generado y publicado contenido con personajes protegidos reconocibles o personas reales, podrias enfrentar solicitudes de eliminacion separadas (notificaciones DMCA o equivalentes) directamente de los titulares de derechos. Ese riesgo existe independientemente de la herramienta de generacion utilizada.",[92,16960,16962],{"id":16961},"como-maneja-evolink-el-cumplimiento-de-derechos-de-autor","Como maneja EvoLink el cumplimiento de derechos de autor?",[11,16964,16965,16966,16968],{},"EvoLink es un gateway de API unificado — proporciona acceso a multiples modelos de generacion de video a traves de un unico punto de integracion. EvoLink ",[23,16967,15930],{}," filtra, modera ni valida el estatus de derechos de autor de los prompts o los resultados generados. El cumplimiento de derechos de autor es enteramente responsabilidad del desarrollador. Lo que EvoLink si proporciona es flexibilidad de infraestructura: si las politicas de contenido, la disponibilidad o la situacion legal de un modelo no satisfacen tus necesidades, puedes cambiar a otro modelo a traves de la misma API sin modificar tu codigo. Esta diversidad de modelos en si misma es una estrategia practica de mitigacion de riesgos — nunca dependes de la disponibilidad o las decisiones de politica de un solo modelo.",[92,16970,16972],{"id":16971},"que-alternativas-existen-si-la-api-de-seedance-sigue-retrasada","Que alternativas existen si la API de Seedance sigue retrasada?",[11,16974,16975],{},"A traves de la API unificada de EvoLink, puedes acceder a varias alternativas listas para produccion usando el mismo codigo de integracion que usarias para Seedance:",[1849,16977,16978,16993],{},[1852,16979,16980],{},[1855,16981,16982,16985,16988,16990],{},[1858,16983,16984],{},"Modelo",[1858,16986,16987],{},"Fortalezas",[1858,16989,13619],{},[1858,16991,16992],{},"Ideal para",[1865,16994,16995,17010,17026,17041],{},[1855,16996,16997,17001,17004,17007],{},[1870,16998,16999],{},[23,17000,13692],{},[1870,17002,17003],{},"Calidad de movimiento solida, consistencia de personajes",[1870,17005,17006],{},"Filtrado moderado",[1870,17008,17009],{},"Accion, animacion de personajes",[1855,17011,17012,17017,17020,17023],{},[1870,17013,17014],{},[23,17015,17016],{},"Veo 2",[1870,17018,17019],{},"Alta fidelidad visual, infraestructura de seguridad de Google",[1870,17021,17022],{},"Filtrado estricto",[1870,17024,17025],{},"Calidad premium, contenido seguro para marcas",[1855,17027,17028,17033,17036,17038],{},[1870,17029,17030],{},[23,17031,17032],{},"Sora",[1870,17034,17035],{},"Fuerte adherencia al prompt, stack de seguridad de OpenAI",[1870,17037,17022],{},[1870,17039,17040],{},"Contenido narrativo, direccion precisa",[1855,17042,17043,17047,17050,17052],{},[1870,17044,17045],{},[23,17046,13675],{},[1870,17048,17049],{},"Ecosistema establecido, buen movimiento",[1870,17051,17006],{},[1870,17053,17054],{},"Proposito general, iteracion rapida",[11,17056,17057,17058,17061],{},"Cada modelo tiene diferentes fortalezas, politicas de contenido, precios y disponibilidad. La arquitectura multimodelo de EvoLink te permite evaluar todos ellos sin construir integraciones separadas. El ejemplo de codigo de failover anterior muestra como cambiar automaticamente entre modelos segun la disponibilidad. Consulta la ",[37,17059,17060],{"href":14180},"documentacion de la API de generacion de video"," para parametros especificos de cada modelo y comparaciones de capacidades.",[45,17063],{},[48,17065,17067],{"id":17066},"que-viene-despues","Que viene despues",[11,17069,17070],{},"La situacion de derechos de autor de Seedance 2.0 esta evolucionando activamente. Las medidas de proteccion que ByteDance implemente redefiniran lo que la API puede y no puede generar. Los precedentes legales que se estan estableciendo en respuesta a la generacion de video con IA afectaran a todas las plataformas en este espacio, no solo a Seedance.",[11,17072,17073],{},"Para los desarrolladores, el camino practico a seguir es claro:",[70,17075,17076,17082,17088,17094,17100],{},[73,17077,17078,17081],{},[23,17079,17080],{},"Construye de forma agnostica al modelo."," No apuestes tu pipeline de produccion a la disponibilidad o el estatus legal de un solo modelo. Usa una API unificada que te permita cambiar de modelo sin cambios de codigo.",[73,17083,17084,17087],{},[23,17085,17086],{},"Usa prompts seguros."," Descripciones originales, personajes originales, tus propios activos de referencia. El contenido que es mas seguro legalmente tambien es el contenido con mas valor comercial — porque es tuyo.",[73,17089,17090,17093],{},[23,17091,17092],{},"Mantente informado."," El panorama legal en torno al contenido generado por IA cambia mensualmente. Sigue los desarrollos del caso MPA vs. ByteDance y los casos mas amplios de derechos de autor e IA que avanzan en los tribunales.",[73,17095,17096,17099],{},[23,17097,17098],{},"Documenta todo."," Manten registros de tus prompts, parametros, intencion creativa y procesos de revision. Los esfuerzos de cumplimiento de buena fe importan si surgen preguntas.",[73,17101,17102,17105],{},[23,17103,17104],{},"No entres en panico."," El mundo no se acaba. La generacion de video con IA es una capacidad transformadora, y los marcos legales evolucionaran para acomodarla. Quienes construyen de forma responsable ahora estaran bien posicionados cuando las reglas se consoliden.",[11,17107,17108],{},"Actualizaremos esta guia a medida que la situacion se desarrolle. Guardala en marcadores y vuelve a consultarla cuando surjan novedades.",[14165,17110,17111,17116,17119],{"style":14167},[11,17112,17113],{},[23,17114,17115],{},"Construye con confianza usando multiples modelos de video con IA",[11,17117,17118],{},"EvoLink te ofrece una sola API para Seedance 2.0, Kling, Veo, Sora y mas. Empieza gratis — cambia de modelo cuando quieras, sin dependencia.",[11,17120,17121],{},[37,17122,16272],{"href":16271},[11,17124,17125],{},[2434,17126,17127],{},"Ultima actualizacion: 23 de febrero de 2026. Este articulo se actualizara a medida que evolucione la situacion de derechos de autor de Seedance 2.0.",[11008,17129,17130],{},"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":141,"searchDepth":166,"depth":166,"links":17132},[17133,17138,17144,17149,17154,17162,17168,17175],{"id":13304,"depth":166,"text":13305,"children":17134},[17135,17136,17137],{"id":13314,"depth":178,"text":13315},{"id":13362,"depth":178,"text":13363},{"id":13474,"depth":178,"text":13475},{"id":13521,"depth":166,"text":13522,"children":17139},[17140,17141,17142,17143],{"id":13528,"depth":178,"text":13529},{"id":13546,"depth":178,"text":13547},{"id":13590,"depth":178,"text":13591},{"id":13726,"depth":178,"text":13727},{"id":13742,"depth":166,"text":13743,"children":17145},[17146,17147,17148],{"id":13749,"depth":178,"text":13750},{"id":13794,"depth":178,"text":13795},{"id":13828,"depth":178,"text":13829},{"id":13896,"depth":166,"text":13897,"children":17150},[17151,17152,17153],{"id":13909,"depth":178,"text":13910},{"id":13958,"depth":178,"text":13959},{"id":14062,"depth":178,"text":14063},{"id":14184,"depth":166,"text":14185,"children":17155},[17156,17157,17158,17159,17160,17161],{"id":14197,"depth":178,"text":14198},{"id":14309,"depth":178,"text":14310},{"id":14386,"depth":178,"text":14387},{"id":14439,"depth":178,"text":14440},{"id":15102,"depth":178,"text":15103},{"id":15248,"depth":178,"text":15249},{"id":15917,"depth":166,"text":15918,"children":17163},[17164,17165,17166,17167],{"id":15941,"depth":178,"text":15942},{"id":16076,"depth":178,"text":16077},{"id":16275,"depth":178,"text":16276},{"id":16486,"depth":178,"text":16487},{"id":8835,"depth":166,"text":13096,"children":17169},[17170,17171,17172,17173,17174],{"id":16926,"depth":178,"text":16927},{"id":8966,"depth":178,"text":16943},{"id":16954,"depth":178,"text":16955},{"id":16961,"depth":178,"text":16962},{"id":16971,"depth":178,"text":16972},{"id":17066,"depth":166,"text":17067},"Carta de cese y desistimiento de la MPA, retraso del API y lo que significa para tu proyecto. Guia completa para usar la API de Seedance 2.0 de forma segura en generacion de video comercial.",{"date":17178,"image":17179,"seoTitle":17180,"author":17181},"2026-02-23","/copyright-guide-hero.webp","Guia de derechos de autor de Seedance 2.0 para desarrolladores de API (2026)","EvoLink Team","/es/blog/seedance-2-copyright-api-guide",{"title":13293,"description":17176},"es/blog/seedance-2-copyright-api-guide","bxRsWDvh54c_kmM6u0ArhVvV-QnoocC9DaSQsvlZA5A",{"id":17187,"title":17188,"body":17189,"description":22904,"extension":11069,"meta":22905,"navigation":58,"path":22909,"seo":22910,"stem":22911,"__hash__":22912},"content/es/blog/seedance-2-ecommerce-product-videos.md","Crea videos de producto con IA para e-commerce con Seedance 2.0 API",{"type":8,"value":17190,"toc":22853},[17191,17200,17204,17219,17222,17316,17319,17322,17325,17329,17332,17335,17339,17351,17354,17366,17369,17372,17915,17923,17929,17940,17947,17953,17957,17960,17965,17968,18081,18084,18098,18104,18110,18116,18120,18178,18181,18185,18188,18194,18200,18206,18212,18219,18222,18226,18229,18234,18351,18354,18358,18364,18370,18376,18382,18388,18394,18397,18401,18404,18430,18433,18440,18444,18447,18456,18586,18589,18594,18602,18612,18616,18699,18702,18706,18715,18718,18732,18740,18750,18754,18757,18884,18888,18891,18923,18927,18933,18939,18945,18951,18957,18963,18969,18975,18981,18985,18988,19115,19118,19122,19125,19131,19137,19143,19146,19152,19156,19159,19162,19166,19169,19195,19198,19201,19205,19208,19340,19344,19347,19791,19794,19797,19801,19804,19807,19811,19814,19846,19852,19856,19859,19862,19899,19905,21721,21724,21728,21738,21826,21829,21833,21878,21882,21885,21895,21904,21910,21916,21920,21925,22675,22682,22686,22689,22692,22718,22721,22723,22727,22736,22740,22743,22747,22753,22757,22760,22764,22767,22771,22774,22778,22792,22796,22805,22809,22812,22815,22818,22821,22824,22831,22833,22851],[11,17192,17193,17194,17199],{},"Cada producto de su catálogo merece un video. Una sola foto de producto ahora puede convertirse en un anuncio en video profesional en menos de tres minutos. Sin equipo de grabación, sin alquiler de estudio, sin plazos de posproducción. ",[37,17195,17198],{"href":17196,"rel":17197},"https://seed.bytedance.com/en/seedance2_0",[41],"Seedance 2.0"," — el último modelo de generación de video de ByteDance — convierte imágenes estáticas de productos en clips listos para transmitir mediante una simple llamada a la API. Esta guía le muestra cinco tipos distintos de video para e-commerce, un pipeline por lotes para catálogos completos y estrategias de exportación multiplataforma. Todos los ejemplos de código son Python listo para producción.",[48,17201,17203],{"id":17202},"por-qué-el-video-de-producto-importa-y-por-qué-los-estudios-son-obsoletos","Por qué el video de producto importa (y por qué los estudios son obsoletos)",[11,17205,17206,17207,17212,17213,17218],{},"Los listados de productos con video superan consistentemente a los que no lo tienen. Según las ",[37,17208,17211],{"href":17209,"rel":17210},"https://www.shopify.com/blog/product-photography-tips",[41],"mejores prácticas de medios de producto de Shopify",", los comerciantes que agregan video a las páginas de producto obtienen un engagement y tasas de conversión mediblemente superiores. Las propias ",[37,17214,17217],{"href":17215,"rel":17216},"https://sellercentral.amazon.com/help/hub/reference/G202124160",[41],"directrices para vendedores de Amazon"," ahora fomentan activamente el video en cada listado, y su programa A+ Content prioriza las páginas mejoradas con video en los resultados de búsqueda.",[11,17220,17221],{},"La brecha entre \"saber que el video funciona\" y \"realmente producir video\" ha sido históricamente enorme. Una sola sesión de grabación de video de producto — incluyendo tiempo de estudio, iluminación, equipo, un videógrafo y edición básica — típicamente cuesta entre $500 y $2,000 por SKU. Para un catálogo de 200 productos, eso son seis cifras antes de haber subido un solo archivo.",[1849,17223,17224,17236],{},[1852,17225,17226],{},[1855,17227,17228,17230,17233],{},[1858,17229],{},[1858,17231,17232],{},"Estudio Tradicional",[1858,17234,17235],{},"Seedance 2.0 API",[1865,17237,17238,17251,17264,17277,17290,17303],{},[1855,17239,17240,17245,17248],{},[1870,17241,17242],{},[23,17243,17244],{},"Costo por video",[1870,17246,17247],{},"$500–$2,000",[1870,17249,17250],{},"$0.02–$0.15",[1855,17252,17253,17258,17261],{},[1870,17254,17255],{},[23,17256,17257],{},"Tiempo de entrega",[1870,17259,17260],{},"3–10 días hábiles",[1870,17262,17263],{},"60–180 segundos",[1855,17265,17266,17271,17274],{},[1870,17267,17268],{},[23,17269,17270],{},"Configuración necesaria",[1870,17272,17273],{},"Estudio, equipo, personal",[1870,17275,17276],{},"Una foto de producto",[1855,17278,17279,17284,17287],{},[1870,17280,17281],{},[23,17282,17283],{},"Escalar a 500 SKUs",[1870,17285,17286],{},"$250K–$1M+",[1870,17288,17289],{},"Menos de $75",[1855,17291,17292,17297,17300],{},[1870,17293,17294],{},[23,17295,17296],{},"Velocidad de iteración",[1870,17298,17299],{},"Se requiere nueva grabación",[1870,17301,17302],{},"Cambie el prompt, regenere",[1855,17304,17305,17310,17313],{},[1870,17306,17307],{},[23,17308,17309],{},"Variantes de relación de aspecto",[1870,17311,17312],{},"Ediciones separadas por formato",[1870,17314,17315],{},"Un cambio de parámetro",[11,17317,17318],{},"La economía no es comparable. La generación de video de producto con IA no reemplaza un film de marca de $50,000 — reemplaza el trabajo repetitivo de video por SKU que la mayoría de los equipos de e-commerce omiten por completo o subcontratan con márgenes dolorosos.",[11,17320,17321],{},"Considere las cifras para una tienda Shopify de tamaño medio con 300 SKUs. Video de estudio tradicional para el catálogo completo: $150K–$600K, más meses de programación y producción. Seedance 2.0 API para el mismo catálogo: menos de $50 en total, completado en una sola tarde. Incluso si se tiene en cuenta el tiempo del desarrollador para configurar el pipeline, el retorno de inversión es órdenes de magnitud superior.",[11,17323,17324],{},"El cambio refleja lo que sucedió con la fotografía de producto hace una década. Los estudios no desaparecieron, pero el trabajo rutinario se trasladó a soluciones automatizadas. El video sigue la misma trayectoria, solo que más rápido.",[92,17326,17328],{"id":17327},"el-argumento-de-conversión-del-video","El argumento de conversión del video",[11,17330,17331],{},"Los informes de la industria muestran consistentemente que las páginas de producto con video superan a las que no lo tienen. La propia investigación de Shopify destaca que el video aumenta el tiempo en página y reduce las tasas de devolución al ayudar a los clientes a comprender lo que están comprando. Amazon reporta que los listados con video obtienen mayores tasas de clics en los resultados de búsqueda.",[11,17333,17334],{},"Los números específicos varían según categoría y mercado, pero la dirección es inequívoca: el video vende más producto. La pregunta nunca ha sido si el video funciona. La pregunta ha sido si el ROI justifica el costo de producción. Con los precios de la API, ese cálculo está resuelto.",[48,17336,17338],{"id":17337},"configuración-clave-api-y-código-base","Configuración: clave API y código base",[11,17340,17341,17342,17345,17346,17350],{},"Necesita una cuenta de ",[37,17343,213],{"href":211,"rel":17344},[41]," y una clave API. EvoLink proporciona acceso a Seedance 2.0 con una API REST sencilla. Si aún no ha configurado una cuenta, siga la ",[37,17347,17349],{"href":17348},"/docs/getting-started","guía de inicio"," para un tutorial paso a paso.",[11,17352,17353],{},"Instale la única dependencia:",[136,17355,17356],{"className":138,"code":11376,"language":140,"meta":141,"style":141},[28,17357,17358],{"__ignoreMap":141},[145,17359,17360,17362,17364],{"class":147,"line":148},[145,17361,190],{"class":151},[145,17363,193],{"class":159},[145,17365,352],{"class":159},[11,17367,17368],{},"No se requiere GPU. Sin descarga de modelos. Sin infraestructura que gestionar. La API maneja toda la computación del lado del servidor. Su máquina local solo envía solicitudes HTTP y recibe URLs de video.",[11,17370,17371],{},"Aquí está el código base completo. Cada ejemplo en esta guía se construye sobre esta base:",[136,17373,17375],{"className":326,"code":17374,"language":328,"meta":141,"style":141},"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,17376,17377,17383,17389,17393,17402,17410,17414,17423,17439,17447,17451,17455,17459,17476,17481,17489,17501,17510,17518,17522,17526,17532,17536,17540,17578,17583,17591,17601,17636,17640,17648,17660,17664,17676,17706,17712,17724,17756,17760,17789,17793,17801,17805,17837,17841,17845,17862,17867,17875,17887,17908],{"__ignoreMap":141},[145,17378,17379,17381],{"class":147,"line":148},[145,17380,335],{"class":258},[145,17382,352],{"class":262},[145,17384,17385,17387],{"class":147,"line":166},[145,17386,335],{"class":258},[145,17388,345],{"class":262},[145,17390,17391],{"class":147,"line":178},[145,17392,357],{"emptyLinePlaceholder":58},[145,17394,17395,17397,17399],{"class":147,"line":187},[145,17396,381],{"class":155},[145,17398,372],{"class":258},[145,17400,17401],{"class":159}," \"YOUR_API_KEY\"\n",[145,17403,17404,17406,17408],{"class":147,"line":360},[145,17405,369],{"class":155},[145,17407,372],{"class":258},[145,17409,9077],{"class":159},[145,17411,17412],{"class":147,"line":366},[145,17413,357],{"emptyLinePlaceholder":58},[145,17415,17416,17419,17421],{"class":147,"line":378},[145,17417,17418],{"class":262},"headers ",[145,17420,266],{"class":258},[145,17422,445],{"class":262},[145,17424,17425,17427,17429,17431,17433,17435,17437],{"class":147,"line":395},[145,17426,451],{"class":159},[145,17428,454],{"class":262},[145,17430,457],{"class":258},[145,17432,460],{"class":159},[145,17434,463],{"class":155},[145,17436,466],{"class":159},[145,17438,469],{"class":262},[145,17440,17441,17443,17445],{"class":147,"line":400},[145,17442,475],{"class":159},[145,17444,454],{"class":262},[145,17446,480],{"class":159},[145,17448,17449],{"class":147,"line":415},[145,17450,486],{"class":262},[145,17452,17453],{"class":147,"line":432},[145,17454,357],{"emptyLinePlaceholder":58},[145,17456,17457],{"class":147,"line":437},[145,17458,357],{"emptyLinePlaceholder":58},[145,17460,17461,17463,17465,17468,17470,17472,17474],{"class":147,"line":448},[145,17462,502],{"class":258},[145,17464,14531],{"class":151},[145,17466,17467],{"class":262},"(payload: ",[145,17469,8568],{"class":155},[145,17471,15639],{"class":262},[145,17473,8568],{"class":155},[145,17475,412],{"class":262},[145,17477,17478],{"class":147,"line":472},[145,17479,17480],{"class":159},"    \"\"\"Submit a video generation request and return the task response.\"\"\"\n",[145,17482,17483,17485,17487],{"class":147,"line":483},[145,17484,903],{"class":262},[145,17486,266],{"class":258},[145,17488,1219],{"class":262},[145,17490,17491,17493,17495,17497,17499],{"class":147,"line":489},[145,17492,1225],{"class":258},[145,17494,466],{"class":159},[145,17496,571],{"class":155},[145,17498,1232],{"class":159},[145,17500,469],{"class":262},[145,17502,17503,17505,17507],{"class":147,"line":494},[145,17504,1244],{"class":593},[145,17506,266],{"class":258},[145,17508,17509],{"class":262},"headers,\n",[145,17511,17512,17514,17516],{"class":147,"line":499},[145,17513,1260],{"class":593},[145,17515,266],{"class":258},[145,17517,2603],{"class":262},[145,17519,17520],{"class":147,"line":519},[145,17521,1274],{"class":262},[145,17523,17524],{"class":147,"line":525},[145,17525,924],{"class":262},[145,17527,17528,17530],{"class":147,"line":536},[145,17529,1512],{"class":258},[145,17531,622],{"class":262},[145,17533,17534],{"class":147,"line":541},[145,17535,357],{"emptyLinePlaceholder":58},[145,17537,17538],{"class":147,"line":552},[145,17539,357],{"emptyLinePlaceholder":58},[145,17541,17542,17544,17546,17549,17551,17554,17557,17559,17562,17565,17567,17569,17572,17574,17576],{"class":147,"line":563},[145,17543,502],{"class":258},[145,17545,505],{"class":151},[145,17547,17548],{"class":262},"(task_id: ",[145,17550,8443],{"class":155},[145,17552,17553],{"class":262},", poll_interval: ",[145,17555,17556],{"class":155},"int",[145,17558,372],{"class":258},[145,17560,17561],{"class":155}," 5",[145,17563,17564],{"class":262},", timeout: ",[145,17566,17556],{"class":155},[145,17568,372],{"class":258},[145,17570,17571],{"class":155}," 300",[145,17573,15639],{"class":262},[145,17575,8568],{"class":155},[145,17577,412],{"class":262},[145,17579,17580],{"class":147,"line":590},[145,17581,17582],{"class":159},"    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n",[145,17584,17585,17587,17589],{"class":147,"line":602},[145,17586,9158],{"class":262},[145,17588,266],{"class":258},[145,17590,9163],{"class":155},[145,17592,17593,17595,17597,17599],{"class":147,"line":608},[145,17594,544],{"class":258},[145,17596,9170],{"class":262},[145,17598,5784],{"class":258},[145,17600,9175],{"class":262},[145,17602,17603,17605,17607,17610,17612,17614,17616,17618,17620,17622,17624,17626,17628,17631,17633],{"class":147,"line":614},[145,17604,6733],{"class":262},[145,17606,266],{"class":258},[145,17608,17609],{"class":262}," requests.get(",[145,17611,457],{"class":258},[145,17613,466],{"class":159},[145,17615,571],{"class":155},[145,17617,574],{"class":159},[145,17619,577],{"class":155},[145,17621,580],{"class":262},[145,17623,583],{"class":155},[145,17625,466],{"class":159},[145,17627,290],{"class":262},[145,17629,17630],{"class":593},"headers",[145,17632,266],{"class":258},[145,17634,17635],{"class":262},"headers)\n",[145,17637,17638],{"class":147,"line":625},[145,17639,6761],{"class":262},[145,17641,17642,17644,17646],{"class":147,"line":630},[145,17643,617],{"class":262},[145,17645,266],{"class":258},[145,17647,11560],{"class":262},[145,17649,17650,17652,17654,17656,17658],{"class":147,"line":647},[145,17651,633],{"class":262},[145,17653,266],{"class":258},[145,17655,655],{"class":262},[145,17657,641],{"class":159},[145,17659,392],{"class":262},[145,17661,17662],{"class":147,"line":668},[145,17663,357],{"emptyLinePlaceholder":58},[145,17665,17666,17668,17670,17672,17674],{"class":147,"line":688},[145,17667,746],{"class":258},[145,17669,749],{"class":262},[145,17671,752],{"class":258},[145,17673,755],{"class":159},[145,17675,412],{"class":262},[145,17677,17678,17680,17682,17684,17686,17688,17690,17693,17695,17698,17700,17702,17704],{"class":147,"line":693},[145,17679,5392],{"class":155},[145,17681,424],{"class":262},[145,17683,457],{"class":258},[145,17685,14760],{"class":159},[145,17687,577],{"class":155},[145,17689,1325],{"class":262},[145,17691,17692],{"class":159},"'output'",[145,17694,1359],{"class":262},[145,17696,17697],{"class":159},"'video_url'",[145,17699,1331],{"class":262},[145,17701,583],{"class":155},[145,17703,466],{"class":159},[145,17705,392],{"class":262},[145,17707,17708,17710],{"class":147,"line":738},[145,17709,763],{"class":258},[145,17711,766],{"class":262},[145,17713,17714,17716,17718,17720,17722],{"class":147,"line":743},[145,17715,772],{"class":258},[145,17717,749],{"class":262},[145,17719,752],{"class":258},[145,17721,779],{"class":159},[145,17723,412],{"class":262},[145,17725,17726,17728,17730,17732,17734,17736,17738,17741,17743,17745,17748,17750,17752,17754],{"class":147,"line":760},[145,17727,813],{"class":258},[145,17729,5569],{"class":155},[145,17731,424],{"class":262},[145,17733,457],{"class":258},[145,17735,14805],{"class":159},[145,17737,577],{"class":155},[145,17739,17740],{"class":262},"task.get(",[145,17742,11657],{"class":159},[145,17744,290],{"class":262},[145,17746,17747],{"class":159},"'Unknown error'",[145,17749,108],{"class":262},[145,17751,583],{"class":155},[145,17753,466],{"class":159},[145,17755,392],{"class":262},[145,17757,17758],{"class":147,"line":769},[145,17759,357],{"emptyLinePlaceholder":58},[145,17761,17762,17764,17766,17768,17771,17773,17775,17777,17779,17781,17783,17785,17787],{"class":147,"line":784},[145,17763,696],{"class":155},[145,17765,424],{"class":262},[145,17767,457],{"class":258},[145,17769,17770],{"class":159},"\"⏳ Status: ",[145,17772,577],{"class":155},[145,17774,718],{"class":262},[145,17776,583],{"class":155},[145,17778,114],{"class":159},[145,17780,577],{"class":155},[145,17782,708],{"class":262},[145,17784,583],{"class":155},[145,17786,11703],{"class":159},[145,17788,392],{"class":262},[145,17790,17791],{"class":147,"line":810},[145,17792,845],{"class":262},[145,17794,17795,17797,17799],{"class":147,"line":837},[145,17796,671],{"class":262},[145,17798,9364],{"class":258},[145,17800,9367],{"class":262},[145,17802,17803],{"class":147,"line":842},[145,17804,357],{"emptyLinePlaceholder":58},[145,17806,17807,17809,17811,17813,17815,17818,17820,17822,17824,17827,17829,17831,17833,17835],{"class":147,"line":848},[145,17808,418],{"class":258},[145,17810,9374],{"class":155},[145,17812,424],{"class":262},[145,17814,457],{"class":258},[145,17816,17817],{"class":159},"\"Task ",[145,17819,577],{"class":155},[145,17821,580],{"class":262},[145,17823,583],{"class":155},[145,17825,17826],{"class":159}," did not complete within ",[145,17828,577],{"class":155},[145,17830,6749],{"class":262},[145,17832,583],{"class":155},[145,17834,1369],{"class":159},[145,17836,392],{"class":262},[145,17838,17839],{"class":147,"line":853},[145,17840,357],{"emptyLinePlaceholder":58},[145,17842,17843],{"class":147,"line":858},[145,17844,357],{"emptyLinePlaceholder":58},[145,17846,17847,17849,17852,17854,17856,17858,17860],{"class":147,"line":869},[145,17848,502],{"class":258},[145,17850,17851],{"class":151}," create_and_wait",[145,17853,17467],{"class":262},[145,17855,8568],{"class":155},[145,17857,15639],{"class":262},[145,17859,8568],{"class":155},[145,17861,412],{"class":262},[145,17863,17864],{"class":147,"line":875},[145,17865,17866],{"class":159},"    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n",[145,17868,17869,17871,17873],{"class":147,"line":900},[145,17870,1289],{"class":262},[145,17872,266],{"class":258},[145,17874,16702],{"class":262},[145,17876,17877,17879,17881,17883,17885],{"class":147,"line":921},[145,17878,7023],{"class":262},[145,17880,266],{"class":258},[145,17882,638],{"class":262},[145,17884,7476],{"class":159},[145,17886,644],{"class":262},[145,17888,17889,17891,17893,17895,17898,17900,17902,17904,17906],{"class":147,"line":927},[145,17890,878],{"class":155},[145,17892,424],{"class":262},[145,17894,457],{"class":258},[145,17896,17897],{"class":159},"\"🎬 Task created: ",[145,17899,577],{"class":155},[145,17901,580],{"class":262},[145,17903,583],{"class":155},[145,17905,466],{"class":159},[145,17907,392],{"class":262},[145,17909,17910,17912],{"class":147,"line":932},[145,17911,1512],{"class":258},[145,17913,17914],{"class":262}," wait_for_video(task_id)\n",[18,17916,17917],{},[11,17918,17919,17922],{},[23,17920,17921],{},"Todos los siguientes ejemplos de código utilizan esta misma configuración."," Solo mostraremos el payload único para cada tipo de video.",[11,17924,1990,17925,17928],{},[28,17926,17927],{},"create_and_wait"," maneja el ciclo de vida completo: enviar el trabajo, consultar hasta que se complete y devolver la URL del video. Las URLs de video expiran después de 24 horas, así que descárguelas rápidamente o canalícelas directamente a su sistema de gestión de activos.",[11,17930,17931,17932,17934,17935,17939],{},"El enfoque de polling funciona bien para scripts interactivos y lotes pequeños. Para pipelines de producción que procesan cientos de productos, el parámetro ",[28,17933,3416],{}," (cubierto en la ",[37,17936,17938],{"href":17937},"#pipeline-por-lotes-del-cat%C3%A1logo-csv-a-la-biblioteca-de-videos","sección de pipeline por lotes",") elimina por completo la sobrecarga del polling.",[11,17941,17942,17943,17946],{},"Cada ejemplo de código a continuación llama a ",[28,17944,17945],{},"create_and_wait(payload)"," con un diccionario de payload diferente. El código de configuración anterior es el único código base que necesita.",[11,17948,17949],{},[37,17950,17952],{"href":211,"rel":17951},[41],"Obtenga su clave API gratuita de EvoLink →",[48,17954,17956],{"id":17955},"tipo-de-video-1-rotación-de-producto-360","Tipo de video 1: Rotación de producto 360°",[11,17958,17959],{},"La rotación tipo turntable es el caballo de batalla del video de e-commerce. Una foto de producto con fondo blanco se convierte en una exhibición rotativa fluida — el tipo de clip que antes requería una plataforma giratoria motorizada e iluminación cuidadosa. Este formato funciona en todas partes: listados de Amazon, páginas de producto de Shopify y anuncios en redes sociales.",[56,17961,60,17962],{"controls":58,"playsInline":58,"style":59},[62,17963],{"src":17964,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%89%8B%E8%A1%A8%E5%B9%BF%E5%91%8A.mp4",[11,17966,17967],{},"Este es el payload para la rotación de un reloj de lujo:",[136,17969,17971],{"className":326,"code":17970,"language":328,"meta":141,"style":141},"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,17972,17973,17981,17991,17997,18002,18006,18012,18017,18022,18027,18032,18036,18046,18056,18064,18068,18072],{"__ignoreMap":141},[145,17974,17975,17977,17979],{"class":147,"line":148},[145,17976,3476],{"class":262},[145,17978,266],{"class":258},[145,17980,445],{"class":262},[145,17982,17983,17985,17987,17989],{"class":147,"line":166},[145,17984,3485],{"class":159},[145,17986,454],{"class":262},[145,17988,1083],{"class":159},[145,17990,469],{"class":262},[145,17992,17993,17995],{"class":147,"line":178},[145,17994,15181],{"class":159},[145,17996,2506],{"class":262},[145,17998,17999],{"class":147,"line":187},[145,18000,18001],{"class":159},"        \"https://your-cdn.com/products/watch-front.jpg\"\n",[145,18003,18004],{"class":147,"line":360},[145,18005,16164],{"class":262},[145,18007,18008,18010],{"class":147,"line":366},[145,18009,3496],{"class":159},[145,18011,1098],{"class":262},[145,18013,18014],{"class":147,"line":378},[145,18015,18016],{"class":159},"        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n",[145,18018,18019],{"class":147,"line":395},[145,18020,18021],{"class":159},"        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n",[145,18023,18024],{"class":147,"line":400},[145,18025,18026],{"class":159},"        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n",[145,18028,18029],{"class":147,"line":415},[145,18030,18031],{"class":159},"        \"Premium advertisement quality.\"\n",[145,18033,18034],{"class":147,"line":432},[145,18035,3620],{"class":262},[145,18037,18038,18040,18042,18044],{"class":147,"line":437},[145,18039,3508],{"class":159},[145,18041,454],{"class":262},[145,18043,3513],{"class":155},[145,18045,469],{"class":262},[145,18047,18048,18050,18052,18054],{"class":147,"line":448},[145,18049,3520],{"class":159},[145,18051,454],{"class":262},[145,18053,3525],{"class":159},[145,18055,469],{"class":262},[145,18057,18058,18060,18062],{"class":147,"line":472},[145,18059,3532],{"class":159},[145,18061,454],{"class":262},[145,18063,2545],{"class":159},[145,18065,18066],{"class":147,"line":483},[145,18067,486],{"class":262},[145,18069,18070],{"class":147,"line":489},[145,18071,357],{"emptyLinePlaceholder":58},[145,18073,18074,18076,18078],{"class":147,"line":494},[145,18075,12031],{"class":262},[145,18077,266],{"class":258},[145,18079,18080],{"class":262}," create_and_wait(payload)\n",[11,18082,18083],{},"La estructura del prompt importa. Divídala en capas para obtener resultados consistentes con cualquier producto:",[11,18085,18086,18089,18090,18093,18094,18097],{},[23,18087,18088],{},"Capa 1 — Identificación del sujeto."," Comience con ",[28,18091,18092],{},"@Image1 is a [producto]."," Esto ancla el modelo a su imagen fuente. Consulte la ",[37,18095,18096],{"href":2781},"guía de @tags"," para más detalles sobre cómo Seedance 2.0 interpreta las referencias de imagen.",[11,18099,18100,18103],{},[23,18101,18102],{},"Capa 2 — Descripción del movimiento."," \"Rotates slowly\" es mejor que \"spins\" — implica velocidad consistente. Agregue \"smooth turntable rotation\" o \"360-degree rotation\" para reforzar el patrón de movimiento.",[11,18105,18106,18109],{},[23,18107,18108],{},"Capa 3 — Iluminación y entorno."," Términos de iluminación de estudio a los que el modelo responde bien: \"dramatic studio lighting,\" \"soft diffused light,\" \"rim lighting,\" \"three-point lighting setup.\" La elección del fondo — superficie reflectante oscura, ciclorama blanco, fondo degradado — establece el tono por completo.",[11,18111,18112,18115],{},[23,18113,18114],{},"Capa 4 — Modificador de calidad."," Termine con una señal de calidad: \"premium advertisement quality,\" \"commercial-grade,\" o \"4K product showcase.\" Estos términos empujan al modelo hacia una salida más limpia y pulida.",[92,18117,18119],{"id":18118},"consejos-para-rotación","Consejos para rotación",[1849,18121,18122,18134],{},[1852,18123,18124],{},[1855,18125,18126,18128,18131],{},[1858,18127,3215],{},[1858,18129,18130],{},"Recomendado",[1858,18132,18133],{},"Por qué",[1865,18135,18136,18147,18158,18167],{},[1855,18137,18138,18141,18144],{},[1870,18139,18140],{},"Duración",[1870,18142,18143],{},"6–10s",[1870,18145,18146],{},"La rotación completa necesita al menos 6s para no verse apresurada",[1855,18148,18149,18152,18155],{},[1870,18150,18151],{},"Relación de aspecto",[1870,18153,18154],{},"16:9 o 1:1",[1870,18156,18157],{},"16:9 para web/Amazon, 1:1 para feeds sociales",[1855,18159,18160,18162,18164],{},[1870,18161,3879],{},[1870,18163,1607],{},[1870,18165,18166],{},"Siempre 1080p para contenido de producto",[1855,18168,18169,18172,18175],{},[1870,18170,18171],{},"Fondo en el prompt",[1870,18173,18174],{},"Reflectante oscuro o blanco",[1870,18176,18177],{},"Coincida con la estética de su página de producto",[11,18179,18180],{},"Para productos con detalles intrincados — joyería, relojes, electrónicos — aumente la duración a 10 segundos. Los fotogramas adicionales permiten al modelo renderizar detalles de superficie durante la rotación sin artefactos de desenfoque de movimiento.",[92,18182,18184],{"id":18183},"estrategias-de-fondo-para-videos-de-rotación","Estrategias de fondo para videos de rotación",[11,18186,18187],{},"El fondo de su imagen fuente afecta significativamente la salida. Así es como manejar los escenarios comunes:",[11,18189,18190,18193],{},[23,18191,18192],{},"Fondo blanco (ideal)."," Las fotos estándar de producto de e-commerce sobre blanco funcionan perfectamente. El modelo preserva el producto y genera un movimiento de rotación limpio. Puede mantener el fondo blanco o describir uno diferente en el prompt.",[11,18195,18196,18199],{},[23,18197,18198],{},"Fondo transparente (PNG)."," También excelente. El modelo rellena el fondo según la descripción de su prompt, dándole control total sobre el aspecto final.",[11,18201,18202,18205],{},[23,18203,18204],{},"Fondo desordenado o de estilo de vida."," Funcional pero menos predecible. El modelo puede incorporar elementos no deseados del fondo en la rotación. Para mejores resultados, describa el fondo deseado explícitamente: \"on a clean white surface\" u \"on a dark gradient background.\"",[11,18207,18208,18211],{},[23,18209,18210],{},"Foto de estudio con fondo controlado."," Gran punto de partida. Si su foto existente ya tiene iluminación profesional, el modelo extiende esa calidad de iluminación al video.",[11,18213,18214,18215,18218],{},"Si su foto fuente tiene un fondo desordenado, describa el fondo deseado explícitamente en el prompt. Seedance 2.0 puede recontextualizar el producto sobre una superficie limpia. Para mejores resultados, comience con una foto de producto con fondo blanco o fondo transparente. Lea más sobre los ",[37,18216,18217],{"href":3196},"fundamentos de imagen a video"," para mejores prácticas de imagen fuente.",[11,18220,18221],{},"Pruebe esto con su propia foto de producto — resultados en menos de 3 minutos.",[48,18223,18225],{"id":18224},"tipo-de-video-2-toma-heroica-tráiler-de-lanzamiento-de-producto","Tipo de video 2: Toma heroica (Tráiler de lanzamiento de producto)",[11,18227,18228],{},"Los tráilers de lanzamiento crean anticipación. Son el momento de revelación cinematográfica — humo, haces de luz, ángulos dramáticos — comprimidos en unos pocos segundos. Este formato domina los anuncios en redes sociales y las secciones hero de landing pages donde las primeras impresiones impulsan las tasas de clics.",[56,18230,60,18231],{"controls":58,"playsInline":58,"style":59},[62,18232],{"src":18233,"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",[136,18235,18237],{"className":326,"code":18236,"language":328,"meta":141,"style":141},"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,18238,18239,18247,18257,18263,18268,18272,18278,18283,18288,18293,18298,18303,18307,18317,18327,18335,18339,18343],{"__ignoreMap":141},[145,18240,18241,18243,18245],{"class":147,"line":148},[145,18242,3476],{"class":262},[145,18244,266],{"class":258},[145,18246,445],{"class":262},[145,18248,18249,18251,18253,18255],{"class":147,"line":166},[145,18250,3485],{"class":159},[145,18252,454],{"class":262},[145,18254,1083],{"class":159},[145,18256,469],{"class":262},[145,18258,18259,18261],{"class":147,"line":178},[145,18260,15181],{"class":159},[145,18262,2506],{"class":262},[145,18264,18265],{"class":147,"line":187},[145,18266,18267],{"class":159},"        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n",[145,18269,18270],{"class":147,"line":360},[145,18271,16164],{"class":262},[145,18273,18274,18276],{"class":147,"line":366},[145,18275,3496],{"class":159},[145,18277,1098],{"class":262},[145,18279,18280],{"class":147,"line":378},[145,18281,18282],{"class":159},"        \"@Image1 shows premium over-ear headphones in four colors. \"\n",[145,18284,18285],{"class":147,"line":395},[145,18286,18287],{"class":159},"        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n",[145,18289,18290],{"class":147,"line":400},[145,18291,18292],{"class":159},"        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n",[145,18294,18295],{"class":147,"line":415},[145,18296,18297],{"class":159},"        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n",[145,18299,18300],{"class":147,"line":432},[145,18301,18302],{"class":159},"        \"Brand text fades in. Commercial-grade lighting.\"\n",[145,18304,18305],{"class":147,"line":437},[145,18306,3620],{"class":262},[145,18308,18309,18311,18313,18315],{"class":147,"line":448},[145,18310,3508],{"class":159},[145,18312,454],{"class":262},[145,18314,513],{"class":155},[145,18316,469],{"class":262},[145,18318,18319,18321,18323,18325],{"class":147,"line":472},[145,18320,3520],{"class":159},[145,18322,454],{"class":262},[145,18324,3525],{"class":159},[145,18326,469],{"class":262},[145,18328,18329,18331,18333],{"class":147,"line":483},[145,18330,3532],{"class":159},[145,18332,454],{"class":262},[145,18334,2545],{"class":159},[145,18336,18337],{"class":147,"line":489},[145,18338,486],{"class":262},[145,18340,18341],{"class":147,"line":494},[145,18342,357],{"emptyLinePlaceholder":58},[145,18344,18345,18347,18349],{"class":147,"line":499},[145,18346,12031],{"class":262},[145,18348,266],{"class":258},[145,18350,18080],{"class":262},[11,18352,18353],{},"El prompt de la toma heroica utiliza un vocabulario diferente al de la rotación. Aquí está dirigiendo una secuencia, no un movimiento continuo único. Piense en cada oración como una escena en un storyboard.",[92,18355,18357],{"id":18356},"patrones-de-prompt-para-toma-heroica","Patrones de prompt para toma heroica",[11,18359,18360,18363],{},[23,18361,18362],{},"La Emergencia:"," El producto surge del humo, niebla o partículas. Funciona para productos tecnológicos, fragancias, artículos premium.",[136,18365,18368],{"className":18366,"code":18367,"language":1999},[1997],"@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,18369,18367],{"__ignoreMap":141},[11,18371,18372,18375],{},[23,18373,18374],{},"El Aterrizaje de Impacto:"," El producto cae al cuadro con energía — salpicadura, estallido, explosión.",[136,18377,18380],{"className":18378,"code":18379,"language":1999},[1997],"@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,18381,18379],{"__ignoreMap":141},[11,18383,18384,18387],{},[23,18385,18386],{},"El Ensamblaje:"," Los componentes se unen para formar el producto completo. Ideal para tecnología y productos modulares.",[136,18389,18392],{"className":18390,"code":18391,"language":1999},[1997],"@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,18393,18391],{"__ignoreMap":141},[11,18395,18396],{},"El formato de toma heroica se beneficia de mayor duración — de 8 a 12 segundos le da al modelo espacio para construir tensión y resolver la revelación. Los clips más cortos se sienten abruptos; los más largos corren el riesgo de perder la atención del espectador.",[92,18398,18400],{"id":18399},"cuándo-usar-tomas-heroicas","Cuándo usar tomas heroicas",[11,18402,18403],{},"Las tomas heroicas funcionan mejor para:",[97,18405,18406,18412,18418,18424],{},[73,18407,18408,18411],{},[23,18409,18410],{},"Lanzamientos de producto."," Anuncios de nuevos productos en redes sociales y landing pages. La revelación dramática construye anticipación y señala posicionamiento premium.",[73,18413,18414,18417],{},[23,18415,18416],{},"Campañas estacionales."," Ventas navideñas, Black Friday, lanzamientos de nuevas colecciones. La calidad cinematográfica eleva la campaña por encima del contenido promocional estándar.",[73,18419,18420,18423],{},[23,18421,18422],{},"Creatividades publicitarias."," Los anuncios de Facebook, Instagram y TikTok se benefician del poder de detención de una revelación dramática de producto. Estos clips captan la atención en un feed de desplazamiento intensivo.",[73,18425,18426,18429],{},[23,18427,18428],{},"Secciones hero del sitio web."," Una toma heroica con reproducción automática sobre el pliegue comunica la calidad de marca al instante. Mantenga la duración por debajo de 6 segundos para banners hero y evitar problemas de rendimiento.",[11,18431,18432],{},"Las tomas heroicas son menos apropiadas para páginas de detalle de producto donde los clientes buscan contenido informativo. Reserve el dramatismo para el marketing de la parte superior del embudo; use videos de rotación y macro para la página de producto en sí.",[11,18434,18435,18436,18439],{},"Para ",[37,18437,18438],{"href":1578},"consejos de ingeniería de prompts"," más allá del e-commerce, incluyendo cómo Seedance 2.0 interpreta la terminología cinematográfica, consulte la guía dedicada de prompts.",[48,18441,18443],{"id":18442},"tipo-de-video-3-contexto-de-estilo-de-vida","Tipo de video 3: Contexto de estilo de vida",[11,18445,18446],{},"Las fotos estáticas de producto sobre fondos blancos convierten. Pero las imágenes de estilo de vida — el producto en contexto, siendo usado, en un entorno real — construyen conexión emocional. El video de estilo de vida es el formato que hace que un cliente piense \"quiero esa vida\", no solo \"quiero esa cosa\".",[11,18448,18449,18450,18452,18453,18455],{},"Seedance 2.0 soporta entrada de múltiples imágenes. Use ",[28,18451,2722],{}," para el producto y ",[28,18454,2732],{}," para el entorno o escena donde desea colocarlo. El modelo compone el producto en la escena con iluminación natural y perspectiva.",[136,18457,18459],{"className":326,"code":18458,"language":328,"meta":141,"style":141},"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,18460,18461,18469,18479,18485,18492,18497,18501,18507,18512,18517,18522,18527,18532,18537,18541,18551,18561,18570,18574,18578],{"__ignoreMap":141},[145,18462,18463,18465,18467],{"class":147,"line":148},[145,18464,3476],{"class":262},[145,18466,266],{"class":258},[145,18468,445],{"class":262},[145,18470,18471,18473,18475,18477],{"class":147,"line":166},[145,18472,3485],{"class":159},[145,18474,454],{"class":262},[145,18476,1083],{"class":159},[145,18478,469],{"class":262},[145,18480,18481,18483],{"class":147,"line":178},[145,18482,15181],{"class":159},[145,18484,2506],{"class":262},[145,18486,18487,18490],{"class":147,"line":187},[145,18488,18489],{"class":159},"        \"https://your-cdn.com/products/ceramic-mug.jpg\"",[145,18491,469],{"class":262},[145,18493,18494],{"class":147,"line":360},[145,18495,18496],{"class":159},"        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n",[145,18498,18499],{"class":147,"line":366},[145,18500,16164],{"class":262},[145,18502,18503,18505],{"class":147,"line":378},[145,18504,3496],{"class":159},[145,18506,1098],{"class":262},[145,18508,18509],{"class":147,"line":395},[145,18510,18511],{"class":159},"        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n",[145,18513,18514],{"class":147,"line":400},[145,18515,18516],{"class":159},"        \"café table by a window on a rainy morning. The mug sits on the \"\n",[145,18518,18519],{"class":147,"line":415},[145,18520,18521],{"class":159},"        \"table, steam rising gently from fresh coffee. Soft natural light \"\n",[145,18523,18524],{"class":147,"line":432},[145,18525,18526],{"class":159},"        \"from the window. Shallow depth of field. A hand reaches in and \"\n",[145,18528,18529],{"class":147,"line":437},[145,18530,18531],{"class":159},"        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n",[145,18533,18534],{"class":147,"line":448},[145,18535,18536],{"class":159},"        \"advertisement quality.\"\n",[145,18538,18539],{"class":147,"line":472},[145,18540,3620],{"class":262},[145,18542,18543,18545,18547,18549],{"class":147,"line":483},[145,18544,3508],{"class":159},[145,18546,454],{"class":262},[145,18548,3513],{"class":155},[145,18550,469],{"class":262},[145,18552,18553,18555,18557,18559],{"class":147,"line":489},[145,18554,3520],{"class":159},[145,18556,454],{"class":262},[145,18558,3525],{"class":159},[145,18560,469],{"class":262},[145,18562,18563,18565,18567],{"class":147,"line":494},[145,18564,3532],{"class":159},[145,18566,454],{"class":262},[145,18568,18569],{"class":159},"\"9:16\"\n",[145,18571,18572],{"class":147,"line":499},[145,18573,486],{"class":262},[145,18575,18576],{"class":147,"line":519},[145,18577,357],{"emptyLinePlaceholder":58},[145,18579,18580,18582,18584],{"class":147,"line":525},[145,18581,12031],{"class":262},[145,18583,266],{"class":258},[145,18585,18080],{"class":262},[11,18587,18588],{},"Así es como se ve en la práctica — un personaje pintado alcanzando un producto (una taza de café) colocado frente a su marco:",[56,18590,60,18591],{"controls":58,"playsInline":58,"style":59},[62,18592],{"src":18593,"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,18595,18596],{},[2434,18597,18598,18599,18601],{},"Esta demostración muestra cómo ",[28,18600,2722],{}," (la referencia del personaje/producto) se mantiene visualmente consistente mientras el modelo genera interacción natural con accesorios y entorno. El mismo principio aplica a cualquier video de producto en contexto.",[11,18603,18604,18605,18607,18608,18611],{},"La referencia ",[28,18606,2732],{}," le da al modelo un entorno concreto con el cual trabajar en lugar de alucinar uno solo a partir de una descripción textual. Esto produce resultados más realistas y consistentes. El ",[37,18609,18610],{"href":2781},"sistema de @tags"," soporta hasta nueve imágenes, por lo que puede superponer múltiples imágenes de referencia para escenas complejas.",[92,18613,18615],{"id":18614},"sugerencias-de-escenas-de-estilo-de-vida-por-categoría","Sugerencias de escenas de estilo de vida por categoría",[1849,18617,18618,18631],{},[1852,18619,18620],{},[1855,18621,18622,18625,18628],{},[1858,18623,18624],{},"Categoría de producto",[1858,18626,18627],{},"Escena",[1858,18629,18630],{},"Palabras clave del prompt",[1865,18632,18633,18644,18655,18666,18677,18688],{},[1855,18634,18635,18638,18641],{},[1870,18636,18637],{},"Vajilla/bebidas",[1870,18639,18640],{},"Mesa de café, encimera de cocina, terraza exterior",[1870,18642,18643],{},"steam rising, morning light, cozy atmosphere",[1855,18645,18646,18649,18652],{},[1870,18647,18648],{},"Relojes",[1870,18650,18651],{},"Muñeca en el volante, escritorio con laptop, aventura al aire libre",[1870,18653,18654],{},"natural wrist movement, lifestyle context, candid feel",[1855,18656,18657,18660,18663],{},[1870,18658,18659],{},"Auriculares",[1870,18661,18662],{},"Pasajero en tren, corredor en parque, estudiante en escritorio",[1870,18664,18665],{},"wearing naturally, ambient environment, in-use",[1855,18667,18668,18671,18674],{},[1870,18669,18670],{},"Cuidado de la piel",[1870,18672,18673],{},"Tocador de baño, ambiente de spa, mesita de noche",[1870,18675,18676],{},"soft lighting, clean aesthetic, self-care moment",[1855,18678,18679,18682,18685],{},[1870,18680,18681],{},"Muebles",[1870,18683,18684],{},"Sala con luz solar, apartamento decorado",[1870,18686,18687],{},"room context, natural scale, interior design",[1855,18689,18690,18693,18696],{},[1870,18691,18692],{},"Bolsos",[1870,18694,18695],{},"Estilo urbano, terminal de aeropuerto, entrada de oficina",[1870,18697,18698],{},"walking motion, casual carry, urban setting",[11,18700,18701],{},"La clave del video de estilo de vida es la especificidad. \"Una persona usando el producto\" genera resultados genéricos. \"A hand reaches in and wraps around the mug\" crea un momento con intención. Describa la microacción, no el macroconcepto.",[92,18703,18705],{"id":18704},"estilo-de-vida-con-una-imagen-vs-dos-imágenes","Estilo de vida con una imagen vs. dos imágenes",[11,18707,18708,18709,18711,18712,18714],{},"Puede generar videos de estilo de vida con solo una imagen del producto — describa la escena enteramente en el prompt. El modo de dos imágenes (",[28,18710,2722],{}," + ",[28,18713,2732],{},") produce entornos más consistentes porque el modelo tiene una referencia visual de la escena, no solo una descripción textual.",[11,18716,18717],{},"Cuándo usar cada enfoque:",[97,18719,18720,18726],{},[73,18721,18722,18725],{},[23,18723,18724],{},"Una imagen + prompt descriptivo:"," Rápido y fácil. Bueno cuando la escena es genérica (por ejemplo, \"on a desk,\" \"in a kitchen\"). No es necesario buscar una segunda imagen de referencia.",[73,18727,18728,18731],{},[23,18729,18730],{},"Dos imágenes (producto + referencia de escena):"," Composición de mayor calidad. Úselo cuando el entorno específico importa — una estética de café particular, un espacio comercial de marca, un escenario de estilo de vida curado que coincida con las directrices de su marca.",[11,18733,18734,18735,18737,18738,1580],{},"Para el modo de dos imágenes, su referencia de escena no necesita ser su propia foto. Las fotos de stock funcionan bien como referencias de entorno. El modelo extrae la iluminación, la paleta de colores y la disposición espacial de ",[28,18736,2732],{}," y la usa para contextualizar ",[28,18739,2722],{},[11,18741,18742,18743,18745,18746,2412],{},"Note el cambio de relación de aspecto: el contenido de estilo de vida para Instagram Reels y TikTok usa ",[28,18744,1623],{},". Haga coincidir la relación de aspecto con la plataforma donde se reproducirá el video. Más sobre esto en la ",[37,18747,18749],{"href":18748},"#exportaci%C3%B3n-multiplataforma-relaciones-de-aspecto-para-cada-canal","sección de exportación multiplataforma",[48,18751,18753],{"id":18752},"tipo-de-video-4-primer-plano-de-material-detalle-macro","Tipo de video 4: Primer plano de material (Detalle macro)",[11,18755,18756],{},"La textura vende productos premium. La veta del cuero, el acabado cepillado del aluminio, el tejido de un suéter de cachemir — estos detalles comunican calidad de formas que los planos generales no pueden. Un video de primer plano macro que revela lentamente el detalle de la superficie es uno de los formatos de mayor conversión para artículos de lujo y hechos a mano.",[136,18758,18760],{"className":326,"code":18759,"language":328,"meta":141,"style":141},"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,18761,18762,18770,18780,18786,18791,18795,18801,18806,18811,18816,18821,18826,18831,18836,18840,18850,18860,18868,18872,18876],{"__ignoreMap":141},[145,18763,18764,18766,18768],{"class":147,"line":148},[145,18765,3476],{"class":262},[145,18767,266],{"class":258},[145,18769,445],{"class":262},[145,18771,18772,18774,18776,18778],{"class":147,"line":166},[145,18773,3485],{"class":159},[145,18775,454],{"class":262},[145,18777,1083],{"class":159},[145,18779,469],{"class":262},[145,18781,18782,18784],{"class":147,"line":178},[145,18783,15181],{"class":159},[145,18785,2506],{"class":262},[145,18787,18788],{"class":147,"line":187},[145,18789,18790],{"class":159},"        \"https://your-cdn.com/products/leather-wallet.jpg\"\n",[145,18792,18793],{"class":147,"line":360},[145,18794,16164],{"class":262},[145,18796,18797,18799],{"class":147,"line":366},[145,18798,3496],{"class":159},[145,18800,1098],{"class":262},[145,18802,18803],{"class":147,"line":378},[145,18804,18805],{"class":159},"        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n",[145,18807,18808],{"class":147,"line":395},[145,18809,18810],{"class":159},"        \"close-up. The camera slowly glides across the leather surface, \"\n",[145,18812,18813],{"class":147,"line":400},[145,18814,18815],{"class":159},"        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n",[145,18817,18818],{"class":147,"line":415},[145,18819,18820],{"class":159},"        \"of field with creamy bokeh. Warm directional lighting rakes \"\n",[145,18822,18823],{"class":147,"line":432},[145,18824,18825],{"class":159},"        \"across the surface, emphasizing every pore and fiber. The camera \"\n",[145,18827,18828],{"class":147,"line":437},[145,18829,18830],{"class":159},"        \"pulls back gradually to reveal the full wallet. Luxury product \"\n",[145,18832,18833],{"class":147,"line":448},[145,18834,18835],{"class":159},"        \"photography in motion.\"\n",[145,18837,18838],{"class":147,"line":472},[145,18839,3620],{"class":262},[145,18841,18842,18844,18846,18848],{"class":147,"line":483},[145,18843,3508],{"class":159},[145,18845,454],{"class":262},[145,18847,3513],{"class":155},[145,18849,469],{"class":262},[145,18851,18852,18854,18856,18858],{"class":147,"line":489},[145,18853,3520],{"class":159},[145,18855,454],{"class":262},[145,18857,3525],{"class":159},[145,18859,469],{"class":262},[145,18861,18862,18864,18866],{"class":147,"line":494},[145,18863,3532],{"class":159},[145,18865,454],{"class":262},[145,18867,2545],{"class":159},[145,18869,18870],{"class":147,"line":499},[145,18871,486],{"class":262},[145,18873,18874],{"class":147,"line":519},[145,18875,357],{"emptyLinePlaceholder":58},[145,18877,18878,18880,18882],{"class":147,"line":525},[145,18879,12031],{"class":262},[145,18881,266],{"class":258},[145,18883,18080],{"class":262},[92,18885,18887],{"id":18886},"vocabulario-de-prompts-para-macro","Vocabulario de prompts para macro",[11,18889,18890],{},"El modelo responde fuertemente a términos cinematográficos específicos. Use estos para controlar el efecto macro:",[97,18892,18893,18899,18905,18911,18917],{},[73,18894,18895,18898],{},[23,18896,18897],{},"\"Extreme macro close-up\""," — activa el encuadre ajustado en detalles de superficie",[73,18900,18901,18904],{},[23,18902,18903],{},"\"Shallow depth of field\" / \"creamy bokeh\""," — desenfoca el fondo, aísla el detalle",[73,18906,18907,18910],{},[23,18908,18909],{},"\"Raking light\" / \"directional lighting\""," — enfatiza la textura de la superficie mediante sombras",[73,18912,18913,18916],{},[23,18914,18915],{},"\"Camera glides across\""," — movimiento lateral suave, revela la textura progresivamente",[73,18918,18919,18922],{},[23,18920,18921],{},"\"Surface texture reveal\""," — instrucción explícita para enfocarse en la calidad del material",[92,18924,18926],{"id":18925},"prompts-específicos-por-material","Prompts específicos por material",[11,18928,18929,18932],{},[23,18930,18931],{},"Cuero:"," Enfóquese en la veta, las costuras, la pátina. Use iluminación cálida.",[136,18934,18937],{"className":18935,"code":18936,"language":1999},[1997],"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,18938,18936],{"__ignoreMap":141},[11,18940,18941,18944],{},[23,18942,18943],{},"Metal (cepillado/pulido):"," Enfóquese en reflejos, marcas de mecanizado, precisión.",[136,18946,18949],{"className":18947,"code":18948,"language":1999},[1997],"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,18950,18948],{"__ignoreMap":141},[11,18952,18953,18956],{},[23,18954,18955],{},"Tela/textil:"," Enfóquese en el patrón de tejido, detalle de fibra, caída.",[136,18958,18961],{"className":18959,"code":18960,"language":1999},[1997],"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,18962,18960],{"__ignoreMap":141},[11,18964,18965,18968],{},[23,18966,18967],{},"Veta de madera:"," Enfóquese en anillos, acabado, variación natural.",[136,18970,18973],{"className":18971,"code":18972,"language":1999},[1997],"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,18974,18972],{"__ignoreMap":141},[11,18976,18977,18978,1580],{},"Estos primeros planos de material son particularmente poderosos como el segundo o tercer video en un listado de producto. Después de que el cliente ve el producto completo (rotación o toma heroica), el video de detalle macro refuerza la percepción de calidad. Para técnicas de movimiento de cámara que mejoran estas revelaciones, consulte la ",[37,18979,18980],{"href":3672},"guía de movimientos de cámara",[48,18982,18984],{"id":18983},"tipo-de-video-5-revelación-de-unboxing","Tipo de video 5: Revelación de unboxing",[11,18986,18987],{},"Los videos de unboxing dominan YouTube y las plataformas sociales por una razón: simulan la experiencia de compra. La anticipación de abrir el empaque, el primer vistazo al producto, la satisfacción de un diseño de desempaquetado bien pensado — este formato conecta con el pico emocional de la compra.",[136,18989,18991],{"className":326,"code":18990,"language":328,"meta":141,"style":141},"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,18992,18993,19001,19011,19017,19022,19026,19032,19037,19042,19047,19052,19057,19062,19067,19071,19081,19091,19099,19103,19107],{"__ignoreMap":141},[145,18994,18995,18997,18999],{"class":147,"line":148},[145,18996,3476],{"class":262},[145,18998,266],{"class":258},[145,19000,445],{"class":262},[145,19002,19003,19005,19007,19009],{"class":147,"line":166},[145,19004,3485],{"class":159},[145,19006,454],{"class":262},[145,19008,1083],{"class":159},[145,19010,469],{"class":262},[145,19012,19013,19015],{"class":147,"line":178},[145,19014,15181],{"class":159},[145,19016,2506],{"class":262},[145,19018,19019],{"class":147,"line":187},[145,19020,19021],{"class":159},"        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n",[145,19023,19024],{"class":147,"line":360},[145,19025,16164],{"class":262},[145,19027,19028,19030],{"class":147,"line":366},[145,19029,3496],{"class":159},[145,19031,1098],{"class":262},[145,19033,19034],{"class":147,"line":378},[145,19035,19036],{"class":159},"        \"@Image1 is a premium smartwatch in its retail packaging. \"\n",[145,19038,19039],{"class":147,"line":395},[145,19040,19041],{"class":159},"        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n",[145,19043,19044],{"class":147,"line":400},[145,19045,19046],{"class":159},"        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n",[145,19048,19049],{"class":147,"line":415},[145,19050,19051],{"class":159},"        \"Soft overhead lighting. The watch face catches the light as \"\n",[145,19053,19054],{"class":147,"line":432},[145,19055,19056],{"class":159},"        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n",[145,19058,19059],{"class":147,"line":437},[145,19060,19061],{"class":159},"        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n",[145,19063,19064],{"class":147,"line":448},[145,19065,19066],{"class":159},"        \"video. Premium commercial quality.\"\n",[145,19068,19069],{"class":147,"line":472},[145,19070,3620],{"class":262},[145,19072,19073,19075,19077,19079],{"class":147,"line":483},[145,19074,3508],{"class":159},[145,19076,454],{"class":262},[145,19078,16205],{"class":155},[145,19080,469],{"class":262},[145,19082,19083,19085,19087,19089],{"class":147,"line":489},[145,19084,3520],{"class":159},[145,19086,454],{"class":262},[145,19088,3525],{"class":159},[145,19090,469],{"class":262},[145,19092,19093,19095,19097],{"class":147,"line":494},[145,19094,3532],{"class":159},[145,19096,454],{"class":262},[145,19098,18569],{"class":159},[145,19100,19101],{"class":147,"line":499},[145,19102,486],{"class":262},[145,19104,19105],{"class":147,"line":519},[145,19106,357],{"emptyLinePlaceholder":58},[145,19108,19109,19111,19113],{"class":147,"line":525},[145,19110,12031],{"class":262},[145,19112,266],{"class":258},[145,19114,18080],{"class":262},[11,19116,19117],{},"El formato de unboxing funciona mejor con duraciones más largas — de 10 a 15 segundos — porque cuenta una historia con principio (caja sellada), desarrollo (revelación) y final (producto en uso o exhibición). Los clips más cortos truncan el arco narrativo y pierden la recompensa emocional.",[92,19119,19121],{"id":19120},"estructura-de-prompt-para-unboxing","Estructura de prompt para unboxing",[11,19123,19124],{},"Un prompt de unboxing efectivo sigue una estructura de tres actos:",[11,19126,19127,19130],{},[23,19128,19129],{},"Acto 1 — El empaque (2–3 segundos)."," Establezca el packaging. Describa manos interactuando con la caja sellada, el material del empaque, cualquier elemento de marca.",[11,19132,19133,19136],{},[23,19134,19135],{},"Acto 2 — La revelación (4–6 segundos)."," La tapa se abre. El papel de seda, las inserciones de espuma o las capas protectoras se separan. El producto se hace visible por primera vez. Este es el pico emocional — descríbalo con detalle sensorial.",[11,19138,19139,19142],{},[23,19140,19141],{},"Acto 3 — El producto (3–5 segundos)."," El producto se levanta, se exhibe o se pone en uso. Un reloj se coloca en la muñeca. Los auriculares se ponen en los oídos. La pantalla de un teléfono se ilumina. Esto completa la fantasía de compra.",[11,19144,19145],{},"Para productos con empaque distintivo o premium, use una foto que muestre la caja como imagen de entrada. Si solo tiene una foto de producto sobre fondo blanco, describa el empaque en el prompt y deje que el modelo lo genere. Los resultados son más consistentes cuando proporciona una imagen de referencia del empaque real.",[11,19147,19148,19149,19151],{},"El formato vertical 9:16 domina aquí porque el contenido de unboxing vive principalmente en Instagram Reels, TikTok y YouTube Shorts. Para páginas de producto, considere una edición 16:9 con encuadre más ajustado. La ",[37,19150,18980],{"href":3672}," cubre cómo describir revelaciones dramáticas y ángulos cenital que mejoran las secuencias de unboxing.",[92,19153,19155],{"id":19154},"el-empaque-como-activo-de-marketing","El empaque como activo de marketing",[11,19157,19158],{},"Las marcas premium invierten mucho en el diseño de empaque — y los videos de unboxing son donde esa inversión rinde frutos ante la cámara. Si su producto tiene un empaque distintivo (cajas personalizadas, cierres magnéticos, logos en relieve, papel de seda con marca), asegúrese de que su imagen de entrada capture el estado empacado, no solo el producto en sí.",[11,19160,19161],{},"Para productos sin empaque de lujo — cajas marrones estándar, sobres de polietileno, empaque minorista mínimo — aún puede crear una experiencia de unboxing aspiracional. Los productos con empaque poco destacado pueden igualmente producir videos de unboxing convincentes. Enfoque el prompt en el momento de la revelación — el contraste entre una caja cerrada y el producto dentro. El arco narrativo sostiene el video incluso cuando el empaque es estándar.",[92,19163,19165],{"id":19164},"combinando-tipos-de-video-para-un-listado-completo","Combinando tipos de video para un listado completo",[11,19167,19168],{},"Los listados de producto más efectivos usan múltiples tipos de video juntos. Una combinación sólida para una página de producto:",[70,19170,19171,19177,19183,19189],{},[73,19172,19173,19176],{},[23,19174,19175],{},"Toma heroica"," (primer video) — Capta la atención, establece posicionamiento premium",[73,19178,19179,19182],{},[23,19180,19181],{},"Rotación 360°"," (segundo video) — Muestra el producto desde todos los ángulos",[73,19184,19185,19188],{},[23,19186,19187],{},"Primer plano macro"," (tercer video) — Demuestra calidad a través del detalle del material",[73,19190,19191,19194],{},[23,19192,19193],{},"Contexto de estilo de vida"," (cuarto video) — Ayuda al cliente a visualizar la propiedad",[11,19196,19197],{},"Para la promoción en redes sociales del mismo producto, lidere con la toma heroica o la revelación de unboxing (ambas optimizadas para detener pulgares en un feed), luego haga retargeting a los espectadores con contenido de estilo de vida y rotación.",[11,19199,19200],{},"Genere los cinco tipos a partir de una sola foto de producto en una ejecución del pipeline. El sistema por lotes en la siguiente sección lo maneja automáticamente.",[48,19202,19204],{"id":19203},"exportación-multiplataforma-relaciones-de-aspecto-para-cada-canal","Exportación multiplataforma: relaciones de aspecto para cada canal",[11,19206,19207],{},"Un video de producto es útil. El mismo video en cada formato que sus canales necesitan es un sistema. Cada plataforma tiene diferentes preferencias de relación de aspecto, comportamientos de reproducción automática y duraciones óptimas. Generar un solo video y recortarlo para que encaje destruye la composición. Generar nativamente en cada relación produce un video encuadrado correctamente para cada pantalla.",[1849,19209,19210,19224],{},[1852,19211,19212],{},[1855,19213,19214,19216,19218,19221],{},[1858,19215,13603],{},[1858,19217,18151],{},[1858,19219,19220],{},"Duración recomendada",[1858,19222,19223],{},"Notas",[1865,19225,19226,19239,19251,19264,19277,19289,19303,19316,19328],{},[1855,19227,19228,19231,19233,19236],{},[1870,19229,19230],{},"Página de producto Amazon",[1870,19232,1619],{},[1870,19234,19235],{},"6–8s",[1870,19237,19238],{},"Limpio, informativo. Reproducción automática en listado.",[1855,19240,19241,19244,19246,19248],{},[1870,19242,19243],{},"Página de producto Shopify",[1870,19245,1619],{},[1870,19247,18143],{},[1870,19249,19250],{},"Hero con reproducción automática o incrustación en galería.",[1855,19252,19253,19256,19258,19261],{},[1870,19254,19255],{},"Instagram Reels",[1870,19257,1623],{},[1870,19259,19260],{},"8–10s",[1870,19262,19263],{},"Llamativo, se prefiere ritmo rápido.",[1855,19265,19266,19269,19271,19274],{},[1870,19267,19268],{},"TikTok",[1870,19270,1623],{},[1870,19272,19273],{},"8–15s",[1870,19275,19276],{},"Estilos en tendencia, transiciones dinámicas.",[1855,19278,19279,19282,19284,19286],{},[1870,19280,19281],{},"Feed de Facebook",[1870,19283,1627],{},[1870,19285,19235],{},[1870,19287,19288],{},"Cuadrado para máximo espacio en el feed.",[1855,19290,19291,19294,19297,19300],{},[1870,19292,19293],{},"Pinterest Video Pin",[1870,19295,19296],{},"1:1 o 9:16",[1870,19298,19299],{},"6–15s",[1870,19301,19302],{},"Vertical rinde mejor en móvil.",[1855,19304,19305,19308,19310,19313],{},[1870,19306,19307],{},"Banner hero del sitio web",[1870,19309,1619],{},[1870,19311,19312],{},"4–6s",[1870,19314,19315],{},"Bucle corto, reproducción automática, sin audio.",[1855,19317,19318,19321,19323,19325],{},[1870,19319,19320],{},"YouTube Shorts",[1870,19322,1623],{},[1870,19324,19273],{},[1870,19326,19327],{},"Similar al formato de TikTok.",[1855,19329,19330,19333,19335,19337],{},[1870,19331,19332],{},"Campaña de email",[1870,19334,1619],{},[1870,19336,19312],{},[1870,19338,19339],{},"Respaldo en GIF, mantenga el tamaño de archivo pequeño.",[92,19341,19343],{"id":19342},"genere-todas-las-relaciones-en-un-solo-paso","Genere todas las relaciones en un solo paso",[11,19345,19346],{},"Use un bucle simple para generar el mismo video de producto en cada relación que sus canales requieran:",[136,19348,19350],{"className":326,"code":19349,"language":328,"meta":141,"style":141},"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,19351,19352,19361,19394,19423,19452,19482,19486,19490,19500,19505,19510,19515,19519,19523,19532,19544,19552,19562,19573,19580,19591,19601,19611,19615,19623,19647,19701,19714,19718,19723,19735,19748],{"__ignoreMap":141},[145,19353,19354,19357,19359],{"class":147,"line":148},[145,19355,19356],{"class":262},"platform_configs ",[145,19358,266],{"class":258},[145,19360,8637],{"class":262},[145,19362,19363,19366,19369,19371,19374,19377,19379,19381,19383,19385,19387,19389,19391],{"class":147,"line":166},[145,19364,19365],{"class":262},"    {",[145,19367,19368],{"class":159},"\"name\"",[145,19370,454],{"class":262},[145,19372,19373],{"class":159},"\"amazon\"",[145,19375,19376],{"class":262},",    ",[145,19378,5971],{"class":159},[145,19380,454],{"class":262},[145,19382,1167],{"class":159},[145,19384,290],{"class":262},[145,19386,5768],{"class":159},[145,19388,454],{"class":262},[145,19390,3513],{"class":155},[145,19392,19393],{"class":262},"},\n",[145,19395,19396,19398,19400,19402,19405,19407,19409,19411,19413,19415,19417,19419,19421],{"class":147,"line":178},[145,19397,19365],{"class":262},[145,19399,19368],{"class":159},[145,19401,454],{"class":262},[145,19403,19404],{"class":159},"\"instagram\"",[145,19406,290],{"class":262},[145,19408,5971],{"class":159},[145,19410,454],{"class":262},[145,19412,3537],{"class":159},[145,19414,290],{"class":262},[145,19416,5768],{"class":159},[145,19418,454],{"class":262},[145,19420,513],{"class":155},[145,19422,19393],{"class":262},[145,19424,19425,19427,19429,19431,19434,19436,19438,19440,19442,19444,19446,19448,19450],{"class":147,"line":187},[145,19426,19365],{"class":262},[145,19428,19368],{"class":159},[145,19430,454],{"class":262},[145,19432,19433],{"class":159},"\"facebook\"",[145,19435,1235],{"class":262},[145,19437,5971],{"class":159},[145,19439,454],{"class":262},[145,19441,5943],{"class":159},[145,19443,1235],{"class":262},[145,19445,5768],{"class":159},[145,19447,454],{"class":262},[145,19449,3513],{"class":155},[145,19451,19393],{"class":262},[145,19453,19454,19456,19458,19460,19463,19466,19468,19470,19472,19474,19476,19478,19480],{"class":147,"line":360},[145,19455,19365],{"class":262},[145,19457,19368],{"class":159},[145,19459,454],{"class":262},[145,19461,19462],{"class":159},"\"website\"",[145,19464,19465],{"class":262},",   ",[145,19467,5971],{"class":159},[145,19469,454],{"class":262},[145,19471,1167],{"class":159},[145,19473,290],{"class":262},[145,19475,5768],{"class":159},[145,19477,454],{"class":262},[145,19479,1133],{"class":155},[145,19481,19393],{"class":262},[145,19483,19484],{"class":147,"line":366},[145,19485,644],{"class":262},[145,19487,19488],{"class":147,"line":378},[145,19489,357],{"emptyLinePlaceholder":58},[145,19491,19492,19495,19497],{"class":147,"line":395},[145,19493,19494],{"class":262},"base_prompt ",[145,19496,266],{"class":258},[145,19498,19499],{"class":262}," (\n",[145,19501,19502],{"class":147,"line":400},[145,19503,19504],{"class":159},"    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n",[145,19506,19507],{"class":147,"line":415},[145,19508,19509],{"class":159},"    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n",[145,19511,19512],{"class":147,"line":432},[145,19513,19514],{"class":159},"    \"aesthetic. Commercial product video quality.\"\n",[145,19516,19517],{"class":147,"line":437},[145,19518,392],{"class":262},[145,19520,19521],{"class":147,"line":448},[145,19522,357],{"emptyLinePlaceholder":58},[145,19524,19525,19528,19530],{"class":147,"line":472},[145,19526,19527],{"class":262},"tasks ",[145,19529,266],{"class":258},[145,19531,5679],{"class":262},[145,19533,19534,19536,19539,19541],{"class":147,"line":483},[145,19535,7998],{"class":258},[145,19537,19538],{"class":262}," config ",[145,19540,965],{"class":258},[145,19542,19543],{"class":262}," platform_configs:\n",[145,19545,19546,19548,19550],{"class":147,"line":489},[145,19547,1068],{"class":262},[145,19549,266],{"class":258},[145,19551,445],{"class":262},[145,19553,19554,19556,19558,19560],{"class":147,"line":494},[145,19555,1078],{"class":159},[145,19557,454],{"class":262},[145,19559,1083],{"class":159},[145,19561,469],{"class":262},[145,19563,19564,19566,19568,19571],{"class":147,"line":499},[145,19565,2503],{"class":159},[145,19567,10632],{"class":262},[145,19569,19570],{"class":159},"\"https://your-cdn.com/products/speaker.jpg\"",[145,19572,10638],{"class":262},[145,19574,19575,19577],{"class":147,"line":519},[145,19576,1095],{"class":159},[145,19578,19579],{"class":262},": base_prompt,\n",[145,19581,19582,19584,19587,19589],{"class":147,"line":525},[145,19583,1128],{"class":159},[145,19585,19586],{"class":262},": config[",[145,19588,5768],{"class":159},[145,19590,10638],{"class":262},[145,19592,19593,19595,19597,19599],{"class":147,"line":536},[145,19594,1145],{"class":159},[145,19596,454],{"class":262},[145,19598,3525],{"class":159},[145,19600,469],{"class":262},[145,19602,19603,19605,19607,19609],{"class":147,"line":541},[145,19604,1162],{"class":159},[145,19606,19586],{"class":262},[145,19608,5971],{"class":159},[145,19610,644],{"class":262},[145,19612,19613],{"class":147,"line":552},[145,19614,1192],{"class":262},[145,19616,19617,19619,19621],{"class":147,"line":563},[145,19618,1289],{"class":262},[145,19620,266],{"class":258},[145,19622,16702],{"class":262},[145,19624,19625,19628,19631,19633,19635,19637,19639,19642,19644],{"class":147,"line":590},[145,19626,19627],{"class":262},"    tasks.append({",[145,19629,19630],{"class":159},"\"platform\"",[145,19632,19586],{"class":262},[145,19634,19368],{"class":159},[145,19636,10546],{"class":262},[145,19638,7476],{"class":159},[145,19640,19641],{"class":262},": task[",[145,19643,7476],{"class":159},[145,19645,19646],{"class":262},"]})\n",[145,19648,19649,19651,19653,19655,19658,19660,19663,19666,19668,19670,19672,19674,19676,19679,19681,19683,19686,19688,19690,19693,19695,19697,19699],{"class":147,"line":602},[145,19650,878],{"class":155},[145,19652,424],{"class":262},[145,19654,457],{"class":258},[145,19656,19657],{"class":159},"\"📐 ",[145,19659,577],{"class":155},[145,19661,19662],{"class":262},"config[",[145,19664,19665],{"class":159},"'name'",[145,19667,1331],{"class":262},[145,19669,583],{"class":155},[145,19671,114],{"class":159},[145,19673,577],{"class":155},[145,19675,19662],{"class":262},[145,19677,19678],{"class":159},"'aspect_ratio'",[145,19680,1331],{"class":262},[145,19682,583],{"class":155},[145,19684,19685],{"class":159},"): ",[145,19687,577],{"class":155},[145,19689,1325],{"class":262},[145,19691,19692],{"class":159},"'task_id'",[145,19694,1331],{"class":262},[145,19696,583],{"class":155},[145,19698,466],{"class":159},[145,19700,392],{"class":262},[145,19702,19703,19706,19708,19711],{"class":147,"line":608},[145,19704,19705],{"class":262},"    time.sleep(",[145,19707,5256],{"class":155},[145,19709,19710],{"class":262},")  ",[145,19712,19713],{"class":174},"# Rate limiting\n",[145,19715,19716],{"class":147,"line":614},[145,19717,357],{"emptyLinePlaceholder":58},[145,19719,19720],{"class":147,"line":625},[145,19721,19722],{"class":174},"# Collect results\n",[145,19724,19725,19727,19730,19732],{"class":147,"line":630},[145,19726,7998],{"class":258},[145,19728,19729],{"class":262}," t ",[145,19731,965],{"class":258},[145,19733,19734],{"class":262}," tasks:\n",[145,19736,19737,19739,19741,19744,19746],{"class":147,"line":647},[145,19738,1420],{"class":262},[145,19740,266],{"class":258},[145,19742,19743],{"class":262}," wait_for_video(t[",[145,19745,7476],{"class":159},[145,19747,1431],{"class":262},[145,19749,19750,19752,19754,19756,19759,19761,19764,19767,19769,19771,19773,19775,19777,19779,19781,19783,19785,19787,19789],{"class":147,"line":668},[145,19751,878],{"class":155},[145,19753,424],{"class":262},[145,19755,457],{"class":258},[145,19757,19758],{"class":159},"\"✅ ",[145,19760,577],{"class":155},[145,19762,19763],{"class":262},"t[",[145,19765,19766],{"class":159},"'platform'",[145,19768,1331],{"class":262},[145,19770,583],{"class":155},[145,19772,454],{"class":159},[145,19774,577],{"class":155},[145,19776,11605],{"class":262},[145,19778,17692],{"class":159},[145,19780,1359],{"class":262},[145,19782,17697],{"class":159},[145,19784,1331],{"class":262},[145,19786,583],{"class":155},[145,19788,466],{"class":159},[145,19790,392],{"class":262},[11,19792,19793],{},"Esto envía todas las variantes en paralelo (con una pausa de 1 segundo entre solicitudes para limitación de velocidad), luego recopila los resultados a medida que se completan. Para un catálogo de 100 productos en 4 plataformas, son 400 videos — generados en el tiempo que toma ver un episodio de televisión.",[11,19795,19796],{},"Este patrón envía las cuatro variantes y luego recopila los resultados a medida que terminan. El tiempo total de generación es aproximadamente igual al de un solo video — los cuatro se procesan en paralelo del lado del servidor.",[92,19798,19800],{"id":19799},"por-qué-las-relaciones-nativas-superan-al-recorte","Por qué las relaciones nativas superan al recorte",[11,19802,19803],{},"El prompt se mantiene idéntico entre relaciones de aspecto. Seedance 2.0 recompone la escena para ajustarse a cada relación nativamente, ajustando el encuadre y la disposición espacial en lugar de recortar. Una versión vertical 9:16 de un video de rotación coloca el producto centralmente con más espacio superior; una versión cuadrada 1:1 ajusta el encuadre para máxima visibilidad del producto en un feed.",[11,19805,19806],{},"La edición de video tradicional maneja la multiplataforma recortando un archivo maestro 16:9. Un recorte central a 9:16 pierde los lados del cuadro. Un recorte a 1:1 pierde contexto. Con Seedance 2.0, cada relación se genera desde cero — el modelo compone la escena apropiadamente para cada forma. Una versión vertical 9:16 de una rotación de producto coloca el producto con más espacio vertical de respiración. Una versión cuadrada 1:1 ajusta el encuadre para máxima visibilidad del producto en un feed social. El producto siempre ocupa la proporción correcta del cuadro.",[92,19808,19810],{"id":19809},"ajustes-de-prompt-específicos-por-plataforma","Ajustes de prompt específicos por plataforma",[11,19812,19813],{},"Aunque el mismo prompt base funciona entre relaciones, puede optimizar para el estilo de contenido de cada plataforma:",[97,19815,19816,19822,19828,19834,19840],{},[73,19817,19818,19821],{},[23,19819,19820],{},"Amazon/Shopify (16:9):"," Manténgalo limpio e informativo. Evite transiciones llamativas. Enfóquese en mostrar el producto claramente.",[73,19823,19824,19827],{},[23,19825,19826],{},"Instagram Reels (9:16):"," El ritmo más rápido funciona. Agregue \"dynamic\" o \"energetic\" al prompt para más movimiento visual.",[73,19829,19830,19833],{},[23,19831,19832],{},"TikTok (9:16):"," Aún más dinámico. \"Quick cuts,\" \"trend-style transitions,\" y \"bold camera movements\" coinciden con el lenguaje visual de TikTok.",[73,19835,19836,19839],{},[23,19837,19838],{},"Feed de Facebook (1:1):"," El formato cuadrado necesita composición central fuerte. Describa el producto centralmente: \"product centered in frame.\"",[73,19841,19842,19845],{},[23,19843,19844],{},"Hero del sitio web (16:9):"," La sutileza gana. \"Slow, hypnotic motion\" y \"seamless loop\" son términos clave. Estos videos se reproducen automáticamente sin sonido, por lo que la calidad visual importa más que la narrativa.",[11,19847,19848,19849,1580],{},"Para documentación completa de parámetros de la API incluyendo todas las relaciones soportadas, consulte la ",[37,19850,19851],{"href":14180},"documentación de la API de generación de video",[48,19853,19855],{"id":19854},"pipeline-por-lotes-del-catálogo-csv-a-la-biblioteca-de-videos","Pipeline por lotes: del catálogo CSV a la biblioteca de videos",[11,19857,19858],{},"Las llamadas individuales a la API funcionan para pruebas. El e-commerce en producción necesita un pipeline: leer un catálogo de productos, generar videos para cada SKU, manejar fallos y organizar la salida. Esta sección construye ese pipeline.",[11,19860,19861],{},"Comience con un archivo CSV que contenga su catálogo de productos:",[136,19863,19867],{"className":19864,"code":19865,"language":19866,"meta":141,"style":141},"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,19868,19869,19874,19879,19884,19889,19894],{"__ignoreMap":141},[145,19870,19871],{"class":147,"line":148},[145,19872,19873],{},"name,image_url,category,style\n",[145,19875,19876],{"class":147,"line":166},[145,19877,19878],{},"Leather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\n",[145,19880,19881],{"class":147,"line":178},[145,19882,19883],{},"Wireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\n",[145,19885,19886],{"class":147,"line":187},[145,19887,19888],{},"Ceramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\n",[145,19890,19891],{"class":147,"line":360},[145,19892,19893],{},"Merino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\n",[145,19895,19896],{"class":147,"line":366},[145,19897,19898],{},"Smart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n",[11,19900,19901,19902,19904],{},"La columna ",[28,19903,11008],{}," mapea a los cinco tipos de video cubiertos en esta guía. Aquí está el pipeline completo:",[136,19906,19908],{"className":326,"code":19907,"language":328,"meta":141,"style":141},"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,19909,19910,19917,19923,19929,19935,19947,19951,19959,19967,19981,19996,20000,20008,20024,20032,20036,20040,20045,20054,20061,20072,20077,20082,20086,20093,20102,20107,20112,20116,20123,20132,20137,20142,20146,20153,20162,20167,20172,20177,20181,20188,20197,20202,20207,20212,20216,20220,20224,20233,20256,20279,20302,20325,20347,20351,20355,20359,20387,20392,20414,20434,20438,20446,20456,20463,20478,20489,20499,20509,20513,20517,20525,20550,20554,20558,20569,20573,20577,20601,20606,20614,20624,20656,20660,20668,20672,20688,20694,20710,20745,20749,20757,20766,20770,20801,20805,20809,20823,20828,20844,20848,20865,20883,20887,20909,20913,20917,20941,20946,20951,20960,20978,20988,21000,21014,21028,21047,21051,21071,21078,21088,21093,21101,21109,21117,21122,21161,21173,21178,21190,21202,21243,21252,21259,21288,21292,21297,21305,21317,21323,21336,21353,21357,21362,21387,21423,21439,21443,21448,21453,21465,21476,21488,21498,21503,21513,21546,21550,21560,21570,21581,21600,21604,21608,21613,21651,21687,21693,21697,21701,21706],{"__ignoreMap":141},[145,19911,19912,19914],{"class":147,"line":148},[145,19913,335],{"class":258},[145,19915,19916],{"class":262}," csv\n",[145,19918,19919,19921],{"class":147,"line":166},[145,19920,335],{"class":258},[145,19922,338],{"class":262},[145,19924,19925,19927],{"class":147,"line":178},[145,19926,335],{"class":258},[145,19928,345],{"class":262},[145,19930,19931,19933],{"class":147,"line":187},[145,19932,335],{"class":258},[145,19934,352],{"class":262},[145,19936,19937,19939,19942,19944],{"class":147,"line":360},[145,19938,6531],{"class":258},[145,19940,19941],{"class":262}," pathlib ",[145,19943,335],{"class":258},[145,19945,19946],{"class":262}," Path\n",[145,19948,19949],{"class":147,"line":366},[145,19950,357],{"emptyLinePlaceholder":58},[145,19952,19953,19955,19957],{"class":147,"line":378},[145,19954,381],{"class":155},[145,19956,372],{"class":258},[145,19958,17401],{"class":159},[145,19960,19961,19963,19965],{"class":147,"line":395},[145,19962,369],{"class":155},[145,19964,372],{"class":258},[145,19966,9077],{"class":159},[145,19968,19969,19971,19973,19976,19979],{"class":147,"line":400},[145,19970,6607],{"class":155},[145,19972,372],{"class":258},[145,19974,19975],{"class":262}," Path(",[145,19977,19978],{"class":159},"\"./product_videos\"",[145,19980,392],{"class":262},[145,19982,19983,19985,19988,19990,19992,19994],{"class":147,"line":415},[145,19984,6607],{"class":155},[145,19986,19987],{"class":262},".mkdir(",[145,19989,6634],{"class":593},[145,19991,266],{"class":258},[145,19993,916],{"class":155},[145,19995,392],{"class":262},[145,19997,19998],{"class":147,"line":432},[145,19999,357],{"emptyLinePlaceholder":58},[145,20001,20002,20004,20006],{"class":147,"line":437},[145,20003,17418],{"class":262},[145,20005,266],{"class":258},[145,20007,445],{"class":262},[145,20009,20010,20012,20014,20016,20018,20020,20022],{"class":147,"line":448},[145,20011,451],{"class":159},[145,20013,454],{"class":262},[145,20015,457],{"class":258},[145,20017,460],{"class":159},[145,20019,463],{"class":155},[145,20021,466],{"class":159},[145,20023,469],{"class":262},[145,20025,20026,20028,20030],{"class":147,"line":472},[145,20027,475],{"class":159},[145,20029,454],{"class":262},[145,20031,480],{"class":159},[145,20033,20034],{"class":147,"line":483},[145,20035,486],{"class":262},[145,20037,20038],{"class":147,"line":489},[145,20039,357],{"emptyLinePlaceholder":58},[145,20041,20042],{"class":147,"line":494},[145,20043,20044],{"class":174},"# Prompt templates keyed by style\n",[145,20046,20047,20050,20052],{"class":147,"line":499},[145,20048,20049],{"class":155},"STYLE_PROMPTS",[145,20051,372],{"class":258},[145,20053,445],{"class":262},[145,20055,20056,20059],{"class":147,"line":519},[145,20057,20058],{"class":159},"    \"rotation\"",[145,20060,1098],{"class":262},[145,20062,20063,20066,20069],{"class":147,"line":525},[145,20064,20065],{"class":159},"        \"@Image1 is a ",[145,20067,20068],{"class":155},"{name}",[145,20070,20071],{"class":159},". The product rotates slowly on a clean surface \"\n",[145,20073,20074],{"class":147,"line":536},[145,20075,20076],{"class":159},"        \"under professional studio lighting. Smooth 360-degree turntable \"\n",[145,20078,20079],{"class":147,"line":541},[145,20080,20081],{"class":159},"        \"rotation. Commercial product showcase quality.\"\n",[145,20083,20084],{"class":147,"line":552},[145,20085,3620],{"class":262},[145,20087,20088,20091],{"class":147,"line":563},[145,20089,20090],{"class":159},"    \"hero\"",[145,20092,1098],{"class":262},[145,20094,20095,20097,20099],{"class":147,"line":590},[145,20096,20065],{"class":159},[145,20098,20068],{"class":155},[145,20100,20101],{"class":159},". The product emerges dramatically from soft \"\n",[145,20103,20104],{"class":147,"line":602},[145,20105,20106],{"class":159},"        \"volumetric fog with a golden backlight. Particles drift upward. \"\n",[145,20108,20109],{"class":147,"line":608},[145,20110,20111],{"class":159},"        \"Cinematic slow reveal. Premium advertisement quality.\"\n",[145,20113,20114],{"class":147,"line":614},[145,20115,3620],{"class":262},[145,20117,20118,20121],{"class":147,"line":625},[145,20119,20120],{"class":159},"    \"lifestyle\"",[145,20122,1098],{"class":262},[145,20124,20125,20127,20129],{"class":147,"line":630},[145,20126,20065],{"class":159},[145,20128,20068],{"class":155},[145,20130,20131],{"class":159},". The product is shown in a natural lifestyle \"\n",[145,20133,20134],{"class":147,"line":647},[145,20135,20136],{"class":159},"        \"setting, being used in an everyday context. Warm natural lighting. \"\n",[145,20138,20139],{"class":147,"line":668},[145,20140,20141],{"class":159},"        \"Shallow depth of field. Authentic lifestyle commercial.\"\n",[145,20143,20144],{"class":147,"line":688},[145,20145,3620],{"class":262},[145,20147,20148,20151],{"class":147,"line":693},[145,20149,20150],{"class":159},"    \"macro\"",[145,20152,1098],{"class":262},[145,20154,20155,20157,20159],{"class":147,"line":738},[145,20156,20065],{"class":159},[145,20158,20068],{"class":155},[145,20160,20161],{"class":159},". Extreme macro close-up. The camera glides \"\n",[145,20163,20164],{"class":147,"line":743},[145,20165,20166],{"class":159},"        \"across the surface, revealing material texture and craftsmanship \"\n",[145,20168,20169],{"class":147,"line":760},[145,20170,20171],{"class":159},"        \"details. Shallow depth of field. Raking directional light. \"\n",[145,20173,20174],{"class":147,"line":769},[145,20175,20176],{"class":159},"        \"Luxury product detail shot.\"\n",[145,20178,20179],{"class":147,"line":784},[145,20180,3620],{"class":262},[145,20182,20183,20186],{"class":147,"line":810},[145,20184,20185],{"class":159},"    \"unboxing\"",[145,20187,1098],{"class":262},[145,20189,20190,20192,20194],{"class":147,"line":837},[145,20191,20065],{"class":159},[145,20193,20068],{"class":155},[145,20195,20196],{"class":159}," in retail packaging. Hands lift the lid to \"\n",[145,20198,20199],{"class":147,"line":842},[145,20200,20201],{"class":159},"        \"reveal the product inside. Tissue paper parts. The product is \"\n",[145,20203,20204],{"class":147,"line":848},[145,20205,20206],{"class":159},"        \"lifted out and displayed. Soft overhead lighting. Premium \"\n",[145,20208,20209],{"class":147,"line":853},[145,20210,20211],{"class":159},"        \"unboxing experience video.\"\n",[145,20213,20214],{"class":147,"line":858},[145,20215,3620],{"class":262},[145,20217,20218],{"class":147,"line":869},[145,20219,486],{"class":262},[145,20221,20222],{"class":147,"line":875},[145,20223,357],{"emptyLinePlaceholder":58},[145,20225,20226,20229,20231],{"class":147,"line":900},[145,20227,20228],{"class":155},"STYLE_DEFAULTS",[145,20230,372],{"class":258},[145,20232,445],{"class":262},[145,20234,20235,20237,20240,20242,20244,20246,20248,20250,20252,20254],{"class":147,"line":921},[145,20236,20058],{"class":159},[145,20238,20239],{"class":262},":  {",[145,20241,5768],{"class":159},[145,20243,454],{"class":262},[145,20245,3513],{"class":155},[145,20247,1235],{"class":262},[145,20249,5971],{"class":159},[145,20251,454],{"class":262},[145,20253,1167],{"class":159},[145,20255,19393],{"class":262},[145,20257,20258,20260,20263,20265,20267,20269,20271,20273,20275,20277],{"class":147,"line":927},[145,20259,20090],{"class":159},[145,20261,20262],{"class":262},":      {",[145,20264,5768],{"class":159},[145,20266,454],{"class":262},[145,20268,513],{"class":155},[145,20270,290],{"class":262},[145,20272,5971],{"class":159},[145,20274,454],{"class":262},[145,20276,1167],{"class":159},[145,20278,19393],{"class":262},[145,20280,20281,20283,20286,20288,20290,20292,20294,20296,20298,20300],{"class":147,"line":932},[145,20282,20120],{"class":159},[145,20284,20285],{"class":262},": {",[145,20287,5768],{"class":159},[145,20289,454],{"class":262},[145,20291,3513],{"class":155},[145,20293,1235],{"class":262},[145,20295,5971],{"class":159},[145,20297,454],{"class":262},[145,20299,3537],{"class":159},[145,20301,19393],{"class":262},[145,20303,20304,20306,20309,20311,20313,20315,20317,20319,20321,20323],{"class":147,"line":956},[145,20305,20150],{"class":159},[145,20307,20308],{"class":262},":     {",[145,20310,5768],{"class":159},[145,20312,454],{"class":262},[145,20314,3513],{"class":155},[145,20316,1235],{"class":262},[145,20318,5971],{"class":159},[145,20320,454],{"class":262},[145,20322,1167],{"class":159},[145,20324,19393],{"class":262},[145,20326,20327,20329,20331,20333,20335,20337,20339,20341,20343,20345],{"class":147,"line":981},[145,20328,20185],{"class":159},[145,20330,20239],{"class":262},[145,20332,5768],{"class":159},[145,20334,454],{"class":262},[145,20336,16205],{"class":155},[145,20338,290],{"class":262},[145,20340,5971],{"class":159},[145,20342,454],{"class":262},[145,20344,3537],{"class":159},[145,20346,19393],{"class":262},[145,20348,20349],{"class":147,"line":987},[145,20350,486],{"class":262},[145,20352,20353],{"class":147,"line":992},[145,20354,357],{"emptyLinePlaceholder":58},[145,20356,20357],{"class":147,"line":1009},[145,20358,357],{"emptyLinePlaceholder":58},[145,20360,20361,20363,20366,20369,20371,20374,20376,20379,20381,20383,20385],{"class":147,"line":1044},[145,20362,502],{"class":258},[145,20364,20365],{"class":151}," submit_video_task",[145,20367,20368],{"class":262},"(name: ",[145,20370,8443],{"class":155},[145,20372,20373],{"class":262},", image_url: ",[145,20375,8443],{"class":155},[145,20377,20378],{"class":262},", style: ",[145,20380,8443],{"class":155},[145,20382,15639],{"class":262},[145,20384,8443],{"class":155},[145,20386,412],{"class":262},[145,20388,20389],{"class":147,"line":1049},[145,20390,20391],{"class":159},"    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n",[145,20393,20394,20397,20399,20402,20405,20407,20409,20412],{"class":147,"line":1054},[145,20395,20396],{"class":262},"    prompt_template ",[145,20398,266],{"class":258},[145,20400,20401],{"class":155}," STYLE_PROMPTS",[145,20403,20404],{"class":262},".get(style, ",[145,20406,20049],{"class":155},[145,20408,6929],{"class":262},[145,20410,20411],{"class":159},"\"rotation\"",[145,20413,1431],{"class":262},[145,20415,20416,20419,20421,20424,20426,20428,20430,20432],{"class":147,"line":1065},[145,20417,20418],{"class":262},"    defaults ",[145,20420,266],{"class":258},[145,20422,20423],{"class":155}," STYLE_DEFAULTS",[145,20425,20404],{"class":262},[145,20427,20228],{"class":155},[145,20429,6929],{"class":262},[145,20431,20411],{"class":159},[145,20433,1431],{"class":262},[145,20435,20436],{"class":147,"line":1075},[145,20437,357],{"emptyLinePlaceholder":58},[145,20439,20440,20442,20444],{"class":147,"line":1092},[145,20441,1068],{"class":262},[145,20443,266],{"class":258},[145,20445,445],{"class":262},[145,20447,20448,20450,20452,20454],{"class":147,"line":1101},[145,20449,1078],{"class":159},[145,20451,454],{"class":262},[145,20453,1083],{"class":159},[145,20455,469],{"class":262},[145,20457,20458,20460],{"class":147,"line":1107},[145,20459,2503],{"class":159},[145,20461,20462],{"class":262},": [image_url],\n",[145,20464,20465,20467,20470,20473,20475],{"class":147,"line":1113},[145,20466,1095],{"class":159},[145,20468,20469],{"class":262},": prompt_template.format(",[145,20471,20472],{"class":593},"name",[145,20474,266],{"class":258},[145,20476,20477],{"class":262},"name),\n",[145,20479,20480,20482,20485,20487],{"class":147,"line":1119},[145,20481,1128],{"class":159},[145,20483,20484],{"class":262},": defaults[",[145,20486,5768],{"class":159},[145,20488,10638],{"class":262},[145,20490,20491,20493,20495,20497],{"class":147,"line":1125},[145,20492,1145],{"class":159},[145,20494,454],{"class":262},[145,20496,3525],{"class":159},[145,20498,469],{"class":262},[145,20500,20501,20503,20505,20507],{"class":147,"line":1142},[145,20502,1162],{"class":159},[145,20504,20484],{"class":262},[145,20506,5971],{"class":159},[145,20508,10638],{"class":262},[145,20510,20511],{"class":147,"line":1159},[145,20512,1192],{"class":262},[145,20514,20515],{"class":147,"line":1176},[145,20516,357],{"emptyLinePlaceholder":58},[145,20518,20519,20521,20523],{"class":147,"line":1189},[145,20520,9454],{"class":262},[145,20522,266],{"class":258},[145,20524,1219],{"class":262},[145,20526,20527,20529,20531,20533,20535,20537,20539,20541,20544,20546,20548],{"class":147,"line":1195},[145,20528,1225],{"class":258},[145,20530,466],{"class":159},[145,20532,571],{"class":155},[145,20534,1232],{"class":159},[145,20536,290],{"class":262},[145,20538,17630],{"class":593},[145,20540,266],{"class":258},[145,20542,20543],{"class":262},"headers, ",[145,20545,1671],{"class":593},[145,20547,266],{"class":258},[145,20549,2603],{"class":262},[145,20551,20552],{"class":147,"line":1200},[145,20553,1274],{"class":262},[145,20555,20556],{"class":147,"line":1212},[145,20557,9471],{"class":262},[145,20559,20560,20562,20565,20567],{"class":147,"line":1222},[145,20561,1512],{"class":258},[145,20563,20564],{"class":262}," resp.json()[",[145,20566,7476],{"class":159},[145,20568,644],{"class":262},[145,20570,20571],{"class":147,"line":1241},[145,20572,357],{"emptyLinePlaceholder":58},[145,20574,20575],{"class":147,"line":1257},[145,20576,357],{"emptyLinePlaceholder":58},[145,20578,20579,20581,20583,20585,20587,20589,20591,20593,20595,20597,20599],{"class":147,"line":1271},[145,20580,502],{"class":258},[145,20582,11476],{"class":151},[145,20584,17548],{"class":262},[145,20586,8443],{"class":155},[145,20588,17564],{"class":262},[145,20590,17556],{"class":155},[145,20592,372],{"class":258},[145,20594,17571],{"class":155},[145,20596,15639],{"class":262},[145,20598,8568],{"class":155},[145,20600,412],{"class":262},[145,20602,20603],{"class":147,"line":1277},[145,20604,20605],{"class":159},"    \"\"\"Poll until task completes or fails.\"\"\"\n",[145,20607,20608,20610,20612],{"class":147,"line":1286},[145,20609,9158],{"class":262},[145,20611,266],{"class":258},[145,20613,9163],{"class":155},[145,20615,20616,20618,20620,20622],{"class":147,"line":1300},[145,20617,544],{"class":258},[145,20619,9170],{"class":262},[145,20621,5784],{"class":258},[145,20623,9175],{"class":262},[145,20625,20626,20628,20630,20632,20634,20636,20638,20640,20642,20644,20646,20648,20650,20652,20654],{"class":147,"line":1305},[145,20627,6733],{"class":262},[145,20629,266],{"class":258},[145,20631,17609],{"class":262},[145,20633,457],{"class":258},[145,20635,466],{"class":159},[145,20637,571],{"class":155},[145,20639,574],{"class":159},[145,20641,577],{"class":155},[145,20643,580],{"class":262},[145,20645,583],{"class":155},[145,20647,466],{"class":159},[145,20649,290],{"class":262},[145,20651,17630],{"class":593},[145,20653,266],{"class":258},[145,20655,17635],{"class":262},[145,20657,20658],{"class":147,"line":1311},[145,20659,6761],{"class":262},[145,20661,20662,20664,20666],{"class":147,"line":1340},[145,20663,617],{"class":262},[145,20665,266],{"class":258},[145,20667,11560],{"class":262},[145,20669,20670],{"class":147,"line":1374},[145,20671,357],{"emptyLinePlaceholder":58},[145,20673,20674,20676,20678,20680,20682,20684,20686],{"class":147,"line":1406},[145,20675,746],{"class":258},[145,20677,638],{"class":262},[145,20679,641],{"class":159},[145,20681,14725],{"class":262},[145,20683,752],{"class":258},[145,20685,755],{"class":159},[145,20687,412],{"class":262},[145,20689,20690,20692],{"class":147,"line":1411},[145,20691,763],{"class":258},[145,20693,766],{"class":262},[145,20695,20696,20698,20700,20702,20704,20706,20708],{"class":147,"line":1417},[145,20697,772],{"class":258},[145,20699,638],{"class":262},[145,20701,641],{"class":159},[145,20703,14725],{"class":262},[145,20705,752],{"class":258},[145,20707,779],{"class":159},[145,20709,412],{"class":262},[145,20711,20712,20714,20716,20718,20720,20722,20724,20726,20728,20731,20733,20735,20737,20739,20741,20743],{"class":147,"line":1434},[145,20713,813],{"class":258},[145,20715,5569],{"class":155},[145,20717,424],{"class":262},[145,20719,457],{"class":258},[145,20721,17817],{"class":159},[145,20723,577],{"class":155},[145,20725,580],{"class":262},[145,20727,583],{"class":155},[145,20729,20730],{"class":159}," failed: ",[145,20732,577],{"class":155},[145,20734,17740],{"class":262},[145,20736,11657],{"class":159},[145,20738,108],{"class":262},[145,20740,583],{"class":155},[145,20742,466],{"class":159},[145,20744,392],{"class":262},[145,20746,20747],{"class":147,"line":1439},[145,20748,357],{"emptyLinePlaceholder":58},[145,20750,20751,20753,20755],{"class":147,"line":1445},[145,20752,14863],{"class":262},[145,20754,1133],{"class":155},[145,20756,392],{"class":262},[145,20758,20759,20761,20763],{"class":147,"line":1465},[145,20760,671],{"class":262},[145,20762,9364],{"class":258},[145,20764,20765],{"class":155}," 5\n",[145,20767,20768],{"class":147,"line":1493},[145,20769,357],{"emptyLinePlaceholder":58},[145,20771,20772,20774,20776,20778,20780,20782,20784,20786,20788,20791,20793,20795,20797,20799],{"class":147,"line":1504},[145,20773,418],{"class":258},[145,20775,9374],{"class":155},[145,20777,424],{"class":262},[145,20779,457],{"class":258},[145,20781,17817],{"class":159},[145,20783,577],{"class":155},[145,20785,580],{"class":262},[145,20787,583],{"class":155},[145,20789,20790],{"class":159}," timed out after ",[145,20792,577],{"class":155},[145,20794,6749],{"class":262},[145,20796,583],{"class":155},[145,20798,1369],{"class":159},[145,20800,392],{"class":262},[145,20802,20803],{"class":147,"line":1509},[145,20804,357],{"emptyLinePlaceholder":58},[145,20806,20807],{"class":147,"line":1518},[145,20808,357],{"emptyLinePlaceholder":58},[145,20810,20811,20813,20815,20818,20820],{"class":147,"line":1523},[145,20812,502],{"class":258},[145,20814,863],{"class":151},[145,20816,20817],{"class":262},"(url: ",[145,20819,8443],{"class":155},[145,20821,20822],{"class":262},", filepath: Path):\n",[145,20824,20825],{"class":147,"line":1528},[145,20826,20827],{"class":159},"    \"\"\"Download a video file from a URL.\"\"\"\n",[145,20829,20830,20832,20834,20836,20838,20840,20842],{"class":147,"line":1544},[145,20831,9454],{"class":262},[145,20833,266],{"class":258},[145,20835,908],{"class":262},[145,20837,911],{"class":593},[145,20839,266],{"class":258},[145,20841,916],{"class":155},[145,20843,392],{"class":262},[145,20845,20846],{"class":147,"line":10165},[145,20847,9471],{"class":262},[145,20849,20850,20852,20854,20857,20859,20861,20863],{"class":147,"line":10211},[145,20851,935],{"class":258},[145,20853,938],{"class":155},[145,20855,20856],{"class":262},"(filepath, ",[145,20858,944],{"class":159},[145,20860,947],{"class":262},[145,20862,950],{"class":258},[145,20864,953],{"class":262},[145,20866,20867,20869,20871,20873,20875,20877,20879,20881],{"class":147,"line":10216},[145,20868,959],{"class":258},[145,20870,962],{"class":262},[145,20872,965],{"class":258},[145,20874,6790],{"class":262},[145,20876,971],{"class":593},[145,20878,266],{"class":258},[145,20880,976],{"class":155},[145,20882,516],{"class":262},[145,20884,20885],{"class":147,"line":10221},[145,20886,984],{"class":262},[145,20888,20889,20891,20893,20895,20898,20900,20903,20905,20907],{"class":147,"line":10230},[145,20890,878],{"class":155},[145,20892,424],{"class":262},[145,20894,457],{"class":258},[145,20896,20897],{"class":159},"\"💾 Saved: ",[145,20899,577],{"class":155},[145,20901,20902],{"class":262},"filepath",[145,20904,583],{"class":155},[145,20906,466],{"class":159},[145,20908,392],{"class":262},[145,20910,20911],{"class":147,"line":10236},[145,20912,357],{"emptyLinePlaceholder":58},[145,20914,20915],{"class":147,"line":10245},[145,20916,357],{"emptyLinePlaceholder":58},[145,20918,20919,20921,20924,20927,20929,20932,20934,20936,20939],{"class":147,"line":10266},[145,20920,502],{"class":258},[145,20922,20923],{"class":151}," process_catalog",[145,20925,20926],{"class":262},"(csv_path: ",[145,20928,8443],{"class":155},[145,20930,20931],{"class":262},", max_retries: ",[145,20933,17556],{"class":155},[145,20935,372],{"class":258},[145,20937,20938],{"class":155}," 2",[145,20940,516],{"class":262},[145,20942,20943],{"class":147,"line":10275},[145,20944,20945],{"class":159},"    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n",[145,20947,20948],{"class":147,"line":10280},[145,20949,20950],{"class":174},"    # Phase 1: Submit all tasks\n",[145,20952,20953,20956,20958],{"class":147,"line":10293},[145,20954,20955],{"class":262},"    pending ",[145,20957,266],{"class":258},[145,20959,5679],{"class":262},[145,20961,20962,20964,20966,20969,20972,20974,20976],{"class":147,"line":10315},[145,20963,935],{"class":258},[145,20965,938],{"class":155},[145,20967,20968],{"class":262},"(csv_path, ",[145,20970,20971],{"class":159},"\"r\"",[145,20973,947],{"class":262},[145,20975,950],{"class":258},[145,20977,953],{"class":262},[145,20979,20980,20983,20985],{"class":147,"line":10322},[145,20981,20982],{"class":262},"        reader ",[145,20984,266],{"class":258},[145,20986,20987],{"class":262}," csv.DictReader(f)\n",[145,20989,20990,20992,20995,20997],{"class":147,"line":10343},[145,20991,959],{"class":258},[145,20993,20994],{"class":262}," row ",[145,20996,965],{"class":258},[145,20998,20999],{"class":262}," reader:\n",[145,21001,21002,21005,21007,21010,21012],{"class":147,"line":10348},[145,21003,21004],{"class":262},"            name ",[145,21006,266],{"class":258},[145,21008,21009],{"class":262}," row[",[145,21011,19368],{"class":159},[145,21013,644],{"class":262},[145,21015,21016,21019,21021,21023,21026],{"class":147,"line":10353},[145,21017,21018],{"class":262},"            image_url ",[145,21020,266],{"class":258},[145,21022,21009],{"class":262},[145,21024,21025],{"class":159},"\"image_url\"",[145,21027,644],{"class":262},[145,21029,21030,21033,21035,21038,21041,21043,21045],{"class":147,"line":10359},[145,21031,21032],{"class":262},"            style ",[145,21034,266],{"class":258},[145,21036,21037],{"class":262}," row.get(",[145,21039,21040],{"class":159},"\"style\"",[145,21042,290],{"class":262},[145,21044,20411],{"class":159},[145,21046,392],{"class":262},[145,21048,21049],{"class":147,"line":10368},[145,21050,357],{"emptyLinePlaceholder":58},[145,21052,21053,21055,21057,21059,21061,21064,21066,21069],{"class":147,"line":10377},[145,21054,6783],{"class":258},[145,21056,4941],{"class":262},[145,21058,965],{"class":258},[145,21060,4946],{"class":155},[145,21062,21063],{"class":262},"(max_retries ",[145,21065,5246],{"class":258},[145,21067,21068],{"class":155}," 1",[145,21070,516],{"class":262},[145,21072,21073,21076],{"class":147,"line":10388},[145,21074,21075],{"class":258},"                try",[145,21077,412],{"class":262},[145,21079,21080,21083,21085],{"class":147,"line":10395},[145,21081,21082],{"class":262},"                    task_id ",[145,21084,266],{"class":258},[145,21086,21087],{"class":262}," submit_video_task(name, image_url, style)\n",[145,21089,21090],{"class":147,"line":10400},[145,21091,21092],{"class":262},"                    pending.append({\n",[145,21094,21095,21098],{"class":147,"line":10405},[145,21096,21097],{"class":159},"                        \"name\"",[145,21099,21100],{"class":262},": name,\n",[145,21102,21103,21106],{"class":147,"line":10410},[145,21104,21105],{"class":159},"                        \"task_id\"",[145,21107,21108],{"class":262},": task_id,\n",[145,21110,21111,21114],{"class":147,"line":10415},[145,21112,21113],{"class":159},"                        \"style\"",[145,21115,21116],{"class":262},": style,\n",[145,21118,21119],{"class":147,"line":10426},[145,21120,21121],{"class":262},"                    })\n",[145,21123,21124,21127,21129,21131,21134,21136,21138,21140,21142,21144,21146,21148,21151,21153,21155,21157,21159],{"class":147,"line":10437},[145,21125,21126],{"class":155},"                    print",[145,21128,424],{"class":262},[145,21130,457],{"class":258},[145,21132,21133],{"class":159},"\"🎬 Submitted: ",[145,21135,577],{"class":155},[145,21137,20472],{"class":262},[145,21139,583],{"class":155},[145,21141,114],{"class":159},[145,21143,577],{"class":155},[145,21145,11008],{"class":262},[145,21147,583],{"class":155},[145,21149,21150],{"class":159},") → ",[145,21152,577],{"class":155},[145,21154,580],{"class":262},[145,21156,583],{"class":155},[145,21158,466],{"class":159},[145,21160,392],{"class":262},[145,21162,21163,21166,21168,21170],{"class":147,"line":10448},[145,21164,21165],{"class":262},"                    time.sleep(",[145,21167,5256],{"class":155},[145,21169,19710],{"class":262},[145,21171,21172],{"class":174},"# Rate limiting: 1 request per second\n",[145,21174,21175],{"class":147,"line":10457},[145,21176,21177],{"class":258},"                    break\n",[145,21179,21180,21183,21186,21188],{"class":147,"line":10462},[145,21181,21182],{"class":258},"                except",[145,21184,21185],{"class":262}," requests.exceptions.RequestException ",[145,21187,950],{"class":258},[145,21189,5462],{"class":262},[145,21191,21192,21195,21197,21199],{"class":147,"line":10468},[145,21193,21194],{"class":258},"                    if",[145,21196,4941],{"class":262},[145,21198,5784],{"class":258},[145,21200,21201],{"class":262}," max_retries:\n",[145,21203,21204,21207,21209,21211,21214,21216,21218,21220,21222,21225,21227,21229,21231,21233,21235,21237,21239,21241],{"class":147,"line":10477},[145,21205,21206],{"class":155},"                        print",[145,21208,424],{"class":262},[145,21210,457],{"class":258},[145,21212,21213],{"class":159},"\"⚠️  Retry ",[145,21215,577],{"class":155},[145,21217,5275],{"class":262},[145,21219,5246],{"class":258},[145,21221,5280],{"class":155},[145,21223,21224],{"class":159}," for ",[145,21226,577],{"class":155},[145,21228,20472],{"class":262},[145,21230,583],{"class":155},[145,21232,454],{"class":159},[145,21234,577],{"class":155},[145,21236,5509],{"class":262},[145,21238,583],{"class":155},[145,21240,466],{"class":159},[145,21242,392],{"class":262},[145,21244,21245,21248,21250],{"class":147,"line":10521},[145,21246,21247],{"class":262},"                        time.sleep(",[145,21249,4874],{"class":155},[145,21251,392],{"class":262},[145,21253,21254,21257],{"class":147,"line":10534},[145,21255,21256],{"class":258},"                    else",[145,21258,412],{"class":262},[145,21260,21261,21263,21265,21267,21270,21272,21274,21276,21278,21280,21282,21284,21286],{"class":147,"line":10554},[145,21262,21206],{"class":155},[145,21264,424],{"class":262},[145,21266,457],{"class":258},[145,21268,21269],{"class":159},"\"❌ Failed to submit ",[145,21271,577],{"class":155},[145,21273,20472],{"class":262},[145,21275,583],{"class":155},[145,21277,454],{"class":159},[145,21279,577],{"class":155},[145,21281,5509],{"class":262},[145,21283,583],{"class":155},[145,21285,466],{"class":159},[145,21287,392],{"class":262},[145,21289,21290],{"class":147,"line":10559},[145,21291,357],{"emptyLinePlaceholder":58},[145,21293,21294],{"class":147,"line":10564},[145,21295,21296],{"class":174},"    # Phase 2: Collect results\n",[145,21298,21299,21301,21303],{"class":147,"line":10570},[145,21300,8209],{"class":262},[145,21302,266],{"class":258},[145,21304,5679],{"class":262},[145,21306,21307,21309,21312,21314],{"class":147,"line":10579},[145,21308,4938],{"class":258},[145,21310,21311],{"class":262}," item ",[145,21313,965],{"class":258},[145,21315,21316],{"class":262}," pending:\n",[145,21318,21319,21321],{"class":147,"line":10588},[145,21320,4954],{"class":258},[145,21322,412],{"class":262},[145,21324,21325,21327,21329,21332,21334],{"class":147,"line":10599},[145,21326,8298],{"class":262},[145,21328,266],{"class":258},[145,21330,21331],{"class":262}," poll_task(item[",[145,21333,7476],{"class":159},[145,21335,1431],{"class":262},[145,21337,21338,21340,21342,21344,21347,21349,21351],{"class":147,"line":10606},[145,21339,7209],{"class":262},[145,21341,266],{"class":258},[145,21343,638],{"class":262},[145,21345,21346],{"class":159},"\"output\"",[145,21348,1359],{"class":262},[145,21350,14747],{"class":159},[145,21352,644],{"class":262},[145,21354,21355],{"class":147,"line":10611},[145,21356,357],{"emptyLinePlaceholder":58},[145,21358,21359],{"class":147,"line":10616},[145,21360,21361],{"class":174},"            # Generate safe filename\n",[145,21363,21364,21367,21369,21372,21374,21377,21380,21382,21385],{"class":147,"line":10622},[145,21365,21366],{"class":262},"            safe_name ",[145,21368,266],{"class":258},[145,21370,21371],{"class":262}," item[",[145,21373,19368],{"class":159},[145,21375,21376],{"class":262},"].lower().replace(",[145,21378,21379],{"class":159},"\" \"",[145,21381,290],{"class":262},[145,21383,21384],{"class":159},"\"-\"",[145,21386,392],{"class":262},[145,21388,21389,21392,21394,21396,21398,21400,21403,21405,21408,21410,21413,21416,21418,21420],{"class":147,"line":10627},[145,21390,21391],{"class":262},"            filename ",[145,21393,266],{"class":258},[145,21395,3173],{"class":258},[145,21397,466],{"class":159},[145,21399,577],{"class":155},[145,21401,21402],{"class":262},"safe_name",[145,21404,583],{"class":155},[145,21406,21407],{"class":159},"_",[145,21409,577],{"class":155},[145,21411,21412],{"class":262},"item[",[145,21414,21415],{"class":159},"'style'",[145,21417,1331],{"class":262},[145,21419,583],{"class":155},[145,21421,21422],{"class":159},".mp4\"\n",[145,21424,21425,21428,21430,21433,21436],{"class":147,"line":10641},[145,21426,21427],{"class":262},"            filepath ",[145,21429,266],{"class":258},[145,21431,21432],{"class":155}," OUTPUT_DIR",[145,21434,21435],{"class":258}," /",[145,21437,21438],{"class":262}," filename\n",[145,21440,21441],{"class":147,"line":10652},[145,21442,357],{"emptyLinePlaceholder":58},[145,21444,21445],{"class":147,"line":10661},[145,21446,21447],{"class":262},"            download_video(video_url, filepath)\n",[145,21449,21450],{"class":147,"line":10666},[145,21451,21452],{"class":262},"            results.append({\n",[145,21454,21455,21458,21461,21463],{"class":147,"line":10671},[145,21456,21457],{"class":159},"                \"name\"",[145,21459,21460],{"class":262},": item[",[145,21462,19368],{"class":159},[145,21464,10638],{"class":262},[145,21466,21467,21470,21472,21474],{"class":147,"line":10680},[145,21468,21469],{"class":159},"                \"style\"",[145,21471,21460],{"class":262},[145,21473,21040],{"class":159},[145,21475,10638],{"class":262},[145,21477,21478,21481,21483,21485],{"class":147,"line":10705},[145,21479,21480],{"class":159},"                \"file\"",[145,21482,454],{"class":262},[145,21484,8443],{"class":155},[145,21486,21487],{"class":262},"(filepath),\n",[145,21489,21490,21493,21495],{"class":147,"line":10718},[145,21491,21492],{"class":159},"                \"status\"",[145,21494,454],{"class":262},[145,21496,21497],{"class":159},"\"success\"\n",[145,21499,21500],{"class":147,"line":10736},[145,21501,21502],{"class":262},"            })\n",[145,21504,21505,21507,21509,21511],{"class":147,"line":10741},[145,21506,5352],{"class":258},[145,21508,816],{"class":155},[145,21510,6870],{"class":258},[145,21512,5462],{"class":262},[145,21514,21515,21517,21519,21521,21524,21526,21528,21530,21532,21534,21536,21538,21540,21542,21544],{"class":147,"line":10746},[145,21516,5392],{"class":155},[145,21518,424],{"class":262},[145,21520,457],{"class":258},[145,21522,21523],{"class":159},"\"❌ Failed: ",[145,21525,577],{"class":155},[145,21527,21412],{"class":262},[145,21529,19665],{"class":159},[145,21531,1331],{"class":262},[145,21533,583],{"class":155},[145,21535,454],{"class":159},[145,21537,577],{"class":155},[145,21539,5509],{"class":262},[145,21541,583],{"class":155},[145,21543,466],{"class":159},[145,21545,392],{"class":262},[145,21547,21548],{"class":147,"line":10752},[145,21549,21452],{"class":262},[145,21551,21552,21554,21556,21558],{"class":147,"line":10762},[145,21553,21457],{"class":159},[145,21555,21460],{"class":262},[145,21557,19368],{"class":159},[145,21559,10638],{"class":262},[145,21561,21562,21564,21566,21568],{"class":147,"line":10771},[145,21563,21469],{"class":159},[145,21565,21460],{"class":262},[145,21567,21040],{"class":159},[145,21569,10638],{"class":262},[145,21571,21572,21574,21576,21579],{"class":147,"line":10782},[145,21573,21480],{"class":159},[145,21575,454],{"class":262},[145,21577,21578],{"class":155},"None",[145,21580,469],{"class":262},[145,21582,21583,21585,21587,21589,21592,21594,21596,21598],{"class":147,"line":10789},[145,21584,21492],{"class":159},[145,21586,454],{"class":262},[145,21588,457],{"class":258},[145,21590,21591],{"class":159},"\"error: ",[145,21593,577],{"class":155},[145,21595,5509],{"class":262},[145,21597,583],{"class":155},[145,21599,5185],{"class":159},[145,21601,21602],{"class":147,"line":10795},[145,21603,21502],{"class":262},[145,21605,21606],{"class":147,"line":10801},[145,21607,357],{"emptyLinePlaceholder":58},[145,21609,21610],{"class":147,"line":10806},[145,21611,21612],{"class":174},"    # Summary\n",[145,21614,21615,21618,21620,21622,21624,21626,21628,21631,21633,21635,21637,21640,21642,21644,21646,21649],{"class":147,"line":10817},[145,21616,21617],{"class":262},"    success ",[145,21619,266],{"class":258},[145,21621,8543],{"class":155},[145,21623,424],{"class":262},[145,21625,5256],{"class":155},[145,21627,6197],{"class":258},[145,21629,21630],{"class":262}," r ",[145,21632,965],{"class":258},[145,21634,8557],{"class":262},[145,21636,403],{"class":258},[145,21638,21639],{"class":262}," r[",[145,21641,641],{"class":159},[145,21643,14725],{"class":262},[145,21645,752],{"class":258},[145,21647,21648],{"class":159}," \"success\"",[145,21650,392],{"class":262},[145,21652,21653,21655,21657,21659,21661,21663,21666,21668,21671,21673,21675,21677,21680,21682,21685],{"class":147,"line":10828},[145,21654,878],{"class":155},[145,21656,424],{"class":262},[145,21658,457],{"class":258},[145,21660,466],{"class":159},[145,21662,1476],{"class":155},[145,21664,21665],{"class":159},"📊 Complete: ",[145,21667,577],{"class":155},[145,21669,21670],{"class":262},"success",[145,21672,583],{"class":155},[145,21674,1003],{"class":159},[145,21676,6073],{"class":155},[145,21678,21679],{"class":262},"(results)",[145,21681,583],{"class":155},[145,21683,21684],{"class":159}," videos generated\"",[145,21686,392],{"class":262},[145,21688,21689,21691],{"class":147,"line":10839},[145,21690,1512],{"class":258},[145,21692,8614],{"class":262},[145,21694,21695],{"class":147,"line":10848},[145,21696,357],{"emptyLinePlaceholder":58},[145,21698,21699],{"class":147,"line":10853},[145,21700,357],{"emptyLinePlaceholder":58},[145,21702,21703],{"class":147,"line":10858},[145,21704,21705],{"class":174},"# Run it\n",[145,21707,21708,21711,21713,21716,21719],{"class":147,"line":10867},[145,21709,21710],{"class":262},"results ",[145,21712,266],{"class":258},[145,21714,21715],{"class":262}," process_catalog(",[145,21717,21718],{"class":159},"\"products.csv\"",[145,21720,392],{"class":262},[11,21722,21723],{},"El pipeline opera en dos fases. La Fase 1 envía todas las tareas rápidamente (con limitación de velocidad), almacenando los IDs de tarea. La Fase 2 consulta cada tarea y descarga el resultado. Esto maximiza el paralelismo — todos los videos se generan simultáneamente del lado del servidor.",[92,21725,21727],{"id":21726},"uso-de-callbacks-en-lugar-de-polling","Uso de callbacks en lugar de polling",[11,21729,21730,21731,21733,21734,21737],{},"Para catálogos más grandes (más de 100 productos), el polling se vuelve ineficiente. Use el parámetro ",[28,21732,3416],{}," para recibir un webhook cuando cada video se complete. Consulte la ",[37,21735,21736],{"href":14180},"documentación de la API para parámetros de callback"," para la especificación completa del payload del webhook.",[136,21739,21741],{"className":326,"code":21740,"language":328,"meta":141,"style":141},"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,21742,21743,21751,21761,21772,21783,21793,21803,21813,21822],{"__ignoreMap":141},[145,21744,21745,21747,21749],{"class":147,"line":148},[145,21746,3476],{"class":262},[145,21748,266],{"class":258},[145,21750,445],{"class":262},[145,21752,21753,21755,21757,21759],{"class":147,"line":166},[145,21754,3485],{"class":159},[145,21756,454],{"class":262},[145,21758,1083],{"class":159},[145,21760,469],{"class":262},[145,21762,21763,21765,21767,21770],{"class":147,"line":178},[145,21764,15181],{"class":159},[145,21766,10632],{"class":262},[145,21768,21769],{"class":159},"\"https://your-cdn.com/products/item.jpg\"",[145,21771,10638],{"class":262},[145,21773,21774,21776,21778,21781],{"class":147,"line":187},[145,21775,3496],{"class":159},[145,21777,454],{"class":262},[145,21779,21780],{"class":159},"\"@Image1 is a product. Smooth rotation. Studio lighting.\"",[145,21782,469],{"class":262},[145,21784,21785,21787,21789,21791],{"class":147,"line":360},[145,21786,3508],{"class":159},[145,21788,454],{"class":262},[145,21790,3513],{"class":155},[145,21792,469],{"class":262},[145,21794,21795,21797,21799,21801],{"class":147,"line":366},[145,21796,3520],{"class":159},[145,21798,454],{"class":262},[145,21800,3525],{"class":159},[145,21802,469],{"class":262},[145,21804,21805,21807,21809,21811],{"class":147,"line":378},[145,21806,3532],{"class":159},[145,21808,454],{"class":262},[145,21810,1167],{"class":159},[145,21812,469],{"class":262},[145,21814,21815,21817,21819],{"class":147,"line":395},[145,21816,6314],{"class":159},[145,21818,454],{"class":262},[145,21820,21821],{"class":159},"\"https://your-server.com/webhooks/video-ready\"\n",[145,21823,21824],{"class":147,"line":400},[145,21825,486],{"class":262},[11,21827,21828],{},"Su endpoint de webhook recibe un POST con el objeto de tarea completado, incluyendo la URL del video. Esto elimina el polling por completo y le permite procesar resultados de forma asíncrona — descargar el video, actualizar su base de datos de productos y enviarlo a su CDN en un solo manejador de webhook.",[92,21830,21832],{"id":21831},"consejos-para-el-pipeline","Consejos para el pipeline",[97,21834,21835,21841,21847,21853,21863,21869],{},[73,21836,21837,21840],{},[23,21838,21839],{},"Limitación de velocidad:"," Mantenga las solicitudes a 1 por segundo. Las ráfagas de envíos pueden activar el throttling.",[73,21842,21843,21846],{},[23,21844,21845],{},"Expiración de URL del video:"," Descargue dentro de 24 horas. El pipeline anterior descarga inmediatamente, pero si usa callbacks, asegúrese de que su manejador de webhook descargue rápidamente.",[73,21848,21849,21852],{},[23,21850,21851],{},"Lógica de reintentos:"," Los errores de red ocurren. El pipeline reintenta envíos fallidos hasta dos veces con un backoff de 3 segundos.",[73,21854,21855,21858,21859,21862],{},[23,21856,21857],{},"Organice la salida:"," La convención de nombres ",[28,21860,21861],{},"{nombre-producto}_{estilo}.mp4"," mantiene su biblioteca de video navegable. Agregue la relación de aspecto al nombre del archivo si genera múltiples relaciones por producto.",[73,21864,21865,21868],{},[23,21866,21867],{},"Idempotencia:"," Rastree qué productos ya tienen videos. Antes de enviar una tarea, verifique si el archivo de salida ya existe. Esto previene la generación duplicada al re-ejecutar el pipeline después de fallos parciales.",[73,21870,21871,21874,21875,1580],{},[23,21872,21873],{},"Monitoreo de costos:"," Registre el número de videos generados por ejecución. A unos centavos por video, los costos se mantienen bajos, pero bucles descontrolados o CSVs mal configurados pueden enviar miles de solicitudes involuntariamente. Agregue un prompt de confirmación o un flag ",[28,21876,21877],{},"--dry-run",[92,21879,21881],{"id":21880},"escalando-más-allá-de-lo-básico","Escalando más allá de lo básico",[11,21883,21884],{},"Para catálogos de más de 1,000 SKUs, considere estas mejoras:",[11,21886,21887,21890,21891,21894],{},[23,21888,21889],{},"Polling concurrente."," El pipeline anterior consulta las tareas secuencialmente. Use ",[28,21892,21893],{},"concurrent.futures.ThreadPoolExecutor"," de Python para consultar múltiples tareas en paralelo, reduciendo el tiempo total transcurrido.",[11,21896,21897,21900,21901,21903],{},[23,21898,21899],{},"Seguimiento en base de datos."," Reemplace la lista ",[28,21902,2075],{}," en memoria con una base de datos SQLite o un archivo JSON simple que persista entre ejecuciones. Rastree IDs de tarea, estado de completación, rutas de archivos de salida y marcas de tiempo. Esto hace el pipeline reanudable después de interrupciones.",[11,21905,21906,21909],{},[23,21907,21908],{},"Carga a CDN."," Después de descargar, cargue automáticamente a su CDN (S3, CloudFront, Cloudflare R2) y almacene la URL pública. Esto elimina el paso manual de transferir archivos a su infraestructura de hosting.",[11,21911,21912,21915],{},[23,21913,21914],{},"Generación de metadatos."," Genere un manifiesto JSON junto con los videos, conteniendo nombre del producto, tipo de video, relación de aspecto, duración y URL del CDN. Este manifiesto alimenta directamente su CMS o sistema de gestión de información de producto (PIM) para actualizaciones automatizadas de listados.",[48,21917,21919],{"id":21918},"biblioteca-de-plantillas-de-prompts-para-e-commerce","Biblioteca de plantillas de prompts para e-commerce",[11,21921,21922,21923,1580],{},"Prompts listos para copiar y pegar para las categorías de producto de e-commerce más comunes. Cada plantilla está diseñada para el tipo de producto especificado y puede usarse directamente con cualquier foto de producto de esa categoría. Intercambie el nombre del producto en el placeholder ",[28,21924,20068],{},[136,21926,21928],{"className":326,"code":21927,"language":328,"meta":141,"style":141},"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,21929,21930,21939,21946,21952,21962,21967,21972,21977,21982,21986,21996,22006,22011,22018,22024,22033,22038,22043,22048,22052,22062,22072,22076,22083,22089,22098,22103,22108,22113,22118,22122,22132,22142,22146,22153,22159,22168,22173,22178,22183,22188,22192,22202,22212,22216,22223,22229,22238,22243,22248,22253,22257,22267,22277,22281,22288,22294,22303,22308,22313,22318,22322,22332,22342,22346,22353,22359,22368,22373,22378,22383,22387,22397,22407,22411,22418,22424,22433,22438,22443,22448,22452,22462,22472,22476,22480,22484,22488,22515,22520,22533,22541,22551,22557,22575,22585,22595,22605,22609,22615,22619,22623,22628,22637,22649,22661,22671],{"__ignoreMap":141},[145,21931,21932,21935,21937],{"class":147,"line":148},[145,21933,21934],{"class":155},"ECOMMERCE_PROMPTS",[145,21936,372],{"class":258},[145,21938,445],{"class":262},[145,21940,21941,21944],{"class":147,"line":166},[145,21942,21943],{"class":159},"    \"jewelry\"",[145,21945,1756],{"class":262},[145,21947,21948,21950],{"class":147,"line":178},[145,21949,1095],{"class":159},[145,21951,1098],{"class":262},[145,21953,21954,21957,21959],{"class":147,"line":187},[145,21955,21956],{"class":159},"            \"@Image1 is ",[145,21958,20068],{"class":155},[145,21960,21961],{"class":159},". Extreme close-up on a black velvet surface. \"\n",[145,21963,21964],{"class":147,"line":360},[145,21965,21966],{"class":159},"            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n",[145,21968,21969],{"class":147,"line":366},[145,21970,21971],{"class":159},"            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n",[145,21973,21974],{"class":147,"line":378},[145,21975,21976],{"class":159},"            \"field. The camera pulls back to reveal the full piece. Luxury \"\n",[145,21978,21979],{"class":147,"line":395},[145,21980,21981],{"class":159},"            \"jewelry advertisement quality.\"\n",[145,21983,21984],{"class":147,"line":400},[145,21985,1122],{"class":262},[145,21987,21988,21990,21992,21994],{"class":147,"line":415},[145,21989,1128],{"class":159},[145,21991,454],{"class":262},[145,21993,513],{"class":155},[145,21995,469],{"class":262},[145,21997,21998,22000,22002,22004],{"class":147,"line":432},[145,21999,1162],{"class":159},[145,22001,454],{"class":262},[145,22003,5943],{"class":159},[145,22005,469],{"class":262},[145,22007,22008],{"class":147,"line":437},[145,22009,22010],{"class":262},"    },\n",[145,22012,22013,22016],{"class":147,"line":448},[145,22014,22015],{"class":159},"    \"electronics\"",[145,22017,1756],{"class":262},[145,22019,22020,22022],{"class":147,"line":472},[145,22021,1095],{"class":159},[145,22023,1098],{"class":262},[145,22025,22026,22028,22030],{"class":147,"line":483},[145,22027,21956],{"class":159},[145,22029,20068],{"class":155},[145,22031,22032],{"class":159},". The device sits on a minimal desk setup. \"\n",[145,22034,22035],{"class":147,"line":489},[145,22036,22037],{"class":159},"            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n",[145,22039,22040],{"class":147,"line":494},[145,22041,22042],{"class":159},"            \"showing ports, buttons, and build quality from every angle. \"\n",[145,22044,22045],{"class":147,"line":499},[145,22046,22047],{"class":159},"            \"Clean, modern aesthetic. Tech product showcase.\"\n",[145,22049,22050],{"class":147,"line":519},[145,22051,1122],{"class":262},[145,22053,22054,22056,22058,22060],{"class":147,"line":525},[145,22055,1128],{"class":159},[145,22057,454],{"class":262},[145,22059,513],{"class":155},[145,22061,469],{"class":262},[145,22063,22064,22066,22068,22070],{"class":147,"line":536},[145,22065,1162],{"class":159},[145,22067,454],{"class":262},[145,22069,1167],{"class":159},[145,22071,469],{"class":262},[145,22073,22074],{"class":147,"line":541},[145,22075,22010],{"class":262},[145,22077,22078,22081],{"class":147,"line":552},[145,22079,22080],{"class":159},"    \"apparel\"",[145,22082,1756],{"class":262},[145,22084,22085,22087],{"class":147,"line":563},[145,22086,1095],{"class":159},[145,22088,1098],{"class":262},[145,22090,22091,22093,22095],{"class":147,"line":590},[145,22092,21956],{"class":159},[145,22094,20068],{"class":155},[145,22096,22097],{"class":159},". The garment is displayed on an invisible \"\n",[145,22099,22100],{"class":147,"line":602},[145,22101,22102],{"class":159},"            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n",[145,22104,22105],{"class":147,"line":608},[145,22106,22107],{"class":159},"            \"gentle airflow, showing drape and texture. Soft diffused \"\n",[145,22109,22110],{"class":147,"line":614},[145,22111,22112],{"class":159},"            \"studio lighting. Clean white background. Fashion e-commerce \"\n",[145,22114,22115],{"class":147,"line":625},[145,22116,22117],{"class":159},"            \"product video.\"\n",[145,22119,22120],{"class":147,"line":630},[145,22121,1122],{"class":262},[145,22123,22124,22126,22128,22130],{"class":147,"line":647},[145,22125,1128],{"class":159},[145,22127,454],{"class":262},[145,22129,3513],{"class":155},[145,22131,469],{"class":262},[145,22133,22134,22136,22138,22140],{"class":147,"line":668},[145,22135,1162],{"class":159},[145,22137,454],{"class":262},[145,22139,3537],{"class":159},[145,22141,469],{"class":262},[145,22143,22144],{"class":147,"line":688},[145,22145,22010],{"class":262},[145,22147,22148,22151],{"class":147,"line":693},[145,22149,22150],{"class":159},"    \"food_beverage\"",[145,22152,1756],{"class":262},[145,22154,22155,22157],{"class":147,"line":738},[145,22156,1095],{"class":159},[145,22158,1098],{"class":262},[145,22160,22161,22163,22165],{"class":147,"line":743},[145,22162,21956],{"class":159},[145,22164,20068],{"class":155},[145,22166,22167],{"class":159},". Steam rises gently. Camera pushes in slowly \"\n",[145,22169,22170],{"class":147,"line":760},[145,22171,22172],{"class":159},"            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n",[145,22174,22175],{"class":147,"line":769},[145,22176,22177],{"class":159},"            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n",[145,22179,22180],{"class":147,"line":784},[145,22181,22182],{"class":159},"            \"garnishes are visible in beautiful detail. Food photography \"\n",[145,22184,22185],{"class":147,"line":810},[145,22186,22187],{"class":159},"            \"in motion.\"\n",[145,22189,22190],{"class":147,"line":837},[145,22191,1122],{"class":262},[145,22193,22194,22196,22198,22200],{"class":147,"line":842},[145,22195,1128],{"class":159},[145,22197,454],{"class":262},[145,22199,3513],{"class":155},[145,22201,469],{"class":262},[145,22203,22204,22206,22208,22210],{"class":147,"line":848},[145,22205,1162],{"class":159},[145,22207,454],{"class":262},[145,22209,5943],{"class":159},[145,22211,469],{"class":262},[145,22213,22214],{"class":147,"line":853},[145,22215,22010],{"class":262},[145,22217,22218,22221],{"class":147,"line":858},[145,22219,22220],{"class":159},"    \"furniture\"",[145,22222,1756],{"class":262},[145,22224,22225,22227],{"class":147,"line":869},[145,22226,1095],{"class":159},[145,22228,1098],{"class":262},[145,22230,22231,22233,22235],{"class":147,"line":875},[145,22232,21956],{"class":159},[145,22234,20068],{"class":155},[145,22236,22237],{"class":159},". Placed in a styled modern living room with \"\n",[145,22239,22240],{"class":147,"line":900},[145,22241,22242],{"class":159},"            \"natural light streaming through large windows. Camera dollies \"\n",[145,22244,22245],{"class":147,"line":921},[145,22246,22247],{"class":159},"            \"slowly around the piece, showing form and proportion in context. \"\n",[145,22249,22250],{"class":147,"line":927},[145,22251,22252],{"class":159},"            \"Warm afternoon light. Interior design showcase quality.\"\n",[145,22254,22255],{"class":147,"line":932},[145,22256,1122],{"class":262},[145,22258,22259,22261,22263,22265],{"class":147,"line":956},[145,22260,1128],{"class":159},[145,22262,454],{"class":262},[145,22264,513],{"class":155},[145,22266,469],{"class":262},[145,22268,22269,22271,22273,22275],{"class":147,"line":981},[145,22270,1162],{"class":159},[145,22272,454],{"class":262},[145,22274,1167],{"class":159},[145,22276,469],{"class":262},[145,22278,22279],{"class":147,"line":987},[145,22280,22010],{"class":262},[145,22282,22283,22286],{"class":147,"line":992},[145,22284,22285],{"class":159},"    \"cosmetics\"",[145,22287,1756],{"class":262},[145,22289,22290,22292],{"class":147,"line":1009},[145,22291,1095],{"class":159},[145,22293,1098],{"class":262},[145,22295,22296,22298,22300],{"class":147,"line":1044},[145,22297,21956],{"class":159},[145,22299,20068],{"class":155},[145,22301,22302],{"class":159},". The product sits on a marble surface with \"\n",[145,22304,22305],{"class":147,"line":1049},[145,22306,22307],{"class":159},"            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n",[145,22309,22310],{"class":147,"line":1054},[145,22311,22312],{"class":159},"            \"the product, showing color and texture. Macro close-up of the \"\n",[145,22314,22315],{"class":147,"line":1065},[145,22316,22317],{"class":159},"            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n",[145,22319,22320],{"class":147,"line":1075},[145,22321,1122],{"class":262},[145,22323,22324,22326,22328,22330],{"class":147,"line":1092},[145,22325,1128],{"class":159},[145,22327,454],{"class":262},[145,22329,3513],{"class":155},[145,22331,469],{"class":262},[145,22333,22334,22336,22338,22340],{"class":147,"line":1101},[145,22335,1162],{"class":159},[145,22337,454],{"class":262},[145,22339,3537],{"class":159},[145,22341,469],{"class":262},[145,22343,22344],{"class":147,"line":1107},[145,22345,22010],{"class":262},[145,22347,22348,22351],{"class":147,"line":1113},[145,22349,22350],{"class":159},"    \"sports_gear\"",[145,22352,1756],{"class":262},[145,22354,22355,22357],{"class":147,"line":1119},[145,22356,1095],{"class":159},[145,22358,1098],{"class":262},[145,22360,22361,22363,22365],{"class":147,"line":1125},[145,22362,21956],{"class":159},[145,22364,20068],{"class":155},[145,22366,22367],{"class":159},". Dynamic presentation against a dark \"\n",[145,22369,22370],{"class":147,"line":1142},[145,22371,22372],{"class":159},"            \"background with dramatic side lighting. The product rotates \"\n",[145,22374,22375],{"class":147,"line":1159},[145,22376,22377],{"class":159},"            \"with energy — quick cuts between angles showing key features. \"\n",[145,22379,22380],{"class":147,"line":1176},[145,22381,22382],{"class":159},"            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n",[145,22384,22385],{"class":147,"line":1189},[145,22386,1122],{"class":262},[145,22388,22389,22391,22393,22395],{"class":147,"line":1195},[145,22390,1128],{"class":159},[145,22392,454],{"class":262},[145,22394,3513],{"class":155},[145,22396,469],{"class":262},[145,22398,22399,22401,22403,22405],{"class":147,"line":1200},[145,22400,1162],{"class":159},[145,22402,454],{"class":262},[145,22404,1167],{"class":159},[145,22406,469],{"class":262},[145,22408,22409],{"class":147,"line":1212},[145,22410,22010],{"class":262},[145,22412,22413,22416],{"class":147,"line":1222},[145,22414,22415],{"class":159},"    \"home_decor\"",[145,22417,1756],{"class":262},[145,22419,22420,22422],{"class":147,"line":1241},[145,22421,1095],{"class":159},[145,22423,1098],{"class":262},[145,22425,22426,22428,22430],{"class":147,"line":1257},[145,22427,21956],{"class":159},[145,22429,20068],{"class":155},[145,22431,22432],{"class":159},". Displayed in a curated shelf vignette with \"\n",[145,22434,22435],{"class":147,"line":1271},[145,22436,22437],{"class":159},"            \"complementary objects. Soft natural light. Camera slowly racks \"\n",[145,22439,22440],{"class":147,"line":1277},[145,22441,22442],{"class":159},"            \"focus from background to the product. Cozy, aspirational \"\n",[145,22444,22445],{"class":147,"line":1286},[145,22446,22447],{"class":159},"            \"interior styling. Lifestyle brand aesthetic.\"\n",[145,22449,22450],{"class":147,"line":1300},[145,22451,1122],{"class":262},[145,22453,22454,22456,22458,22460],{"class":147,"line":1305},[145,22455,1128],{"class":159},[145,22457,454],{"class":262},[145,22459,3513],{"class":155},[145,22461,469],{"class":262},[145,22463,22464,22466,22468,22470],{"class":147,"line":1311},[145,22465,1162],{"class":159},[145,22467,454],{"class":262},[145,22469,5943],{"class":159},[145,22471,469],{"class":262},[145,22473,22474],{"class":147,"line":1340},[145,22475,22010],{"class":262},[145,22477,22478],{"class":147,"line":1374},[145,22479,486],{"class":262},[145,22481,22482],{"class":147,"line":1406},[145,22483,357],{"emptyLinePlaceholder":58},[145,22485,22486],{"class":147,"line":1411},[145,22487,357],{"emptyLinePlaceholder":58},[145,22489,22490,22492,22495,22498,22500,22503,22505,22507,22509,22511,22513],{"class":147,"line":1417},[145,22491,502],{"class":258},[145,22493,22494],{"class":151}," generate_from_template",[145,22496,22497],{"class":262},"(category: ",[145,22499,8443],{"class":155},[145,22501,22502],{"class":262},", name: ",[145,22504,8443],{"class":155},[145,22506,20373],{"class":262},[145,22508,8443],{"class":155},[145,22510,15639],{"class":262},[145,22512,8568],{"class":155},[145,22514,412],{"class":262},[145,22516,22517],{"class":147,"line":1434},[145,22518,22519],{"class":159},"    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n",[145,22521,22522,22525,22527,22530],{"class":147,"line":1439},[145,22523,22524],{"class":262},"    template ",[145,22526,266],{"class":258},[145,22528,22529],{"class":155}," ECOMMERCE_PROMPTS",[145,22531,22532],{"class":262},"[category]\n",[145,22534,22535,22537,22539],{"class":147,"line":1445},[145,22536,1068],{"class":262},[145,22538,266],{"class":258},[145,22540,445],{"class":262},[145,22542,22543,22545,22547,22549],{"class":147,"line":1465},[145,22544,1078],{"class":159},[145,22546,454],{"class":262},[145,22548,1083],{"class":159},[145,22550,469],{"class":262},[145,22552,22553,22555],{"class":147,"line":1493},[145,22554,2503],{"class":159},[145,22556,20462],{"class":262},[145,22558,22559,22561,22564,22566,22569,22571,22573],{"class":147,"line":1504},[145,22560,1095],{"class":159},[145,22562,22563],{"class":262},": template[",[145,22565,5723],{"class":159},[145,22567,22568],{"class":262},"].format(",[145,22570,20472],{"class":593},[145,22572,266],{"class":258},[145,22574,20477],{"class":262},[145,22576,22577,22579,22581,22583],{"class":147,"line":1509},[145,22578,1128],{"class":159},[145,22580,22563],{"class":262},[145,22582,5768],{"class":159},[145,22584,10638],{"class":262},[145,22586,22587,22589,22591,22593],{"class":147,"line":1518},[145,22588,1145],{"class":159},[145,22590,454],{"class":262},[145,22592,3525],{"class":159},[145,22594,469],{"class":262},[145,22596,22597,22599,22601,22603],{"class":147,"line":1523},[145,22598,1162],{"class":159},[145,22600,22563],{"class":262},[145,22602,5971],{"class":159},[145,22604,10638],{"class":262},[145,22606,22607],{"class":147,"line":1528},[145,22608,1192],{"class":262},[145,22610,22611,22613],{"class":147,"line":1544},[145,22612,1512],{"class":258},[145,22614,18080],{"class":262},[145,22616,22617],{"class":147,"line":10165},[145,22618,357],{"emptyLinePlaceholder":58},[145,22620,22621],{"class":147,"line":10211},[145,22622,357],{"emptyLinePlaceholder":58},[145,22624,22625],{"class":147,"line":10216},[145,22626,22627],{"class":174},"# Example usage\n",[145,22629,22630,22632,22634],{"class":147,"line":10221},[145,22631,12031],{"class":262},[145,22633,266],{"class":258},[145,22635,22636],{"class":262}," generate_from_template(\n",[145,22638,22639,22642,22644,22647],{"class":147,"line":10230},[145,22640,22641],{"class":593},"    category",[145,22643,266],{"class":258},[145,22645,22646],{"class":159},"\"jewelry\"",[145,22648,469],{"class":262},[145,22650,22651,22654,22656,22659],{"class":147,"line":10236},[145,22652,22653],{"class":593},"    name",[145,22655,266],{"class":258},[145,22657,22658],{"class":159},"\"18K gold pendant necklace with emerald\"",[145,22660,469],{"class":262},[145,22662,22663,22666,22668],{"class":147,"line":10245},[145,22664,22665],{"class":593},"    image_url",[145,22667,266],{"class":258},[145,22669,22670],{"class":159},"\"https://your-cdn.com/products/emerald-pendant.jpg\"\n",[145,22672,22673],{"class":147,"line":10266},[145,22674,392],{"class":262},[11,22676,22677,22678,22681],{},"Estas plantillas son puntos de partida. Ajuste las descripciones de iluminación y los movimientos de cámara para que coincidan con la identidad visual de su marca. La ",[37,22679,22680],{"href":1578},"guía completa de prompts"," cubre técnicas avanzadas para ajustar la salida de Seedance 2.0.",[92,22683,22685],{"id":22684},"personalización-de-plantillas-para-su-marca","Personalización de plantillas para su marca",[11,22687,22688],{},"Cada marca tiene un lenguaje visual. Apple usa entornos blancos limpios con movimientos de cámara precisos y lentos. Nike usa iluminación dinámica de alto contraste con cortes rápidos. Sus videos de producto deben reflejar la estética establecida de su marca.",[11,22690,22691],{},"Modifique las plantillas a lo largo de estos ejes:",[97,22693,22694,22700,22706,22712],{},[73,22695,22696,22699],{},[23,22697,22698],{},"Tono de iluminación:"," Cálido (dorado, ámbar) para marcas artesanales/de lujo. Frío (azul, plateado) para tecnología. Neutro (blanco, suave) para marcas minimalistas.",[73,22701,22702,22705],{},[23,22703,22704],{},"Velocidad de cámara:"," Movimientos lentos y deliberados para posicionamiento premium. Movimientos más rápidos y dinámicos para marcas juveniles o deportivas.",[73,22707,22708,22711],{},[23,22709,22710],{},"Fondo:"," Los fondos oscuros señalan lujo. Los fondos blancos señalan limpio/moderno. Los fondos ambientales señalan estilo de vida.",[73,22713,22714,22717],{},[23,22715,22716],{},"Vocabulario de ritmo:"," \"Slow, measured\" vs. \"dynamic, energetic\" vs. \"calm, meditative\" — estas palabras influyen directamente en el tempo de salida del modelo.",[11,22719,22720],{},"Construya el prefijo de prompt maestro de su marca — un conjunto de términos que se anteponen a cada prompt de video de producto — y aplíquelo consistentemente en todo su catálogo. Esto crea coherencia visual entre cientos de videos de producto, imitando la consistencia que obtendría de una única configuración de estudio.",[48,22722,13096],{"id":8835},[92,22724,22726],{"id":22725},"cuánto-cuesta-generar-un-video-de-producto","¿Cuánto cuesta generar un video de producto?",[11,22728,22729,22730,22735],{},"El precio depende de la duración y la configuración de calidad. Un video estándar de 8 segundos a calidad 1080p cuesta unos centavos. Generar 500 videos de producto para un catálogo completo queda muy por debajo de $100 en la mayoría de las configuraciones. Consulte los ",[37,22731,22734],{"href":22732,"rel":22733},"https://evolink.ai/pricing",[41],"precios de EvoLink"," para las tarifas actuales. Comparado con los $500–$2,000 por video que cobran los estudios, el costo de la API es efectivamente insignificante a cualquier escala.",[92,22737,22739],{"id":22738},"puedo-usar-fotos-de-modelos-humanos-reales-como-entrada","¿Puedo usar fotos de modelos humanos reales como entrada?",[11,22741,22742],{},"Seedance 2.0 tiene restricciones en la generación de rostros humanos realistas para prevenir el uso indebido de deepfakes. Las fotos solo de productos funcionan sin limitaciones. Si su producto necesita mostrarse con una persona — ropa en un modelo, un reloj en una muñeca — use referencias humanas ilustradas o estilizadas en lugar de retratos fotorrealistas. Alternativamente, describa el elemento humano en el prompt (por ejemplo, \"a hand reaches into frame\") y deje que el modelo lo genere en lugar de proporcionar una foto de rostro como entrada.",[92,22744,22746],{"id":22745},"cuánto-tiempo-toma-la-generación-de-video","¿Cuánto tiempo toma la generación de video?",[11,22748,22749,22750,22752],{},"El tiempo típico de generación es de 60 a 180 segundos dependiendo de la duración y la configuración de calidad. Un video de 5 segundos a 720p se completa en aproximadamente un minuto. Un video de 15 segundos a 1080p puede tomar hasta tres minutos. El pipeline por lotes en esta guía maneja el tiempo automáticamente a través del polling. Para sistemas de producción, use el parámetro ",[28,22751,3416],{}," para recibir un webhook al completarse en lugar de hacer polling.",[92,22754,22756],{"id":22755},"puedo-agregar-logos-de-marca-o-superposiciones-de-texto","¿Puedo agregar logos de marca o superposiciones de texto?",[11,22758,22759],{},"Dos enfoques funcionan. Primero, incluya descripciones de texto en su prompt — \"Brand name fades in at the end\" o \"Logo watermark in lower right corner.\" El modelo puede generar elementos similares a texto, aunque la tipografía precisa no está garantizada. Segundo, y más confiablemente, genere el video sin texto y componga su logo, títulos o tercios inferiores en posproducción usando FFmpeg, After Effects o su herramienta de edición de video preferida. El segundo enfoque le da control exacto sobre los activos de marca.",[92,22761,22763],{"id":22762},"la-calidad-del-video-es-suficiente-para-uso-comercial","¿La calidad del video es suficiente para uso comercial?",[11,22765,22766],{},"A calidad 1080p, la salida es adecuada para listados de productos, anuncios en redes sociales y secciones hero de sitios web. La calidad visual iguala o supera lo que la mayoría de los equipos de e-commerce producen con configuraciones de estudio básicas. Para campañas de marca de alta gama o televisión, es posible que desee usar el video generado por IA como previsualizacion o punto de partida, luego refinar con posproducción tradicional. Para la gran mayoría de los casos de uso de e-commerce — Amazon, Shopify, anuncios sociales, campañas de email — la salida está lista para producción.",[92,22768,22770],{"id":22769},"qué-formato-de-imagen-y-resolución-funciona-mejor-para-la-entrada","¿Qué formato de imagen y resolución funciona mejor para la entrada?",[11,22772,22773],{},"JPEG y PNG funcionan ambos. PNG con transparencia es ideal para productos que necesitan reemplazo limpio de fondo. Para resolución, proporcione la imagen fuente de la mayor calidad disponible — al menos 1024x1024 píxeles. El modelo extrae más detalle de entradas de mayor resolución, lo cual es especialmente notable en videos de primer plano macro y rotación. Evite JPEGs fuertemente comprimidos con artefactos visibles, ya que estos se trasladan al video generado.",[92,22775,22777],{"id":22776},"puedo-generar-videos-con-audio-o-música","¿Puedo generar videos con audio o música?",[11,22779,22780,22781,22783,22784,22786,22787,22791],{},"Seedance 2.0 soporta el parámetro ",[28,22782,1635],{},", que agrega efectos de sonido contextuales al video. Para videos de producto, sonidos ambientales de estudio o swooshes sutiles pueden mejorar la sensación premium. Sin embargo, la mayoría de las plataformas de e-commerce reproducen video sin sonido, por lo que la calidad visual importa mucho más. Si necesita música específica o voz en off, agréguelos en posproducción. La API también soporta ",[28,22785,3399],{}," para generación guiada por audio — consulte la ",[37,22788,22790],{"href":22789},"/docs/multimodal-reference","documentación de referencia multimodal"," para más detalles.",[92,22793,22795],{"id":22794},"cómo-integro-esto-con-shopify-o-amazon","¿Cómo integro esto con Shopify o Amazon?",[11,22797,22798,22799,22801,22802,22804],{},"El flujo de trabajo es: generar video → descargar MP4 → subir a su plataforma. Para Shopify, suba videos directamente a los medios de producto a través del admin o la API de Shopify. Para Amazon, suba a través de la sección \"Manage Videos\" de Seller Central o mediante la SP-API. Para automatizar el ciclo completo, use el pipeline por lotes con ",[28,22800,3416],{}," — su manejador de webhook puede descargar el video y enviarlo a la API de su plataforma automáticamente. La ",[37,22803,22790],{"href":22789}," cubre el formato completo de respuesta de la API para construir integraciones.",[48,22806,22808],{"id":22807},"del-estudio-a-la-api-su-nuevo-pipeline-de-video","Del estudio a la API: su nuevo pipeline de video",[11,22810,22811],{},"Cinco tipos de video cubren el espectro completo de video de producto para e-commerce: rotaciones 360° para páginas de producto, tomas heroicas para lanzamientos, contexto de estilo de vida para conexión emocional, primeros planos macro para percepción de calidad, y revelaciones de unboxing para contenido social. Cada tipo requiere una foto de producto y una llamada a la API.",[11,22813,22814],{},"El pipeline por lotes convierte un catálogo CSV en una biblioteca de video completa. La exportación multiplataforma genera cada relación de aspecto que sus canales necesitan en un solo paso. La biblioteca de plantillas de prompts le da puntos de partida listos para copiar y pegar para cualquier categoría de producto.",[11,22816,22817],{},"El flujo de trabajo completo — desde la foto de producto hasta el video publicado en cada canal de ventas — se comprime de semanas a horas. Un solo desarrollador puede operar un pipeline de video que anteriormente requería un equipo de producción, un estudio y un editor de posproducción.",[11,22819,22820],{},"Esta no es una mejora incremental sobre la producción de video tradicional. Es un cambio estructural. El cuello de botella en el video de e-commerce nunca fue la visión creativa — fue el costo y la logística. Cuando un solo video cuesta centavos y toma dos minutos, la pregunta cambia de \"¿qué productos merecen video?\" a \"¿por qué no tiene video cada producto?\"",[11,22822,22823],{},"Comience con un producto. Genere un video de rotación. Vea el resultado en tres minutos. Luego escale a su catálogo completo. La API es la misma ya sea que esté generando un video o diez mil.",[11,22825,22826,22827],{},"Reemplace su pipeline de producción de video. ",[37,22828,22830],{"href":211,"rel":22829},[41],"Regístrese gratis en EvoLink →",[45,22832],{},[11,22834,22835],{},[2434,22836,22837,22838,22841,22842,22841,22845,22841,22848],{},"Anteriormente en esta serie: ",[37,22839,22840],{"href":1578},"Guía de prompts de Seedance 2.0"," · ",[37,22843,22844],{"href":2781},"Guía de @Tags multimodal",[37,22846,22847],{"href":3672},"Guía de movimientos de cámara",[37,22849,22850],{"href":3196},"Tutorial de imagen a video",[11008,22852,13233],{},{"title":141,"searchDepth":166,"depth":166,"links":22854},[22855,22858,22859,22863,22867,22871,22875,22880,22885,22890,22893,22903],{"id":17202,"depth":166,"text":17203,"children":22856},[22857],{"id":17327,"depth":178,"text":17328},{"id":17337,"depth":166,"text":17338},{"id":17955,"depth":166,"text":17956,"children":22860},[22861,22862],{"id":18118,"depth":178,"text":18119},{"id":18183,"depth":178,"text":18184},{"id":18224,"depth":166,"text":18225,"children":22864},[22865,22866],{"id":18356,"depth":178,"text":18357},{"id":18399,"depth":178,"text":18400},{"id":18442,"depth":166,"text":18443,"children":22868},[22869,22870],{"id":18614,"depth":178,"text":18615},{"id":18704,"depth":178,"text":18705},{"id":18752,"depth":166,"text":18753,"children":22872},[22873,22874],{"id":18886,"depth":178,"text":18887},{"id":18925,"depth":178,"text":18926},{"id":18983,"depth":166,"text":18984,"children":22876},[22877,22878,22879],{"id":19120,"depth":178,"text":19121},{"id":19154,"depth":178,"text":19155},{"id":19164,"depth":178,"text":19165},{"id":19203,"depth":166,"text":19204,"children":22881},[22882,22883,22884],{"id":19342,"depth":178,"text":19343},{"id":19799,"depth":178,"text":19800},{"id":19809,"depth":178,"text":19810},{"id":19854,"depth":166,"text":19855,"children":22886},[22887,22888,22889],{"id":21726,"depth":178,"text":21727},{"id":21831,"depth":178,"text":21832},{"id":21880,"depth":178,"text":21881},{"id":21918,"depth":166,"text":21919,"children":22891},[22892],{"id":22684,"depth":178,"text":22685},{"id":8835,"depth":166,"text":13096,"children":22894},[22895,22896,22897,22898,22899,22900,22901,22902],{"id":22725,"depth":178,"text":22726},{"id":22738,"depth":178,"text":22739},{"id":22745,"depth":178,"text":22746},{"id":22755,"depth":178,"text":22756},{"id":22762,"depth":178,"text":22763},{"id":22769,"depth":178,"text":22770},{"id":22776,"depth":178,"text":22777},{"id":22794,"depth":178,"text":22795},{"id":22807,"depth":166,"text":22808},"Genera videos de producto para e-commerce a partir de fotos con Seedance 2.0 API. 5 tipos de video, pipeline por lotes, exportación multiplataforma. Código Python completo incluido.",{"date":22906,"image":22907,"seoTitle":22908},"2026-02-21","/s7-hero-ecommerce-product-videos.webp","Crea videos de producto con IA para e-commerce | Seedance 2.0 API","/es/blog/seedance-2-ecommerce-product-videos",{"title":17188,"description":22904},"es/blog/seedance-2-ecommerce-product-videos","hC2Fxk5ndeJnWNEPW_IbjQQvrjs3uxk7xeFHHLbTkOY",{"id":22914,"title":22915,"body":22916,"description":30217,"extension":11069,"meta":30218,"navigation":58,"path":30221,"seo":30222,"stem":30223,"__hash__":30224},"content/es/blog/seedance-2-image-to-video-api.md","API de Imagen a Video de Seedance 2.0: Anima cualquier imagen con control total",{"type":8,"value":22917,"toc":30146},[22918,22922,22925,22932,22934,22938,22941,22948,22952,23073,23079,23085,23091,23095,23098,23107,23110,23114,23121,23125,23128,23130,23134,23140,23144,23158,23167,23171,23183,23186,23190,23269,23276,23285,23289,23292,23578,23591,23597,23599,23603,23606,23609,23619,23645,23652,23656,24186,24197,24201,24205,24213,24219,24223,24228,24235,24238,24242,24245,24250,24256,24261,24267,24282,24285,24338,24347,24349,24353,24360,24363,24369,24383,24390,24394,24397,24429,24433,24949,24953,24958,24965,24968,24972,24978,24988,24994,25000,25045,25047,25051,25057,25061,25067,25073,25076,25082,25085,25089,25666,25670,25674,25681,25687,25691,25696,25791,25795,25800,25807,25812,25820,25822,25826,25836,25840,25846,26301,26305,26309,26316,26319,26323,26329,26338,26344,26353,26412,26421,26425,26428,27420,27427,27431,27434,27440,27446,27457,27459,27463,27470,27474,27477,27494,27497,27508,27512,27515,28044,28048,28052,28059,28062,28066,28072,28277,28281,28285,28292,28295,28299,28302,28889,28895,28899,28902,29061,29063,29067,29070,29074,29085,29091,29096,29159,29163,29168,29173,29178,29241,29245,29250,29255,29260,29307,29311,29316,29321,29338,29343,29382,29441,29445,29453,29461,29532,29536,29541,29546,29551,29699,29701,29705,29710,29715,29724,29777,29779,29783,29786,29989,30010,30012,30014,30018,30021,30025,30034,30038,30044,30048,30063,30067,30076,30080,30089,30093,30099,30101,30105,30112,30115,30121,30129,30131,30144],[22919,22920,22915],"h1",{"id":22921},"api-de-imagen-a-video-de-seedance-20-anima-cualquier-imagen-con-control-total",[11,22923,22924],{},"Una sola foto de producto almacenada en su disco duro genera cero interacción. Un video de 10 segundos de ese producto rotando bajo iluminación de estudio, con sonido sincronizado, genera clics, compartidos y ventas. La API de imagen a video de Seedance 2.0 convierte cualquier imagen estática en un video completamente controlable, mediante una sola solicitud POST.",[11,22926,22927,22928,22931],{},"Esta guía cubre tres modos distintos de imagen a video: animación de imagen única, interpolación de primer y último fotograma, y composición multi-imagen con referencias ",[28,22929,22930],{},"@tag",". Cada sección incluye código Python completo y ejecutable, demos reales de salida y los prompts exactos que los generaron.",[45,22933],{},[48,22935,22937],{"id":22936},"qué-hace-diferente-a-la-imagen-a-video-de-seedance-20","Qué hace diferente a la imagen a video de Seedance 2.0",[11,22939,22940],{},"Todas las principales plataformas de video con IA ofrecen ahora alguna forma de generación de imagen a video. Sora acepta una sola imagen como fotograma inicial. Kling proporciona animación de imágenes con control básico de movimiento. Veo 2 soporta condicionamiento por imagen para guía de estilo. Todas resuelven el mismo problema superficial: convertir una imagen en píxeles en movimiento.",[11,22942,22943,22944,22947],{},"Seedance 2.0 resuelve un problema completamente diferente. Le ofrece ",[23,22945,22946],{},"control composicional"," sobre múltiples imágenes dentro de una sola solicitud de generación, y lo hace a través de un sistema de etiquetado que ninguna otra API iguala actualmente.",[92,22949,22951],{"id":22950},"las-diferencias-fundamentales","Las diferencias fundamentales",[1849,22953,22954,22969],{},[1852,22955,22956],{},[1855,22957,22958,22961,22963,22965,22967],{},[1858,22959,22960],{},"Capacidad",[1858,22962,17032],{},[1858,22964,13692],{},[1858,22966,17016],{},[1858,22968,17198],{},[1865,22970,22971,22984,22998,23012,23031,23045,23058],{},[1855,22972,22973,22976,22978,22980,22982],{},[1870,22974,22975],{},"Imagen única a video",[1870,22977,13646],{},[1870,22979,13646],{},[1870,22981,13646],{},[1870,22983,13646],{},[1855,22985,22986,22989,22991,22994,22996],{},[1870,22987,22988],{},"Control de primer y último fotograma",[1870,22990,13629],{},[1870,22992,22993],{},"✅ (limitado)",[1870,22995,13629],{},[1870,22997,13646],{},[1855,22999,23000,23003,23005,23007,23009],{},[1870,23001,23002],{},"Composición multi-imagen",[1870,23004,13629],{},[1870,23006,13629],{},[1870,23008,13629],{},[1870,23010,23011],{},"✅ (hasta 9 imágenes)",[1855,23013,23014,23017,23019,23021,23023],{},[1870,23015,23016],{},"Asignación de rol por imagen",[1870,23018,13629],{},[1870,23020,13629],{},[1870,23022,13629],{},[1870,23024,23025,23026,290,23028,23030],{},"✅ (",[28,23027,2722],{},[28,23029,2732],{},"...)",[1855,23032,23033,23036,23038,23040,23042],{},[1870,23034,23035],{},"Medios mixtos (imagen + video + audio)",[1870,23037,13629],{},[1870,23039,13629],{},[1870,23041,13629],{},[1870,23043,23044],{},"✅ (hasta 12 archivos)",[1855,23046,23047,23050,23052,23054,23056],{},[1870,23048,23049],{},"Generación nativa de audio",[1870,23051,13629],{},[1870,23053,13629],{},[1870,23055,13629],{},[1870,23057,13646],{},[1855,23059,23060,23063,23066,23068,23071],{},[1870,23061,23062],{},"Acceso prioritario por API",[1870,23064,23065],{},"Lista de espera",[1870,23067,13646],{},[1870,23069,23070],{},"Limitado",[1870,23072,13646],{},[11,23074,23075,23076,23078],{},"El sistema ",[28,23077,22930],{}," es donde Seedance 2.0 toma la delantera. Cuando sube tres imágenes, puede escribir un prompt como:",[136,23080,23083],{"className":23081,"code":23082,"language":1999},[1997],"@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,23084,23082],{"__ignoreMap":141},[11,23086,23087,23088,1580],{},"Cada imagen recibe un rol semántico específico. El modelo no adivina cuál imagen es el personaje y cuál es el fondo: usted se lo indica explícitamente. Para una exploración detallada de este sistema de etiquetado, consulte la ",[37,23089,23090],{"href":2781},"Guía de @Tags Multimodales",[92,23092,23094],{"id":23093},"por-qué-los-tags-importan-para-los-desarrolladores","Por qué los @Tags importan para los desarrolladores",[11,23096,23097],{},"Si ha trabajado con otras APIs de imagen a video, conoce la frustración: sube múltiples imágenes y espera que el modelo descifre su intención. A veces usa la imagen de fondo como personaje. A veces mezcla todas las imágenes en un resultado incoherente. No hay forma de depurar esto porque no tiene control sobre cómo el modelo interpreta cada entrada.",[11,23099,23075,23100,23102,23103,23106],{},[28,23101,22930],{}," elimina esta incertidumbre. Es esencialmente un sistema de vinculación de variables: usted nombra cada entrada y la referencia explícitamente en sus instrucciones. Esto hace que la generación de imagen a video sea ",[23,23104,23105],{},"determinista y reproducible",". Las mismas entradas, las mismas etiquetas, el mismo prompt producen la misma interpretación semántica cada vez.",[11,23108,23109],{},"Para pipelines de producción, esta es la diferencia entre \"probar y ver qué pasa\" y \"configurar y desplegar\". Puede crear plantillas, validar salidas e iterar sobre elementos específicos sin que toda la composición cambie de forma impredecible.",[92,23111,23113],{"id":23112},"el-audio-nativo-cambia-el-resultado","El audio nativo cambia el resultado",[11,23115,23116,23117,23120],{},"La mayoría de las herramientas de IA para imagen a video producen clips silenciosos. Luego necesita un paso separado de generación de audio, una llamada API adicional y un paso de edición de video para combinarlos. Seedance 2.0 genera audio sincronizado como parte de la misma solicitud configurando ",[28,23118,23119],{},"generate_audio: true",". Las pisadas coinciden con el movimiento al caminar. Los sonidos del viento coinciden con escenas al aire libre. Esto elimina un paso completo de postproducción.",[92,23122,23124],{"id":23123},"lo-que-no-hará","Lo que no hará",[11,23126,23127],{},"Seedance 2.0 no admite rostros humanos realistas en la generación de imagen a video. Si su imagen de entrada contiene un rostro humano fotorrealista, la API rechazará la solicitud automáticamente. Los personajes ilustrados, rostros estilizados, personajes de anime y retratos no fotorrealistas funcionan perfectamente. Esta es una restricción de seguridad deliberada, no una limitación técnica.",[45,23129],{},[48,23131,23133],{"id":23132},"configuración-rápida-clave-api-y-entorno","Configuración rápida: clave API y entorno",[11,23135,23136,23137,23139],{},"Necesita tres cosas: una cuenta de EvoLink, una clave API y la biblioteca ",[28,23138,11359],{},". Toda la configuración toma menos de un minuto.",[92,23141,23143],{"id":23142},"paso-1-obtenga-su-clave-api","Paso 1: Obtenga su clave API",[70,23145,23146,23152,23155],{},[73,23147,222,23148,23151],{},[37,23149,11753],{"href":211,"rel":23150},[41]," y cree una cuenta gratuita",[73,23153,23154],{},"Navegue a la sección de Claves API en su panel de control",[73,23156,23157],{},"Genere una nueva clave y cópiela",[11,23159,23160,23161,23163,23164,1580],{},"Su clave comienza con ",[28,23162,245],{}," y se ve así: ",[28,23165,23166],{},"sk-XpXn...Ms1N",[92,23168,23170],{"id":23169},"paso-2-instale-las-dependencias","Paso 2: Instale las dependencias",[136,23172,23173],{"className":138,"code":11376,"language":140,"meta":141,"style":141},[28,23174,23175],{"__ignoreMap":141},[145,23176,23177,23179,23181],{"class":147,"line":148},[145,23178,190],{"class":151},[145,23180,193],{"class":159},[145,23182,352],{"class":159},[11,23184,23185],{},"Eso es todo. No hay SDK que instalar ni flujos de autenticación complejos. La API usa REST estándar con autenticación Bearer token.",[92,23187,23189],{"id":23188},"paso-3-configure-su-entorno-python","Paso 3: Configure su entorno Python",[136,23191,23193],{"className":326,"code":23192,"language":328,"meta":141,"style":141},"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,23194,23195,23201,23207,23213,23217,23225,23233,23241,23257,23265],{"__ignoreMap":141},[145,23196,23197,23199],{"class":147,"line":148},[145,23198,335],{"class":258},[145,23200,352],{"class":262},[145,23202,23203,23205],{"class":147,"line":166},[145,23204,335],{"class":258},[145,23206,345],{"class":262},[145,23208,23209,23211],{"class":147,"line":178},[145,23210,335],{"class":258},[145,23212,6546],{"class":262},[145,23214,23215],{"class":147,"line":187},[145,23216,357],{"emptyLinePlaceholder":58},[145,23218,23219,23221,23223],{"class":147,"line":360},[145,23220,381],{"class":155},[145,23222,372],{"class":258},[145,23224,17401],{"class":159},[145,23226,23227,23229,23231],{"class":147,"line":366},[145,23228,369],{"class":155},[145,23230,372],{"class":258},[145,23232,9077],{"class":159},[145,23234,23235,23237,23239],{"class":147,"line":378},[145,23236,440],{"class":155},[145,23238,372],{"class":258},[145,23240,445],{"class":262},[145,23242,23243,23245,23247,23249,23251,23253,23255],{"class":147,"line":395},[145,23244,451],{"class":159},[145,23246,454],{"class":262},[145,23248,457],{"class":258},[145,23250,460],{"class":159},[145,23252,463],{"class":155},[145,23254,466],{"class":159},[145,23256,469],{"class":262},[145,23258,23259,23261,23263],{"class":147,"line":400},[145,23260,475],{"class":159},[145,23262,454],{"class":262},[145,23264,480],{"class":159},[145,23266,23267],{"class":147,"line":415},[145,23268,486],{"class":262},[11,23270,23271,23272,23275],{},"Todos los ejemplos de código en esta guía se basan en estas tres variables. Reemplace ",[28,23273,23274],{},"YOUR_API_KEY"," con su clave real y estará listo para generar.",[18,23277,23278],{},[11,23279,23280],{},[23,23281,23282],{},[37,23283,17952],{"href":211,"rel":23284},[41],[92,23286,23288],{"id":23287},"la-función-auxiliar-de-polling","La función auxiliar de polling",[11,23290,23291],{},"Dado que la generación de video toma entre 60 y 180 segundos, necesita una función para sondear hasta la finalización. Esta función auxiliar funciona en los tres modos de imagen a video:",[136,23293,23295],{"className":326,"code":23294,"language":328,"meta":141,"style":141},"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,23296,23297,23318,23323,23346,23354,23358,23369,23385,23394,23407,23411,23423,23439,23459,23466,23478,23507,23513,23517,23545,23549,23557,23561,23572],{"__ignoreMap":141},[145,23298,23299,23301,23303,23305,23307,23309,23312,23314,23316],{"class":147,"line":148},[145,23300,502],{"class":258},[145,23302,505],{"class":151},[145,23304,11479],{"class":262},[145,23306,266],{"class":258},[145,23308,1133],{"class":155},[145,23310,23311],{"class":262},", max_wait",[145,23313,266],{"class":258},[145,23315,11490],{"class":155},[145,23317,516],{"class":262},[145,23319,23320],{"class":147,"line":166},[145,23321,23322],{"class":159},"    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n",[145,23324,23325,23328,23330,23332,23334,23336,23338,23340,23342,23344],{"class":147,"line":178},[145,23326,23327],{"class":262},"    url ",[145,23329,266],{"class":258},[145,23331,3173],{"class":258},[145,23333,466],{"class":159},[145,23335,571],{"class":155},[145,23337,574],{"class":159},[145,23339,577],{"class":155},[145,23341,580],{"class":262},[145,23343,583],{"class":155},[145,23345,5185],{"class":159},[145,23347,23348,23350,23352],{"class":147,"line":187},[145,23349,9158],{"class":262},[145,23351,266],{"class":258},[145,23353,9163],{"class":155},[145,23355,23356],{"class":147,"line":360},[145,23357,357],{"emptyLinePlaceholder":58},[145,23359,23360,23362,23364,23366],{"class":147,"line":366},[145,23361,544],{"class":258},[145,23363,9170],{"class":262},[145,23365,5784],{"class":258},[145,23367,23368],{"class":262}," max_wait:\n",[145,23370,23371,23373,23375,23377,23379,23381,23383],{"class":147,"line":378},[145,23372,6733],{"class":262},[145,23374,266],{"class":258},[145,23376,908],{"class":262},[145,23378,17630],{"class":593},[145,23380,266],{"class":258},[145,23382,440],{"class":155},[145,23384,392],{"class":262},[145,23386,23387,23390,23392],{"class":147,"line":395},[145,23388,23389],{"class":262},"        data ",[145,23391,266],{"class":258},[145,23393,11560],{"class":262},[145,23395,23396,23398,23400,23403,23405],{"class":147,"line":400},[145,23397,633],{"class":262},[145,23399,266],{"class":258},[145,23401,23402],{"class":262}," data[",[145,23404,641],{"class":159},[145,23406,644],{"class":262},[145,23408,23409],{"class":147,"line":415},[145,23410,357],{"emptyLinePlaceholder":58},[145,23412,23413,23415,23417,23419,23421],{"class":147,"line":432},[145,23414,746],{"class":258},[145,23416,749],{"class":262},[145,23418,752],{"class":258},[145,23420,755],{"class":159},[145,23422,412],{"class":262},[145,23424,23425,23427,23429,23431,23433,23435,23437],{"class":147,"line":437},[145,23426,7209],{"class":262},[145,23428,266],{"class":258},[145,23430,23402],{"class":262},[145,23432,21346],{"class":159},[145,23434,1359],{"class":262},[145,23436,14747],{"class":159},[145,23438,644],{"class":262},[145,23440,23441,23443,23445,23447,23449,23451,23453,23455,23457],{"class":147,"line":448},[145,23442,5392],{"class":155},[145,23444,424],{"class":262},[145,23446,457],{"class":258},[145,23448,11600],{"class":159},[145,23450,577],{"class":155},[145,23452,1484],{"class":262},[145,23454,583],{"class":155},[145,23456,466],{"class":159},[145,23458,392],{"class":262},[145,23460,23461,23463],{"class":147,"line":472},[145,23462,763],{"class":258},[145,23464,23465],{"class":262}," data\n",[145,23467,23468,23470,23472,23474,23476],{"class":147,"line":483},[145,23469,772],{"class":258},[145,23471,749],{"class":262},[145,23473,752],{"class":258},[145,23475,779],{"class":159},[145,23477,412],{"class":262},[145,23479,23480,23482,23484,23486,23488,23490,23493,23495,23497,23499,23501,23503,23505],{"class":147,"line":489},[145,23481,5392],{"class":155},[145,23483,424],{"class":262},[145,23485,457],{"class":258},[145,23487,11649],{"class":159},[145,23489,577],{"class":155},[145,23491,23492],{"class":262},"data.get(",[145,23494,11657],{"class":159},[145,23496,290],{"class":262},[145,23498,17747],{"class":159},[145,23500,108],{"class":262},[145,23502,583],{"class":155},[145,23504,466],{"class":159},[145,23506,392],{"class":262},[145,23508,23509,23511],{"class":147,"line":494},[145,23510,763],{"class":258},[145,23512,23465],{"class":262},[145,23514,23515],{"class":147,"line":499},[145,23516,357],{"emptyLinePlaceholder":58},[145,23518,23519,23521,23523,23525,23527,23529,23531,23533,23535,23537,23539,23541,23543],{"class":147,"line":519},[145,23520,696],{"class":155},[145,23522,424],{"class":262},[145,23524,457],{"class":258},[145,23526,11686],{"class":159},[145,23528,577],{"class":155},[145,23530,718],{"class":262},[145,23532,583],{"class":155},[145,23534,114],{"class":159},[145,23536,577],{"class":155},[145,23538,708],{"class":262},[145,23540,583],{"class":155},[145,23542,11703],{"class":159},[145,23544,392],{"class":262},[145,23546,23547],{"class":147,"line":525},[145,23548,11710],{"class":262},[145,23550,23551,23553,23555],{"class":147,"line":536},[145,23552,671],{"class":262},[145,23554,9364],{"class":258},[145,23556,11719],{"class":262},[145,23558,23559],{"class":147,"line":541},[145,23560,357],{"emptyLinePlaceholder":58},[145,23562,23563,23565,23567,23570],{"class":147,"line":552},[145,23564,878],{"class":155},[145,23566,424],{"class":262},[145,23568,23569],{"class":159},"\"Timed out waiting for video\"",[145,23571,392],{"class":262},[145,23573,23574,23576],{"class":147,"line":563},[145,23575,1512],{"class":258},[145,23577,11741],{"class":155},[11,23579,23580,23581,23583,23584,23583,23586,1898,23588,23590],{},"El estado de la tarea sigue un ciclo de vida simple: ",[28,23582,1889],{}," → ",[28,23585,1893],{},[28,23587,1897],{},[28,23589,1901],{},". Las URLs de video en la respuesta expiran después de 24 horas: descárguelas o sírvelas antes de ese plazo.",[11,23592,23593,23594,1580],{},"Para un recorrido completo de los fundamentos de la API (texto a video, parámetros, manejo de errores), consulte la ",[37,23595,23596],{"href":17348},"Guía de Inicio",[45,23598],{},[48,23600,23602],{"id":23601},"modo-1-animación-de-imagen-única","Modo 1: Animación de imagen única",[11,23604,23605],{},"La animación de imagen única es el flujo de trabajo de imagen a video más común. Usted proporciona una imagen y un prompt describiendo el movimiento deseado. El modelo preserva el contenido visual de su imagen mientras añade movimiento realista, movimiento de cámara y efectos ambientales.",[92,23607,23608],{"id":6243},"Cómo funciona",[11,23610,23611,23612,23614,23615,23618],{},"Cuando pasa exactamente una URL en ",[28,23613,2710],{},", Seedance 2.0 la trata como la ",[23,23616,23617],{},"referencia visual principal",". El modelo ancla el primer fotograma a su imagen y genera movimiento hacia adelante basándose en su prompt. La salida preserva:",[97,23620,23621,23627,23633,23639],{},[73,23622,23623,23626],{},[23,23624,23625],{},"Paleta de colores"," de la imagen fuente",[73,23628,23629,23632],{},[23,23630,23631],{},"Composición"," y encuadre",[73,23634,23635,23638],{},[23,23636,23637],{},"Identidad del sujeto"," (vestimenta, forma, rasgos)",[73,23640,23641,23644],{},[23,23642,23643],{},"Estilo artístico"," (ilustración, renderizado 3D, fotografía)",[11,23646,23647,23648,23651],{},"Su prompt controla lo que ",[2434,23649,23650],{},"cambia",": movimiento, ángulos de cámara, cambios de iluminación y dinámica ambiental.",[92,23653,23655],{"id":23654},"código-completo-imagen-única-a-video","Código completo: Imagen única a video",[136,23657,23659],{"className":326,"code":23658,"language":328,"meta":141,"style":141},"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,23660,23661,23667,23673,23677,23685,23693,23701,23717,23725,23729,23733,23753,23775,23783,23793,23809,23817,23829,23841,23870,23876,23888,23917,23923,23951,23955,23963,23969,23973,23978,23986,23996,24002,24007,24012,24017,24022,24026,24032,24037,24041,24051,24061,24071,24079,24083,24087,24096,24108,24118,24126,24130,24138,24163,24167,24172],{"__ignoreMap":141},[145,23662,23663,23665],{"class":147,"line":148},[145,23664,335],{"class":258},[145,23666,352],{"class":262},[145,23668,23669,23671],{"class":147,"line":166},[145,23670,335],{"class":258},[145,23672,345],{"class":262},[145,23674,23675],{"class":147,"line":178},[145,23676,357],{"emptyLinePlaceholder":58},[145,23678,23679,23681,23683],{"class":147,"line":187},[145,23680,381],{"class":155},[145,23682,372],{"class":258},[145,23684,17401],{"class":159},[145,23686,23687,23689,23691],{"class":147,"line":360},[145,23688,369],{"class":155},[145,23690,372],{"class":258},[145,23692,9077],{"class":159},[145,23694,23695,23697,23699],{"class":147,"line":366},[145,23696,440],{"class":155},[145,23698,372],{"class":258},[145,23700,445],{"class":262},[145,23702,23703,23705,23707,23709,23711,23713,23715],{"class":147,"line":378},[145,23704,451],{"class":159},[145,23706,454],{"class":262},[145,23708,457],{"class":258},[145,23710,460],{"class":159},[145,23712,463],{"class":155},[145,23714,466],{"class":159},[145,23716,469],{"class":262},[145,23718,23719,23721,23723],{"class":147,"line":395},[145,23720,475],{"class":159},[145,23722,454],{"class":262},[145,23724,480],{"class":159},[145,23726,23727],{"class":147,"line":400},[145,23728,486],{"class":262},[145,23730,23731],{"class":147,"line":415},[145,23732,357],{"emptyLinePlaceholder":58},[145,23734,23735,23737,23739,23741,23743,23745,23747,23749,23751],{"class":147,"line":432},[145,23736,502],{"class":258},[145,23738,505],{"class":151},[145,23740,11479],{"class":262},[145,23742,266],{"class":258},[145,23744,1133],{"class":155},[145,23746,23311],{"class":262},[145,23748,266],{"class":258},[145,23750,11490],{"class":155},[145,23752,516],{"class":262},[145,23754,23755,23757,23759,23761,23763,23765,23767,23769,23771,23773],{"class":147,"line":437},[145,23756,23327],{"class":262},[145,23758,266],{"class":258},[145,23760,3173],{"class":258},[145,23762,466],{"class":159},[145,23764,571],{"class":155},[145,23766,574],{"class":159},[145,23768,577],{"class":155},[145,23770,580],{"class":262},[145,23772,583],{"class":155},[145,23774,5185],{"class":159},[145,23776,23777,23779,23781],{"class":147,"line":448},[145,23778,9158],{"class":262},[145,23780,266],{"class":258},[145,23782,9163],{"class":155},[145,23784,23785,23787,23789,23791],{"class":147,"line":472},[145,23786,544],{"class":258},[145,23788,9170],{"class":262},[145,23790,5784],{"class":258},[145,23792,23368],{"class":262},[145,23794,23795,23797,23799,23801,23803,23805,23807],{"class":147,"line":483},[145,23796,6733],{"class":262},[145,23798,266],{"class":258},[145,23800,908],{"class":262},[145,23802,17630],{"class":593},[145,23804,266],{"class":258},[145,23806,440],{"class":155},[145,23808,392],{"class":262},[145,23810,23811,23813,23815],{"class":147,"line":489},[145,23812,23389],{"class":262},[145,23814,266],{"class":258},[145,23816,11560],{"class":262},[145,23818,23819,23821,23823,23825,23827],{"class":147,"line":494},[145,23820,633],{"class":262},[145,23822,266],{"class":258},[145,23824,23402],{"class":262},[145,23826,641],{"class":159},[145,23828,644],{"class":262},[145,23830,23831,23833,23835,23837,23839],{"class":147,"line":499},[145,23832,746],{"class":258},[145,23834,749],{"class":262},[145,23836,752],{"class":258},[145,23838,755],{"class":159},[145,23840,412],{"class":262},[145,23842,23843,23845,23847,23849,23851,23853,23856,23858,23860,23862,23864,23866,23868],{"class":147,"line":519},[145,23844,5392],{"class":155},[145,23846,424],{"class":262},[145,23848,457],{"class":258},[145,23850,11600],{"class":159},[145,23852,577],{"class":155},[145,23854,23855],{"class":262},"data[",[145,23857,17692],{"class":159},[145,23859,1359],{"class":262},[145,23861,17697],{"class":159},[145,23863,1331],{"class":262},[145,23865,583],{"class":155},[145,23867,466],{"class":159},[145,23869,392],{"class":262},[145,23871,23872,23874],{"class":147,"line":525},[145,23873,763],{"class":258},[145,23875,23465],{"class":262},[145,23877,23878,23880,23882,23884,23886],{"class":147,"line":536},[145,23879,772],{"class":258},[145,23881,749],{"class":262},[145,23883,752],{"class":258},[145,23885,779],{"class":159},[145,23887,412],{"class":262},[145,23889,23890,23892,23894,23896,23899,23901,23903,23905,23907,23909,23911,23913,23915],{"class":147,"line":541},[145,23891,5392],{"class":155},[145,23893,424],{"class":262},[145,23895,457],{"class":258},[145,23897,23898],{"class":159},"\"Failed: ",[145,23900,577],{"class":155},[145,23902,23492],{"class":262},[145,23904,11657],{"class":159},[145,23906,290],{"class":262},[145,23908,17747],{"class":159},[145,23910,108],{"class":262},[145,23912,583],{"class":155},[145,23914,466],{"class":159},[145,23916,392],{"class":262},[145,23918,23919,23921],{"class":147,"line":552},[145,23920,763],{"class":258},[145,23922,23465],{"class":262},[145,23924,23925,23927,23929,23931,23933,23935,23937,23939,23941,23943,23945,23947,23949],{"class":147,"line":563},[145,23926,696],{"class":155},[145,23928,424],{"class":262},[145,23930,457],{"class":258},[145,23932,11686],{"class":159},[145,23934,577],{"class":155},[145,23936,718],{"class":262},[145,23938,583],{"class":155},[145,23940,114],{"class":159},[145,23942,577],{"class":155},[145,23944,708],{"class":262},[145,23946,583],{"class":155},[145,23948,10516],{"class":159},[145,23950,392],{"class":262},[145,23952,23953],{"class":147,"line":590},[145,23954,11710],{"class":262},[145,23956,23957,23959,23961],{"class":147,"line":602},[145,23958,671],{"class":262},[145,23960,9364],{"class":258},[145,23962,11719],{"class":262},[145,23964,23965,23967],{"class":147,"line":608},[145,23966,1512],{"class":258},[145,23968,11741],{"class":155},[145,23970,23971],{"class":147,"line":614},[145,23972,357],{"emptyLinePlaceholder":58},[145,23974,23975],{"class":147,"line":625},[145,23976,23977],{"class":174},"# --- Single Image Animation ---\n",[145,23979,23980,23982,23984],{"class":147,"line":630},[145,23981,3476],{"class":262},[145,23983,266],{"class":258},[145,23985,445],{"class":262},[145,23987,23988,23990,23992,23994],{"class":147,"line":647},[145,23989,3485],{"class":159},[145,23991,454],{"class":262},[145,23993,1083],{"class":159},[145,23995,469],{"class":262},[145,23997,23998,24000],{"class":147,"line":668},[145,23999,3496],{"class":159},[145,24001,1098],{"class":262},[145,24003,24004],{"class":147,"line":688},[145,24005,24006],{"class":159},"        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n",[145,24008,24009],{"class":147,"line":693},[145,24010,24011],{"class":159},"        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n",[145,24013,24014],{"class":147,"line":738},[145,24015,24016],{"class":159},"        \"through a nearby window. Gentle steam rises from the cup. \"\n",[145,24018,24019],{"class":147,"line":743},[145,24020,24021],{"class":159},"        \"Painterly brushstroke texture preserved throughout.\"\n",[145,24023,24024],{"class":147,"line":760},[145,24025,3620],{"class":262},[145,24027,24028,24030],{"class":147,"line":769},[145,24029,15181],{"class":159},[145,24031,2506],{"class":262},[145,24033,24034],{"class":147,"line":784},[145,24035,24036],{"class":159},"        \"https://example.com/painting-woman.jpg\"\n",[145,24038,24039],{"class":147,"line":810},[145,24040,16164],{"class":262},[145,24042,24043,24045,24047,24049],{"class":147,"line":837},[145,24044,3508],{"class":159},[145,24046,454],{"class":262},[145,24048,3513],{"class":155},[145,24050,469],{"class":262},[145,24052,24053,24055,24057,24059],{"class":147,"line":842},[145,24054,3520],{"class":159},[145,24056,454],{"class":262},[145,24058,3525],{"class":159},[145,24060,469],{"class":262},[145,24062,24063,24065,24067,24069],{"class":147,"line":848},[145,24064,3532],{"class":159},[145,24066,454],{"class":262},[145,24068,1167],{"class":159},[145,24070,469],{"class":262},[145,24072,24073,24075,24077],{"class":147,"line":853},[145,24074,3548],{"class":159},[145,24076,454],{"class":262},[145,24078,3553],{"class":155},[145,24080,24081],{"class":147,"line":858},[145,24082,486],{"class":262},[145,24084,24085],{"class":147,"line":869},[145,24086,357],{"emptyLinePlaceholder":58},[145,24088,24089,24092,24094],{"class":147,"line":875},[145,24090,24091],{"class":262},"resp ",[145,24093,266],{"class":258},[145,24095,1219],{"class":262},[145,24097,24098,24100,24102,24104,24106],{"class":147,"line":900},[145,24099,6341],{"class":258},[145,24101,466],{"class":159},[145,24103,571],{"class":155},[145,24105,1232],{"class":159},[145,24107,469],{"class":262},[145,24109,24110,24112,24114,24116],{"class":147,"line":921},[145,24111,6354],{"class":593},[145,24113,266],{"class":258},[145,24115,440],{"class":155},[145,24117,469],{"class":262},[145,24119,24120,24122,24124],{"class":147,"line":927},[145,24121,6365],{"class":593},[145,24123,266],{"class":258},[145,24125,2603],{"class":262},[145,24127,24128],{"class":147,"line":932},[145,24129,392],{"class":262},[145,24131,24132,24134,24136],{"class":147,"line":956},[145,24133,12031],{"class":262},[145,24135,266],{"class":258},[145,24137,11560],{"class":262},[145,24139,24140,24142,24144,24146,24149,24151,24153,24155,24157,24159,24161],{"class":147,"line":981},[145,24141,6387],{"class":155},[145,24143,424],{"class":262},[145,24145,457],{"class":258},[145,24147,24148],{"class":159},"\"Task ID: ",[145,24150,577],{"class":155},[145,24152,11605],{"class":262},[145,24154,19692],{"class":159},[145,24156,1331],{"class":262},[145,24158,583],{"class":155},[145,24160,466],{"class":159},[145,24162,392],{"class":262},[145,24164,24165],{"class":147,"line":987},[145,24166,357],{"emptyLinePlaceholder":58},[145,24168,24169],{"class":147,"line":992},[145,24170,24171],{"class":174},"# Poll until complete\n",[145,24173,24174,24177,24179,24182,24184],{"class":147,"line":1009},[145,24175,24176],{"class":262},"video_data ",[145,24178,266],{"class":258},[145,24180,24181],{"class":262}," wait_for_video(result[",[145,24183,7476],{"class":159},[145,24185,1431],{"class":262},[18,24187,24188],{},[11,24189,24190,24193,24194,24196],{},[23,24191,24192],{},"Ejecute esto con su propia clave API."," Sustituya el valor de ",[28,24195,2710],{}," por cualquier URL de imagen accesible públicamente.",[92,24198,24200],{"id":24199},"demo-la-pintura-cobra-vida","Demo: La pintura cobra vida",[56,24202,60,24203],{"controls":58,"playsInline":58,"style":59},[62,24204],{"src":18593,"type":65},[11,24206,24207,14079,24210],{},[23,24208,24209],{},"Prompt utilizado:",[2434,24211,24212],{},"\"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,24214,24215,24216,24218],{},"Esta demo utiliza un único retrato pintado como ",[28,24217,2722],{}," (la referencia del personaje). El modelo preserva la estética de pintura al óleo mientras genera movimiento natural del brazo y física del vapor.",[92,24220,24222],{"id":24221},"demo-animación-con-transferencia-de-estilo","Demo: Animación con transferencia de estilo",[56,24224,60,24225],{"controls":58,"playsInline":58,"style":59},[62,24226],{"src":24227,"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,24229,24230,14079,24232],{},[23,24231,24209],{},[2434,24233,24234],{},"\"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,24236,24237],{},"Observe cómo el estilo de pinceladas de Van Gogh de la imagen de entrada se mantiene en cada fotograma: el cielo arremolinado, la textura de impasto en los edificios, las relaciones cromáticas. La animación de imagen única destaca en el movimiento consistente con el estilo.",[92,24239,24241],{"id":24240},"mejores-prácticas-de-prompts-para-el-modo-de-imagen-única","Mejores prácticas de prompts para el modo de imagen única",[11,24243,24244],{},"Su prompt determina la calidad de la animación. Las descripciones estáticas producen videos estáticos. Los prompts ricos en movimiento producen resultados dinámicos.",[11,24246,24247],{},[23,24248,24249],{},"Prompt débil:",[136,24251,24254],{"className":24252,"code":24253,"language":1999},[1997],"A cat sitting on a windowsill\n",[28,24255,24253],{"__ignoreMap":141},[11,24257,24258],{},[23,24259,24260],{},"Prompt fuerte:",[136,24262,24265],{"className":24263,"code":24264,"language":1999},[1997],"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,24266,24264],{"__ignoreMap":141},[11,24268,24269,24270,24273,24274,24277,24278,24281],{},"La diferencia: el prompt fuerte especifica ",[23,24271,24272],{},"acciones secuenciales"," (se estira → bosteza → se acurruca), ",[23,24275,24276],{},"movimiento ambiental"," (la luz del sol se desplaza, motas de polvo) y ",[23,24279,24280],{},"comportamiento de cámara"," (estable, profundidad de campo).",[11,24283,24284],{},"Principios clave para prompts de imagen única:",[1849,24286,24287,24296],{},[1852,24288,24289],{},[1855,24290,24291,24294],{},[1858,24292,24293],{},"Principio",[1858,24295,11263],{},[1865,24297,24298,24306,24314,24322,24330],{},[1855,24299,24300,24303],{},[1870,24301,24302],{},"Describa movimiento, no apariencia",[1870,24304,24305],{},"\"walks forward\" en vez de \"a person standing\"",[1855,24307,24308,24311],{},[1870,24309,24310],{},"Secuencie 2-3 acciones",[1870,24312,24313],{},"\"picks up → examines → sets down\"",[1855,24315,24316,24319],{},[1870,24317,24318],{},"Añada dinámica ambiental",[1870,24320,24321],{},"\"wind rustles leaves\", \"rain beads on glass\"",[1855,24323,24324,24327],{},[1870,24325,24326],{},"Especifique movimiento de cámara",[1870,24328,24329],{},"\"slow pan left\", \"camera pulls back to reveal\"",[1855,24331,24332,24335],{},[1870,24333,24334],{},"Coincida con el estilo artístico de la imagen",[1870,24336,24337],{},"\"painterly strokes preserved\", \"3D render quality\"",[11,24339,24340,24341,24343,24344,1580],{},"Para una referencia completa de ingeniería de prompts, consulte la ",[37,24342,2026],{"href":1578},". Para técnicas específicas de cámara, consulte la ",[37,24345,24346],{"href":3672},"Guía de Movimientos de Cámara",[45,24348],{},[48,24350,24352],{"id":24351},"modo-2-control-de-primer-y-último-fotograma","Modo 2: Control de primer y último fotograma",[11,24354,24355,24356,24359],{},"El modo de imagen única ancla el inicio de su video. El modo de primer y último fotograma ancla ",[23,24357,24358],{},"ambos extremos",". Usted proporciona dos imágenes, el fotograma de apertura y el de cierre, y Seedance 2.0 genera una transición suave entre ellos.",[92,24361,23608],{"id":24362},"cómo-funciona-1",[11,24364,24365,24366,24368],{},"Cuando ",[28,24367,2710],{}," contiene exactamente dos URLs, el modelo las interpreta como:",[97,24370,24371,24377],{},[73,24372,24373,24376],{},[23,24374,24375],{},"Primera URL"," → fotograma inicial",[73,24378,24379,24382],{},[23,24380,24381],{},"Segunda URL"," → fotograma final",[11,24384,24385,24386,24389],{},"El modelo genera entonces fotogramas intermedios que crean una transición natural y físicamente plausible. Su prompt guía el ",[2434,24387,24388],{},"estilo"," de la transición, ya sea una transición suave, un viaje narrativo o una transformación dramática.",[92,24391,24393],{"id":24392},"casos-de-uso","Casos de uso",[11,24395,24396],{},"El control de primer y último fotograma resuelve problemas que el modo de imagen única no puede:",[97,24398,24399,24405,24411,24417,24423],{},[73,24400,24401,24404],{},[23,24402,24403],{},"Revelaciones antes/después",": renovación, cambio de imagen, cambio estacional",[73,24406,24407,24410],{},[23,24408,24409],{},"Simulación de time-lapse",": del amanecer al atardecer, de habitación vacía a habitación amueblada",[73,24412,24413,24416],{},[23,24414,24415],{},"Transiciones de escena",": una ubicación transformándose en otra",[73,24418,24419,24422],{},[23,24420,24421],{},"Transformación de producto",": del empaque cerrado a la exhibición del producto abierto",[73,24424,24425,24428],{},[23,24426,24427],{},"Efectos de morphing",": un personaje o estilo convirtiéndose en otro",[92,24430,24432],{"id":24431},"código-completo-interpolación-de-primer-y-último-fotograma","Código completo: Interpolación de primer y último fotograma",[136,24434,24436],{"className":326,"code":24435,"language":328,"meta":141,"style":141},"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,24437,24438,24444,24450,24454,24462,24470,24478,24494,24502,24506,24510,24530,24552,24560,24570,24586,24594,24606,24618,24646,24652,24664,24692,24698,24726,24730,24738,24744,24748,24753,24761,24771,24777,24782,24787,24792,24797,24801,24807,24814,24819,24823,24833,24843,24851,24855,24859,24867,24879,24889,24897,24901,24909,24933,24937],{"__ignoreMap":141},[145,24439,24440,24442],{"class":147,"line":148},[145,24441,335],{"class":258},[145,24443,352],{"class":262},[145,24445,24446,24448],{"class":147,"line":166},[145,24447,335],{"class":258},[145,24449,345],{"class":262},[145,24451,24452],{"class":147,"line":178},[145,24453,357],{"emptyLinePlaceholder":58},[145,24455,24456,24458,24460],{"class":147,"line":187},[145,24457,381],{"class":155},[145,24459,372],{"class":258},[145,24461,17401],{"class":159},[145,24463,24464,24466,24468],{"class":147,"line":360},[145,24465,369],{"class":155},[145,24467,372],{"class":258},[145,24469,9077],{"class":159},[145,24471,24472,24474,24476],{"class":147,"line":366},[145,24473,440],{"class":155},[145,24475,372],{"class":258},[145,24477,445],{"class":262},[145,24479,24480,24482,24484,24486,24488,24490,24492],{"class":147,"line":378},[145,24481,451],{"class":159},[145,24483,454],{"class":262},[145,24485,457],{"class":258},[145,24487,460],{"class":159},[145,24489,463],{"class":155},[145,24491,466],{"class":159},[145,24493,469],{"class":262},[145,24495,24496,24498,24500],{"class":147,"line":395},[145,24497,475],{"class":159},[145,24499,454],{"class":262},[145,24501,480],{"class":159},[145,24503,24504],{"class":147,"line":400},[145,24505,486],{"class":262},[145,24507,24508],{"class":147,"line":415},[145,24509,357],{"emptyLinePlaceholder":58},[145,24511,24512,24514,24516,24518,24520,24522,24524,24526,24528],{"class":147,"line":432},[145,24513,502],{"class":258},[145,24515,505],{"class":151},[145,24517,11479],{"class":262},[145,24519,266],{"class":258},[145,24521,1133],{"class":155},[145,24523,23311],{"class":262},[145,24525,266],{"class":258},[145,24527,11490],{"class":155},[145,24529,516],{"class":262},[145,24531,24532,24534,24536,24538,24540,24542,24544,24546,24548,24550],{"class":147,"line":437},[145,24533,23327],{"class":262},[145,24535,266],{"class":258},[145,24537,3173],{"class":258},[145,24539,466],{"class":159},[145,24541,571],{"class":155},[145,24543,574],{"class":159},[145,24545,577],{"class":155},[145,24547,580],{"class":262},[145,24549,583],{"class":155},[145,24551,5185],{"class":159},[145,24553,24554,24556,24558],{"class":147,"line":448},[145,24555,9158],{"class":262},[145,24557,266],{"class":258},[145,24559,9163],{"class":155},[145,24561,24562,24564,24566,24568],{"class":147,"line":472},[145,24563,544],{"class":258},[145,24565,9170],{"class":262},[145,24567,5784],{"class":258},[145,24569,23368],{"class":262},[145,24571,24572,24574,24576,24578,24580,24582,24584],{"class":147,"line":483},[145,24573,6733],{"class":262},[145,24575,266],{"class":258},[145,24577,908],{"class":262},[145,24579,17630],{"class":593},[145,24581,266],{"class":258},[145,24583,440],{"class":155},[145,24585,392],{"class":262},[145,24587,24588,24590,24592],{"class":147,"line":489},[145,24589,23389],{"class":262},[145,24591,266],{"class":258},[145,24593,11560],{"class":262},[145,24595,24596,24598,24600,24602,24604],{"class":147,"line":494},[145,24597,633],{"class":262},[145,24599,266],{"class":258},[145,24601,23402],{"class":262},[145,24603,641],{"class":159},[145,24605,644],{"class":262},[145,24607,24608,24610,24612,24614,24616],{"class":147,"line":499},[145,24609,746],{"class":258},[145,24611,749],{"class":262},[145,24613,752],{"class":258},[145,24615,755],{"class":159},[145,24617,412],{"class":262},[145,24619,24620,24622,24624,24626,24628,24630,24632,24634,24636,24638,24640,24642,24644],{"class":147,"line":519},[145,24621,5392],{"class":155},[145,24623,424],{"class":262},[145,24625,457],{"class":258},[145,24627,11600],{"class":159},[145,24629,577],{"class":155},[145,24631,23855],{"class":262},[145,24633,17692],{"class":159},[145,24635,1359],{"class":262},[145,24637,17697],{"class":159},[145,24639,1331],{"class":262},[145,24641,583],{"class":155},[145,24643,466],{"class":159},[145,24645,392],{"class":262},[145,24647,24648,24650],{"class":147,"line":525},[145,24649,763],{"class":258},[145,24651,23465],{"class":262},[145,24653,24654,24656,24658,24660,24662],{"class":147,"line":536},[145,24655,772],{"class":258},[145,24657,749],{"class":262},[145,24659,752],{"class":258},[145,24661,779],{"class":159},[145,24663,412],{"class":262},[145,24665,24666,24668,24670,24672,24674,24676,24678,24680,24682,24684,24686,24688,24690],{"class":147,"line":541},[145,24667,5392],{"class":155},[145,24669,424],{"class":262},[145,24671,457],{"class":258},[145,24673,23898],{"class":159},[145,24675,577],{"class":155},[145,24677,23492],{"class":262},[145,24679,11657],{"class":159},[145,24681,290],{"class":262},[145,24683,17747],{"class":159},[145,24685,108],{"class":262},[145,24687,583],{"class":155},[145,24689,466],{"class":159},[145,24691,392],{"class":262},[145,24693,24694,24696],{"class":147,"line":552},[145,24695,763],{"class":258},[145,24697,23465],{"class":262},[145,24699,24700,24702,24704,24706,24708,24710,24712,24714,24716,24718,24720,24722,24724],{"class":147,"line":563},[145,24701,696],{"class":155},[145,24703,424],{"class":262},[145,24705,457],{"class":258},[145,24707,11686],{"class":159},[145,24709,577],{"class":155},[145,24711,718],{"class":262},[145,24713,583],{"class":155},[145,24715,114],{"class":159},[145,24717,577],{"class":155},[145,24719,708],{"class":262},[145,24721,583],{"class":155},[145,24723,10516],{"class":159},[145,24725,392],{"class":262},[145,24727,24728],{"class":147,"line":590},[145,24729,11710],{"class":262},[145,24731,24732,24734,24736],{"class":147,"line":602},[145,24733,671],{"class":262},[145,24735,9364],{"class":258},[145,24737,11719],{"class":262},[145,24739,24740,24742],{"class":147,"line":608},[145,24741,1512],{"class":258},[145,24743,11741],{"class":155},[145,24745,24746],{"class":147,"line":614},[145,24747,357],{"emptyLinePlaceholder":58},[145,24749,24750],{"class":147,"line":625},[145,24751,24752],{"class":174},"# --- First-Last Frame Control ---\n",[145,24754,24755,24757,24759],{"class":147,"line":630},[145,24756,3476],{"class":262},[145,24758,266],{"class":258},[145,24760,445],{"class":262},[145,24762,24763,24765,24767,24769],{"class":147,"line":647},[145,24764,3485],{"class":159},[145,24766,454],{"class":262},[145,24768,1083],{"class":159},[145,24770,469],{"class":262},[145,24772,24773,24775],{"class":147,"line":668},[145,24774,3496],{"class":159},[145,24776,1098],{"class":262},[145,24778,24779],{"class":147,"line":688},[145,24780,24781],{"class":159},"        \"Smooth cinematic transition. The real-world landscape gradually \"\n",[145,24783,24784],{"class":147,"line":693},[145,24785,24786],{"class":159},"        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n",[145,24788,24789],{"class":147,"line":738},[145,24790,24791],{"class":159},"        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n",[145,24793,24794],{"class":147,"line":743},[145,24795,24796],{"class":159},"        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n",[145,24798,24799],{"class":147,"line":760},[145,24800,3620],{"class":262},[145,24802,24803,24805],{"class":147,"line":769},[145,24804,15181],{"class":159},[145,24806,2506],{"class":262},[145,24808,24809,24812],{"class":147,"line":784},[145,24810,24811],{"class":159},"        \"https://example.com/real-landscape.jpg\"",[145,24813,469],{"class":262},[145,24815,24816],{"class":147,"line":810},[145,24817,24818],{"class":159},"        \"https://example.com/ink-wash-painting.jpg\"\n",[145,24820,24821],{"class":147,"line":837},[145,24822,16164],{"class":262},[145,24824,24825,24827,24829,24831],{"class":147,"line":842},[145,24826,3508],{"class":159},[145,24828,454],{"class":262},[145,24830,513],{"class":155},[145,24832,469],{"class":262},[145,24834,24835,24837,24839,24841],{"class":147,"line":848},[145,24836,3520],{"class":159},[145,24838,454],{"class":262},[145,24840,3525],{"class":159},[145,24842,469],{"class":262},[145,24844,24845,24847,24849],{"class":147,"line":853},[145,24846,3532],{"class":159},[145,24848,454],{"class":262},[145,24850,2545],{"class":159},[145,24852,24853],{"class":147,"line":858},[145,24854,486],{"class":262},[145,24856,24857],{"class":147,"line":869},[145,24858,357],{"emptyLinePlaceholder":58},[145,24860,24861,24863,24865],{"class":147,"line":875},[145,24862,24091],{"class":262},[145,24864,266],{"class":258},[145,24866,1219],{"class":262},[145,24868,24869,24871,24873,24875,24877],{"class":147,"line":900},[145,24870,6341],{"class":258},[145,24872,466],{"class":159},[145,24874,571],{"class":155},[145,24876,1232],{"class":159},[145,24878,469],{"class":262},[145,24880,24881,24883,24885,24887],{"class":147,"line":921},[145,24882,6354],{"class":593},[145,24884,266],{"class":258},[145,24886,440],{"class":155},[145,24888,469],{"class":262},[145,24890,24891,24893,24895],{"class":147,"line":927},[145,24892,6365],{"class":593},[145,24894,266],{"class":258},[145,24896,2603],{"class":262},[145,24898,24899],{"class":147,"line":932},[145,24900,392],{"class":262},[145,24902,24903,24905,24907],{"class":147,"line":956},[145,24904,12031],{"class":262},[145,24906,266],{"class":258},[145,24908,11560],{"class":262},[145,24910,24911,24913,24915,24917,24919,24921,24923,24925,24927,24929,24931],{"class":147,"line":981},[145,24912,6387],{"class":155},[145,24914,424],{"class":262},[145,24916,457],{"class":258},[145,24918,24148],{"class":159},[145,24920,577],{"class":155},[145,24922,11605],{"class":262},[145,24924,19692],{"class":159},[145,24926,1331],{"class":262},[145,24928,583],{"class":155},[145,24930,466],{"class":159},[145,24932,392],{"class":262},[145,24934,24935],{"class":147,"line":987},[145,24936,357],{"emptyLinePlaceholder":58},[145,24938,24939,24941,24943,24945,24947],{"class":147,"line":992},[145,24940,24176],{"class":262},[145,24942,266],{"class":258},[145,24944,24181],{"class":262},[145,24946,7476],{"class":159},[145,24948,1431],{"class":262},[92,24950,24952],{"id":24951},"demo-de-la-realidad-a-la-pintura-de-tinta","Demo: De la realidad a la pintura de tinta",[56,24954,60,24955],{"controls":58,"playsInline":58,"style":59},[62,24956],{"src":24957,"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,24959,24960,14079,24962],{},[23,24961,24209],{},[2434,24963,24964],{},"\"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,24966,24967],{},"El primer fotograma es un paisaje montañoso fotorrealista. El último fotograma es una pintura de tinta china tradicional de una escena similar. El modelo crea una transformación sin fisuras donde las texturas fotográficas se disuelven progresivamente en pinceladas, un efecto que tomaría horas lograr manualmente en After Effects.",[92,24969,24971],{"id":24970},"consejos-para-el-modo-de-primer-y-último-fotograma","Consejos para el modo de primer y último fotograma",[11,24973,24974,24977],{},[23,24975,24976],{},"Haga coincidir la composición entre fotogramas."," Si su primer fotograma tiene una montaña a la izquierda, su último fotograma debería tener un elemento estructural similar en la misma posición. El modelo genera mejores transiciones cuando ambos fotogramas comparten aproximadamente la misma disposición.",[11,24979,24980,24983,24984,24987],{},[23,24981,24982],{},"Describa la transición, no solo los puntos extremos."," El modelo ya sabe cómo se ven el inicio y el final, tiene las imágenes. Su prompt debe describir ",[2434,24985,24986],{},"cómo"," llegar del punto A al punto B.",[136,24989,24992],{"className":24990,"code":24991,"language":1999},[1997],"# 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,24993,24991],{"__ignoreMap":141},[11,24995,24996,24999],{},[23,24997,24998],{},"Use duraciones más largas para transiciones complejas."," Un simple cambio de color funciona en 4 segundos. Una transformación de estilo (fotorrealista a ilustrado) se beneficia de 8 a 12 segundos. Los cambios abruptos en duraciones cortas se ven bruscos.",[1849,25001,25002,25011],{},[1852,25003,25004],{},[1855,25005,25006,25009],{},[1858,25007,25008],{},"Tipo de transición",[1858,25010,19220],{},[1865,25012,25013,25021,25029,25037],{},[1855,25014,25015,25018],{},[1870,25016,25017],{},"Cambio de color/iluminación",[1870,25019,25020],{},"4-6s",[1855,25022,25023,25026],{},[1870,25024,25025],{},"Cambio de posición de cámara",[1870,25027,25028],{},"6-8s",[1855,25030,25031,25034],{},[1870,25032,25033],{},"Transformación de estilo",[1870,25035,25036],{},"8-12s",[1855,25038,25039,25042],{},[1870,25040,25041],{},"Cambio narrativo de escena",[1870,25043,25044],{},"10-15s",[45,25046],{},[48,25048,25050],{"id":25049},"modo-3-composición-multi-imagen-con-tags","Modo 3: Composición multi-imagen con @Tags",[11,25052,25053,25054,25056],{},"Este es el modo de imagen a video más potente de Seedance 2.0, y el que ninguna API competidora ofrece. Usted proporciona hasta 9 imágenes, asigna a cada una un rol semántico usando etiquetas ",[28,25055,3960],{}," en su prompt, y el modelo las compone en un solo video coherente.",[92,25058,25060],{"id":25059},"cómo-funcionan-los-tags","Cómo funcionan los @Tags",[11,25062,25063,25064,25066],{},"Cuando incluye múltiples URLs en ",[28,25065,2710],{},", Seedance 2.0 les asigna etiquetas secuenciales según su posición en el array:",[136,25068,25071],{"className":25069,"code":25070,"language":1999},[1997],"image_urls[0] → @Image1\nimage_urls[1] → @Image2\nimage_urls[2] → @Image3\n...\nimage_urls[8] → @Image9\n",[28,25072,25070],{"__ignoreMap":141},[11,25074,25075],{},"Usted referencia estas etiquetas en su prompt para indicarle al modelo exactamente cómo usar cada imagen:",[136,25077,25080],{"className":25078,"code":25079,"language":1999},[1997],"@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,25081,25079],{"__ignoreMap":141},[11,25083,25084],{},"Sin etiquetas, el modelo tendría que adivinar cuál imagen es el personaje y cuál es el fondo. Con etiquetas, no hay ambigüedad. Esto es especialmente importante cuando sus imágenes se ven visualmente similares o cuando desea que una imagen específica controle el estilo en lugar del contenido.",[92,25086,25088],{"id":25087},"código-completo-composición-multi-imagen","Código completo: Composición multi-imagen",[136,25090,25092],{"className":326,"code":25091,"language":328,"meta":141,"style":141},"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,25093,25094,25100,25106,25110,25118,25126,25134,25150,25158,25162,25166,25186,25208,25216,25226,25242,25250,25262,25274,25302,25308,25320,25348,25354,25382,25386,25394,25400,25404,25409,25417,25427,25433,25438,25443,25448,25453,25458,25463,25468,25473,25478,25483,25487,25493,25500,25507,25514,25521,25526,25530,25540,25550,25560,25568,25572,25576,25584,25596,25606,25614,25618,25626,25650,25654],{"__ignoreMap":141},[145,25095,25096,25098],{"class":147,"line":148},[145,25097,335],{"class":258},[145,25099,352],{"class":262},[145,25101,25102,25104],{"class":147,"line":166},[145,25103,335],{"class":258},[145,25105,345],{"class":262},[145,25107,25108],{"class":147,"line":178},[145,25109,357],{"emptyLinePlaceholder":58},[145,25111,25112,25114,25116],{"class":147,"line":187},[145,25113,381],{"class":155},[145,25115,372],{"class":258},[145,25117,17401],{"class":159},[145,25119,25120,25122,25124],{"class":147,"line":360},[145,25121,369],{"class":155},[145,25123,372],{"class":258},[145,25125,9077],{"class":159},[145,25127,25128,25130,25132],{"class":147,"line":366},[145,25129,440],{"class":155},[145,25131,372],{"class":258},[145,25133,445],{"class":262},[145,25135,25136,25138,25140,25142,25144,25146,25148],{"class":147,"line":378},[145,25137,451],{"class":159},[145,25139,454],{"class":262},[145,25141,457],{"class":258},[145,25143,460],{"class":159},[145,25145,463],{"class":155},[145,25147,466],{"class":159},[145,25149,469],{"class":262},[145,25151,25152,25154,25156],{"class":147,"line":395},[145,25153,475],{"class":159},[145,25155,454],{"class":262},[145,25157,480],{"class":159},[145,25159,25160],{"class":147,"line":400},[145,25161,486],{"class":262},[145,25163,25164],{"class":147,"line":415},[145,25165,357],{"emptyLinePlaceholder":58},[145,25167,25168,25170,25172,25174,25176,25178,25180,25182,25184],{"class":147,"line":432},[145,25169,502],{"class":258},[145,25171,505],{"class":151},[145,25173,11479],{"class":262},[145,25175,266],{"class":258},[145,25177,1133],{"class":155},[145,25179,23311],{"class":262},[145,25181,266],{"class":258},[145,25183,11490],{"class":155},[145,25185,516],{"class":262},[145,25187,25188,25190,25192,25194,25196,25198,25200,25202,25204,25206],{"class":147,"line":437},[145,25189,23327],{"class":262},[145,25191,266],{"class":258},[145,25193,3173],{"class":258},[145,25195,466],{"class":159},[145,25197,571],{"class":155},[145,25199,574],{"class":159},[145,25201,577],{"class":155},[145,25203,580],{"class":262},[145,25205,583],{"class":155},[145,25207,5185],{"class":159},[145,25209,25210,25212,25214],{"class":147,"line":448},[145,25211,9158],{"class":262},[145,25213,266],{"class":258},[145,25215,9163],{"class":155},[145,25217,25218,25220,25222,25224],{"class":147,"line":472},[145,25219,544],{"class":258},[145,25221,9170],{"class":262},[145,25223,5784],{"class":258},[145,25225,23368],{"class":262},[145,25227,25228,25230,25232,25234,25236,25238,25240],{"class":147,"line":483},[145,25229,6733],{"class":262},[145,25231,266],{"class":258},[145,25233,908],{"class":262},[145,25235,17630],{"class":593},[145,25237,266],{"class":258},[145,25239,440],{"class":155},[145,25241,392],{"class":262},[145,25243,25244,25246,25248],{"class":147,"line":489},[145,25245,23389],{"class":262},[145,25247,266],{"class":258},[145,25249,11560],{"class":262},[145,25251,25252,25254,25256,25258,25260],{"class":147,"line":494},[145,25253,633],{"class":262},[145,25255,266],{"class":258},[145,25257,23402],{"class":262},[145,25259,641],{"class":159},[145,25261,644],{"class":262},[145,25263,25264,25266,25268,25270,25272],{"class":147,"line":499},[145,25265,746],{"class":258},[145,25267,749],{"class":262},[145,25269,752],{"class":258},[145,25271,755],{"class":159},[145,25273,412],{"class":262},[145,25275,25276,25278,25280,25282,25284,25286,25288,25290,25292,25294,25296,25298,25300],{"class":147,"line":519},[145,25277,5392],{"class":155},[145,25279,424],{"class":262},[145,25281,457],{"class":258},[145,25283,11600],{"class":159},[145,25285,577],{"class":155},[145,25287,23855],{"class":262},[145,25289,17692],{"class":159},[145,25291,1359],{"class":262},[145,25293,17697],{"class":159},[145,25295,1331],{"class":262},[145,25297,583],{"class":155},[145,25299,466],{"class":159},[145,25301,392],{"class":262},[145,25303,25304,25306],{"class":147,"line":525},[145,25305,763],{"class":258},[145,25307,23465],{"class":262},[145,25309,25310,25312,25314,25316,25318],{"class":147,"line":536},[145,25311,772],{"class":258},[145,25313,749],{"class":262},[145,25315,752],{"class":258},[145,25317,779],{"class":159},[145,25319,412],{"class":262},[145,25321,25322,25324,25326,25328,25330,25332,25334,25336,25338,25340,25342,25344,25346],{"class":147,"line":541},[145,25323,5392],{"class":155},[145,25325,424],{"class":262},[145,25327,457],{"class":258},[145,25329,23898],{"class":159},[145,25331,577],{"class":155},[145,25333,23492],{"class":262},[145,25335,11657],{"class":159},[145,25337,290],{"class":262},[145,25339,17747],{"class":159},[145,25341,108],{"class":262},[145,25343,583],{"class":155},[145,25345,466],{"class":159},[145,25347,392],{"class":262},[145,25349,25350,25352],{"class":147,"line":552},[145,25351,763],{"class":258},[145,25353,23465],{"class":262},[145,25355,25356,25358,25360,25362,25364,25366,25368,25370,25372,25374,25376,25378,25380],{"class":147,"line":563},[145,25357,696],{"class":155},[145,25359,424],{"class":262},[145,25361,457],{"class":258},[145,25363,11686],{"class":159},[145,25365,577],{"class":155},[145,25367,718],{"class":262},[145,25369,583],{"class":155},[145,25371,114],{"class":159},[145,25373,577],{"class":155},[145,25375,708],{"class":262},[145,25377,583],{"class":155},[145,25379,10516],{"class":159},[145,25381,392],{"class":262},[145,25383,25384],{"class":147,"line":590},[145,25385,11710],{"class":262},[145,25387,25388,25390,25392],{"class":147,"line":602},[145,25389,671],{"class":262},[145,25391,9364],{"class":258},[145,25393,11719],{"class":262},[145,25395,25396,25398],{"class":147,"line":608},[145,25397,1512],{"class":258},[145,25399,11741],{"class":155},[145,25401,25402],{"class":147,"line":614},[145,25403,357],{"emptyLinePlaceholder":58},[145,25405,25406],{"class":147,"line":625},[145,25407,25408],{"class":174},"# --- Multi-Image Composition with @Tags ---\n",[145,25410,25411,25413,25415],{"class":147,"line":630},[145,25412,3476],{"class":262},[145,25414,266],{"class":258},[145,25416,445],{"class":262},[145,25418,25419,25421,25423,25425],{"class":147,"line":647},[145,25420,3485],{"class":159},[145,25422,454],{"class":262},[145,25424,1083],{"class":159},[145,25426,469],{"class":262},[145,25428,25429,25431],{"class":147,"line":668},[145,25430,3496],{"class":159},[145,25432,1098],{"class":262},[145,25434,25435],{"class":147,"line":688},[145,25436,25437],{"class":159},"        \"@Image1 is a parkour runner in dark athletic gear. \"\n",[145,25439,25440],{"class":147,"line":693},[145,25441,25442],{"class":159},"        \"@Image2 is a futuristic city rooftop at twilight. \"\n",[145,25444,25445],{"class":147,"line":738},[145,25446,25447],{"class":159},"        \"@Image3 is a neon-lit alleyway. \"\n",[145,25449,25450],{"class":147,"line":743},[145,25451,25452],{"class":159},"        \"@Image4 is a glass skyscraper facade. \"\n",[145,25454,25455],{"class":147,"line":760},[145,25456,25457],{"class":159},"        \"@Image5 provides the cyberpunk color grading reference. \"\n",[145,25459,25460],{"class":147,"line":769},[145,25461,25462],{"class":159},"        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n",[145,25464,25465],{"class":147,"line":784},[145,25466,25467],{"class":159},"        \"leaps over the edge, flips through the alleyway (@Image3), \"\n",[145,25469,25470],{"class":147,"line":810},[145,25471,25472],{"class":159},"        \"and wall-runs along the skyscraper (@Image4). \"\n",[145,25474,25475],{"class":147,"line":837},[145,25476,25477],{"class":159},"        \"Dynamic handheld camera follows the action. \"\n",[145,25479,25480],{"class":147,"line":842},[145,25481,25482],{"class":159},"        \"Cyberpunk neon color palette from @Image5 throughout.\"\n",[145,25484,25485],{"class":147,"line":848},[145,25486,3620],{"class":262},[145,25488,25489,25491],{"class":147,"line":853},[145,25490,15181],{"class":159},[145,25492,2506],{"class":262},[145,25494,25495,25498],{"class":147,"line":858},[145,25496,25497],{"class":159},"        \"https://example.com/runner.jpg\"",[145,25499,469],{"class":262},[145,25501,25502,25505],{"class":147,"line":869},[145,25503,25504],{"class":159},"        \"https://example.com/rooftop.jpg\"",[145,25506,469],{"class":262},[145,25508,25509,25512],{"class":147,"line":875},[145,25510,25511],{"class":159},"        \"https://example.com/alley.jpg\"",[145,25513,469],{"class":262},[145,25515,25516,25519],{"class":147,"line":900},[145,25517,25518],{"class":159},"        \"https://example.com/skyscraper.jpg\"",[145,25520,469],{"class":262},[145,25522,25523],{"class":147,"line":921},[145,25524,25525],{"class":159},"        \"https://example.com/cyberpunk-ref.jpg\"\n",[145,25527,25528],{"class":147,"line":927},[145,25529,16164],{"class":262},[145,25531,25532,25534,25536,25538],{"class":147,"line":932},[145,25533,3508],{"class":159},[145,25535,454],{"class":262},[145,25537,513],{"class":155},[145,25539,469],{"class":262},[145,25541,25542,25544,25546,25548],{"class":147,"line":956},[145,25543,3520],{"class":159},[145,25545,454],{"class":262},[145,25547,3525],{"class":159},[145,25549,469],{"class":262},[145,25551,25552,25554,25556,25558],{"class":147,"line":981},[145,25553,3532],{"class":159},[145,25555,454],{"class":262},[145,25557,1167],{"class":159},[145,25559,469],{"class":262},[145,25561,25562,25564,25566],{"class":147,"line":987},[145,25563,3548],{"class":159},[145,25565,454],{"class":262},[145,25567,3553],{"class":155},[145,25569,25570],{"class":147,"line":992},[145,25571,486],{"class":262},[145,25573,25574],{"class":147,"line":1009},[145,25575,357],{"emptyLinePlaceholder":58},[145,25577,25578,25580,25582],{"class":147,"line":1044},[145,25579,24091],{"class":262},[145,25581,266],{"class":258},[145,25583,1219],{"class":262},[145,25585,25586,25588,25590,25592,25594],{"class":147,"line":1049},[145,25587,6341],{"class":258},[145,25589,466],{"class":159},[145,25591,571],{"class":155},[145,25593,1232],{"class":159},[145,25595,469],{"class":262},[145,25597,25598,25600,25602,25604],{"class":147,"line":1054},[145,25599,6354],{"class":593},[145,25601,266],{"class":258},[145,25603,440],{"class":155},[145,25605,469],{"class":262},[145,25607,25608,25610,25612],{"class":147,"line":1065},[145,25609,6365],{"class":593},[145,25611,266],{"class":258},[145,25613,2603],{"class":262},[145,25615,25616],{"class":147,"line":1075},[145,25617,392],{"class":262},[145,25619,25620,25622,25624],{"class":147,"line":1092},[145,25621,12031],{"class":262},[145,25623,266],{"class":258},[145,25625,11560],{"class":262},[145,25627,25628,25630,25632,25634,25636,25638,25640,25642,25644,25646,25648],{"class":147,"line":1101},[145,25629,6387],{"class":155},[145,25631,424],{"class":262},[145,25633,457],{"class":258},[145,25635,24148],{"class":159},[145,25637,577],{"class":155},[145,25639,11605],{"class":262},[145,25641,19692],{"class":159},[145,25643,1331],{"class":262},[145,25645,583],{"class":155},[145,25647,466],{"class":159},[145,25649,392],{"class":262},[145,25651,25652],{"class":147,"line":1107},[145,25653,357],{"emptyLinePlaceholder":58},[145,25655,25656,25658,25660,25662,25664],{"class":147,"line":1113},[145,25657,24176],{"class":262},[145,25659,266],{"class":258},[145,25661,24181],{"class":262},[145,25663,7476],{"class":159},[145,25665,1431],{"class":262},[92,25667,25669],{"id":25668},"demo-parkour-urbano-con-5-referencias-de-imagen","Demo: Parkour urbano con 5 referencias de imagen",[56,25671,60,25672],{"controls":58,"playsInline":58,"style":59},[62,25673],{"src":12051,"type":65},[11,25675,25676,14079,25678],{},[23,25677,24209],{},[2434,25679,25680],{},"\"@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,25682,25683,25684,25686],{},"Cinco imágenes separadas, un personaje, tres entornos y una referencia de estilo, se combinan en una sola secuencia de acción continua. Cada etiqueta ",[28,25685,3960],{}," le da al modelo instrucciones precisas sobre qué elemento visual controla qué parte de la escena.",[92,25688,25690],{"id":25689},"asignaciones-comunes-de-roles-con-tag","Asignaciones comunes de roles con @Tag",[11,25692,23075,25693,25695],{},[28,25694,22930],{}," es flexible. Estos son los patrones más efectivos:",[1849,25697,25698,25711],{},[1852,25699,25700],{},[1855,25701,25702,25705,25708],{},[1858,25703,25704],{},"Rol",[1858,25706,25707],{},"Uso de etiqueta en el prompt",[1858,25709,25710],{},"Propósito",[1865,25712,25713,25726,25739,25752,25765,25778],{},[1855,25714,25715,25718,25723],{},[1870,25716,25717],{},"Personaje",[1870,25719,25720],{},[28,25721,25722],{},"@Image1 is the main character",[1870,25724,25725],{},"Preserva identidad, vestimenta, rasgos",[1855,25727,25728,25731,25736],{},[1870,25729,25730],{},"Fondo",[1870,25732,25733],{},[28,25734,25735],{},"@Image2 is the environment",[1870,25737,25738],{},"Establece la ubicación de la escena",[1855,25740,25741,25744,25749],{},[1870,25742,25743],{},"Referencia de estilo",[1870,25745,25746],{},[28,25747,25748],{},"@Image3 defines the art style",[1870,25750,25751],{},"Controla la estética del renderizado",[1855,25753,25754,25757,25762],{},[1870,25755,25756],{},"Objeto/accesorio",[1870,25758,25759],{},[28,25760,25761],{},"@Image4 is the product on the table",[1870,25763,25764],{},"Coloca elementos específicos en la escena",[1855,25766,25767,25770,25775],{},[1870,25768,25769],{},"Gradación de color",[1870,25771,25772],{},[28,25773,25774],{},"@Image5 is the color palette",[1870,25776,25777],{},"Aplica ambiente/tono desde la referencia",[1855,25779,25780,25783,25788],{},[1870,25781,25782],{},"Referencia de textura",[1870,25784,25785],{},[28,25786,25787],{},"@Image6 provides surface textures",[1870,25789,25790],{},"Transferencia de material/textura",[92,25792,25794],{"id":25793},"demo-personaje-con-referencia-de-estilo","Demo: Personaje con referencia de estilo",[56,25796,60,25797],{"controls":58,"playsInline":58,"style":59},[62,25798],{"src":25799,"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,25801,25802,14079,25804],{},[23,25803,24209],{},[2434,25805,25806],{},"\"@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,25808,25809,25810,1580],{},"Una sola imagen de referencia de personaje controla la identidad mientras el prompt dirige el entorno y la acción. El abrigo rojo, las proporciones corporales y el estilo de movimiento derivan todos de ",[28,25811,2722],{},[11,25813,25814,25815,25817,25818,1580],{},"Para la referencia completa de ",[28,25816,22930],{},", incluyendo etiquetas de video y audio, combinaciones de medios mixtos y patrones avanzados de roles, consulte la ",[37,25819,23090],{"href":2781},[45,25821],{},[48,25823,25825],{"id":25824},"mantener-la-consistencia-de-personajes-entre-tomas","Mantener la consistencia de personajes entre tomas",[11,25827,25828,25829,25832,25833,25835],{},"Un solo clip generado es útil. Una secuencia de clips con el ",[2434,25830,25831],{},"mismo personaje"," en diferentes escenas es una historia. La consistencia de personajes es el problema más difícil en la generación de video con IA, y el sistema ",[28,25834,22930],{}," de Seedance 2.0 proporciona la solución más fiable disponible a través de una API.",[92,25837,25839],{"id":25838},"el-patrón-de-bloqueo-de-personaje","El patrón de bloqueo de personaje",[11,25841,25842,25843,25845],{},"Para mantener el mismo personaje en múltiples tomas, use la misma imagen de referencia de personaje como ",[28,25844,2722],{}," en cada solicitud de generación. Cambie únicamente el prompt y las imágenes de fondo/entorno.",[136,25847,25849],{"className":326,"code":25848,"language":328,"meta":141,"style":141},"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,25850,25851,25861,25865,25874,25879,25885,25890,25895,25900,25904,25912,25921,25925,25929,25935,25940,25945,25950,25954,25960,25969,25973,25977,25983,25988,25993,25998,26003,26007,26013,26021,26025,26029,26033,26043,26065,26073,26083,26094,26101,26111,26121,26129,26133,26141,26153,26163,26171,26175,26185,26189,26194,26214,26246,26250,26255,26269,26296],{"__ignoreMap":141},[145,25852,25853,25856,25858],{"class":147,"line":148},[145,25854,25855],{"class":155},"CHARACTER_IMAGE",[145,25857,372],{"class":258},[145,25859,25860],{"class":159}," \"https://example.com/my-character.jpg\"\n",[145,25862,25863],{"class":147,"line":166},[145,25864,357],{"emptyLinePlaceholder":58},[145,25866,25867,25870,25872],{"class":147,"line":178},[145,25868,25869],{"class":262},"shots ",[145,25871,266],{"class":258},[145,25873,8637],{"class":262},[145,25875,25876],{"class":147,"line":187},[145,25877,25878],{"class":262},"    {\n",[145,25880,25881,25883],{"class":147,"line":360},[145,25882,1095],{"class":159},[145,25884,1098],{"class":262},[145,25886,25887],{"class":147,"line":366},[145,25888,25889],{"class":159},"            \"@Image1 is the main character. She walks into a cozy library, \"\n",[145,25891,25892],{"class":147,"line":378},[145,25893,25894],{"class":159},"            \"looks around with wonder, and reaches for a book on the top shelf. \"\n",[145,25896,25897],{"class":147,"line":395},[145,25898,25899],{"class":159},"            \"Warm golden lighting. Camera at eye level, slow push in.\"\n",[145,25901,25902],{"class":147,"line":400},[145,25903,1122],{"class":262},[145,25905,25906,25909],{"class":147,"line":415},[145,25907,25908],{"class":159},"        \"extra_images\"",[145,25910,25911],{"class":262},": [],\n",[145,25913,25914,25916,25918],{"class":147,"line":432},[145,25915,1128],{"class":159},[145,25917,454],{"class":262},[145,25919,25920],{"class":155},"8\n",[145,25922,25923],{"class":147,"line":437},[145,25924,22010],{"class":262},[145,25926,25927],{"class":147,"line":448},[145,25928,25878],{"class":262},[145,25930,25931,25933],{"class":147,"line":472},[145,25932,1095],{"class":159},[145,25934,1098],{"class":262},[145,25936,25937],{"class":147,"line":483},[145,25938,25939],{"class":159},"            \"@Image1 is the main character. She sits at a wooden reading table, \"\n",[145,25941,25942],{"class":147,"line":489},[145,25943,25944],{"class":159},"            \"opens the book, and pages start glowing with magical light. \"\n",[145,25946,25947],{"class":147,"line":494},[145,25948,25949],{"class":159},"            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n",[145,25951,25952],{"class":147,"line":499},[145,25953,1122],{"class":262},[145,25955,25956,25958],{"class":147,"line":519},[145,25957,25908],{"class":159},[145,25959,25911],{"class":262},[145,25961,25962,25964,25966],{"class":147,"line":525},[145,25963,1128],{"class":159},[145,25965,454],{"class":262},[145,25967,25968],{"class":155},"10\n",[145,25970,25971],{"class":147,"line":536},[145,25972,22010],{"class":262},[145,25974,25975],{"class":147,"line":541},[145,25976,25878],{"class":262},[145,25978,25979,25981],{"class":147,"line":552},[145,25980,1095],{"class":159},[145,25982,1098],{"class":262},[145,25984,25985],{"class":147,"line":563},[145,25986,25987],{"class":159},"            \"@Image1 is the main character. She steps out of the library into \"\n",[145,25989,25990],{"class":147,"line":590},[145,25991,25992],{"class":159},"            \"a fantastical world that matches the book's illustrations. \"\n",[145,25994,25995],{"class":147,"line":602},[145,25996,25997],{"class":159},"            \"Vibrant colors replace the muted library tones. \"\n",[145,25999,26000],{"class":147,"line":608},[145,26001,26002],{"class":159},"            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n",[145,26004,26005],{"class":147,"line":614},[145,26006,1122],{"class":262},[145,26008,26009,26011],{"class":147,"line":625},[145,26010,25908],{"class":159},[145,26012,25911],{"class":262},[145,26014,26015,26017,26019],{"class":147,"line":630},[145,26016,1128],{"class":159},[145,26018,454],{"class":262},[145,26020,25968],{"class":155},[145,26022,26023],{"class":147,"line":647},[145,26024,22010],{"class":262},[145,26026,26027],{"class":147,"line":668},[145,26028,644],{"class":262},[145,26030,26031],{"class":147,"line":688},[145,26032,357],{"emptyLinePlaceholder":58},[145,26034,26035,26037,26040],{"class":147,"line":693},[145,26036,502],{"class":258},[145,26038,26039],{"class":151}," generate_shot",[145,26041,26042],{"class":262},"(shot):\n",[145,26044,26045,26047,26049,26051,26053,26055,26057,26060,26063],{"class":147,"line":738},[145,26046,6034],{"class":262},[145,26048,266],{"class":258},[145,26050,7961],{"class":262},[145,26052,25855],{"class":155},[145,26054,14725],{"class":262},[145,26056,5246],{"class":258},[145,26058,26059],{"class":262}," shot[",[145,26061,26062],{"class":159},"\"extra_images\"",[145,26064,644],{"class":262},[145,26066,26067,26069,26071],{"class":147,"line":743},[145,26068,1068],{"class":262},[145,26070,266],{"class":258},[145,26072,445],{"class":262},[145,26074,26075,26077,26079,26081],{"class":147,"line":760},[145,26076,1078],{"class":159},[145,26078,454],{"class":262},[145,26080,1083],{"class":159},[145,26082,469],{"class":262},[145,26084,26085,26087,26090,26092],{"class":147,"line":769},[145,26086,1095],{"class":159},[145,26088,26089],{"class":262},": shot[",[145,26091,5723],{"class":159},[145,26093,10638],{"class":262},[145,26095,26096,26098],{"class":147,"line":784},[145,26097,2503],{"class":159},[145,26099,26100],{"class":262},": image_urls,\n",[145,26102,26103,26105,26107,26109],{"class":147,"line":810},[145,26104,1128],{"class":159},[145,26106,26089],{"class":262},[145,26108,5768],{"class":159},[145,26110,10638],{"class":262},[145,26112,26113,26115,26117,26119],{"class":147,"line":837},[145,26114,1145],{"class":159},[145,26116,454],{"class":262},[145,26118,3525],{"class":159},[145,26120,469],{"class":262},[145,26122,26123,26125,26127],{"class":147,"line":842},[145,26124,1162],{"class":159},[145,26126,454],{"class":262},[145,26128,2545],{"class":159},[145,26130,26131],{"class":147,"line":848},[145,26132,1192],{"class":262},[145,26134,26135,26137,26139],{"class":147,"line":853},[145,26136,9454],{"class":262},[145,26138,266],{"class":258},[145,26140,1219],{"class":262},[145,26142,26143,26145,26147,26149,26151],{"class":147,"line":858},[145,26144,1225],{"class":258},[145,26146,466],{"class":159},[145,26148,571],{"class":155},[145,26150,1232],{"class":159},[145,26152,469],{"class":262},[145,26154,26155,26157,26159,26161],{"class":147,"line":869},[145,26156,1244],{"class":593},[145,26158,266],{"class":258},[145,26160,440],{"class":155},[145,26162,469],{"class":262},[145,26164,26165,26167,26169],{"class":147,"line":875},[145,26166,1260],{"class":593},[145,26168,266],{"class":258},[145,26170,2603],{"class":262},[145,26172,26173],{"class":147,"line":900},[145,26174,1274],{"class":262},[145,26176,26177,26179,26181,26183],{"class":147,"line":921},[145,26178,1512],{"class":258},[145,26180,20564],{"class":262},[145,26182,7476],{"class":159},[145,26184,644],{"class":262},[145,26186,26187],{"class":147,"line":927},[145,26188,357],{"emptyLinePlaceholder":58},[145,26190,26191],{"class":147,"line":932},[145,26192,26193],{"class":174},"# Generate all shots\n",[145,26195,26196,26199,26201,26204,26206,26209,26211],{"class":147,"line":956},[145,26197,26198],{"class":262},"task_ids ",[145,26200,266],{"class":258},[145,26202,26203],{"class":262}," [generate_shot(shot) ",[145,26205,7998],{"class":258},[145,26207,26208],{"class":262}," shot ",[145,26210,965],{"class":258},[145,26212,26213],{"class":262}," shots]\n",[145,26215,26216,26218,26220,26222,26225,26227,26230,26232,26235,26237,26240,26242,26244],{"class":147,"line":981},[145,26217,6387],{"class":155},[145,26219,424],{"class":262},[145,26221,457],{"class":258},[145,26223,26224],{"class":159},"\"Submitted ",[145,26226,6073],{"class":155},[145,26228,26229],{"class":262},"(task_ids)",[145,26231,583],{"class":155},[145,26233,26234],{"class":159}," shots: ",[145,26236,577],{"class":155},[145,26238,26239],{"class":262},"task_ids",[145,26241,583],{"class":155},[145,26243,466],{"class":159},[145,26245,392],{"class":262},[145,26247,26248],{"class":147,"line":987},[145,26249,357],{"emptyLinePlaceholder":58},[145,26251,26252],{"class":147,"line":992},[145,26253,26254],{"class":174},"# Poll each shot\n",[145,26256,26257,26259,26262,26264,26266],{"class":147,"line":1009},[145,26258,7998],{"class":258},[145,26260,26261],{"class":262}," i, task_id ",[145,26263,965],{"class":258},[145,26265,6094],{"class":155},[145,26267,26268],{"class":262},"(task_ids):\n",[145,26270,26271,26273,26275,26277,26279,26281,26284,26286,26288,26290,26292,26294],{"class":147,"line":1044},[145,26272,878],{"class":155},[145,26274,424],{"class":262},[145,26276,457],{"class":258},[145,26278,466],{"class":159},[145,26280,1476],{"class":155},[145,26282,26283],{"class":159},"Waiting for Shot ",[145,26285,577],{"class":155},[145,26287,6132],{"class":262},[145,26289,5246],{"class":258},[145,26291,9828],{"class":155},[145,26293,895],{"class":159},[145,26295,392],{"class":262},[145,26297,26298],{"class":147,"line":1049},[145,26299,26300],{"class":262},"    wait_for_video(task_id)\n",[92,26302,26304],{"id":26303},"demo-secuencia-narrativa-en-la-biblioteca","Demo: Secuencia narrativa en la biblioteca",[56,26306,60,26307],{"controls":58,"playsInline":58,"style":59},[62,26308],{"src":64,"type":65},[11,26310,26311,14079,26313],{},[23,26312,24209],{},[2434,26314,26315],{},"\"@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,26317,26318],{},"El personaje, una niña con trenzas, se mantiene visualmente consistente porque la misma imagen de referencia ancla cada toma. El modelo preserva sus proporciones, vestimenta y características visuales mientras genera diferentes acciones y entornos.",[92,26320,26322],{"id":26321},"consejos-de-consistencia","Consejos de consistencia",[11,26324,26325,26328],{},[23,26326,26327],{},"Use una referencia de personaje clara y bien iluminada."," El modelo extrae rasgos de identidad de su imagen de referencia. Una imagen borrosa, mal iluminada o muy ocluida le da al modelo menos información con la que trabajar. Las tomas frontales, de cuerpo completo o de medio cuerpo con fondos limpios producen la mejor consistencia.",[11,26330,26331,26334,26335,26337],{},[23,26332,26333],{},"Mantenga la descripción del personaje al mínimo en los prompts."," Si ",[28,26336,2722],{}," ya muestra a una chica con vestido azul, no escriba \"una chica con vestido rojo\" en el prompt. Las descripciones contradictorias obligan al modelo a elegir entre su imagen y su texto, reduciendo la consistencia.",[11,26339,26340,26343],{},[23,26341,26342],{},"Mantenga la misma relación de aspecto en todas las tomas."," Cambiar de 16:9 a 9:16 a mitad de secuencia fuerza un encuadre diferente, lo que puede alterar cómo aparece el personaje. Elija una relación y manténgala.",[11,26345,26346,26349,26350,26352],{},[23,26347,26348],{},"Añada imágenes de entorno como @tags separados."," En lugar de describir el fondo completamente en texto, proporcione una imagen de referencia de fondo como ",[28,26351,2732],{},". Esto le da control preciso sobre el personaje y el entorno manteniéndolos visualmente separados.",[136,26354,26356],{"className":326,"code":26355,"language":328,"meta":141,"style":141},"# 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,26357,26358,26363,26378,26383,26387,26392,26407],{"__ignoreMap":141},[145,26359,26360],{"class":147,"line":148},[145,26361,26362],{"class":174},"# Shot 1: Character in library\n",[145,26364,26365,26367,26369,26371,26373,26376],{"class":147,"line":166},[145,26366,6041],{"class":159},[145,26368,10632],{"class":262},[145,26370,25855],{"class":155},[145,26372,290],{"class":262},[145,26374,26375],{"class":159},"\"https://example.com/library.jpg\"",[145,26377,644],{"class":262},[145,26379,26380],{"class":147,"line":178},[145,26381,26382],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n",[145,26384,26385],{"class":147,"line":187},[145,26386,357],{"emptyLinePlaceholder":58},[145,26388,26389],{"class":147,"line":360},[145,26390,26391],{"class":174},"# Shot 2: Character in forest\n",[145,26393,26394,26396,26398,26400,26402,26405],{"class":147,"line":366},[145,26395,6041],{"class":159},[145,26397,10632],{"class":262},[145,26399,25855],{"class":155},[145,26401,290],{"class":262},[145,26403,26404],{"class":159},"\"https://example.com/forest.jpg\"",[145,26406,644],{"class":262},[145,26408,26409],{"class":147,"line":378},[145,26410,26411],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[11,26413,26414,26415,26417,26418,26420],{},"Este patrón, ",[28,26416,2722],{}," fijo para el personaje, ",[28,26419,2732],{}," variable para el entorno, es el flujo de trabajo multi-toma más fiable disponible a través de cualquier API de video con IA actual.",[92,26422,26424],{"id":26423},"avanzado-pipeline-narrativo-multi-toma","Avanzado: Pipeline narrativo multi-toma",[11,26426,26427],{},"Para narrativas más largas (más de 30 segundos), necesita generar múltiples clips y unirlos. Aquí tiene un enfoque estructurado que gestiona el pipeline completo: definición de lista de tomas, generación paralela y salida ordenada:",[136,26429,26431],{"className":326,"code":26430,"language":328,"meta":141,"style":141},"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,26432,26433,26439,26445,26451,26457,26461,26469,26477,26485,26501,26509,26513,26517,26527,26531,26540,26544,26556,26562,26567,26572,26577,26582,26586,26593,26602,26606,26610,26621,26627,26632,26637,26642,26647,26651,26662,26670,26674,26678,26689,26695,26699,26704,26709,26714,26719,26723,26729,26737,26741,26745,26749,26758,26763,26784,26792,26802,26812,26818,26828,26838,26848,26856,26860,26894,26906,26926,26930,26946,26951,26973,26981,26991,27008,27032,27038,27046,27054,27060,27064,27069,27077,27090,27099,27104,27141,27150,27154,27159,27168,27178,27208,27222,27244,27261,27281,27314,27320,27346,27350,27355,27370,27382],{"__ignoreMap":141},[145,26434,26435,26437],{"class":147,"line":148},[145,26436,335],{"class":258},[145,26438,8138],{"class":262},[145,26440,26441,26443],{"class":147,"line":166},[145,26442,335],{"class":258},[145,26444,352],{"class":262},[145,26446,26447,26449],{"class":147,"line":178},[145,26448,335],{"class":258},[145,26450,345],{"class":262},[145,26452,26453,26455],{"class":147,"line":187},[145,26454,335],{"class":258},[145,26456,6546],{"class":262},[145,26458,26459],{"class":147,"line":360},[145,26460,357],{"emptyLinePlaceholder":58},[145,26462,26463,26465,26467],{"class":147,"line":366},[145,26464,381],{"class":155},[145,26466,372],{"class":258},[145,26468,17401],{"class":159},[145,26470,26471,26473,26475],{"class":147,"line":378},[145,26472,369],{"class":155},[145,26474,372],{"class":258},[145,26476,9077],{"class":159},[145,26478,26479,26481,26483],{"class":147,"line":395},[145,26480,440],{"class":155},[145,26482,372],{"class":258},[145,26484,445],{"class":262},[145,26486,26487,26489,26491,26493,26495,26497,26499],{"class":147,"line":400},[145,26488,451],{"class":159},[145,26490,454],{"class":262},[145,26492,457],{"class":258},[145,26494,460],{"class":159},[145,26496,463],{"class":155},[145,26498,466],{"class":159},[145,26500,469],{"class":262},[145,26502,26503,26505,26507],{"class":147,"line":415},[145,26504,475],{"class":159},[145,26506,454],{"class":262},[145,26508,480],{"class":159},[145,26510,26511],{"class":147,"line":432},[145,26512,486],{"class":262},[145,26514,26515],{"class":147,"line":437},[145,26516,357],{"emptyLinePlaceholder":58},[145,26518,26519,26522,26524],{"class":147,"line":448},[145,26520,26521],{"class":155},"CHARACTER_REF",[145,26523,372],{"class":258},[145,26525,26526],{"class":159}," \"https://example.com/story-character.jpg\"\n",[145,26528,26529],{"class":147,"line":472},[145,26530,357],{"emptyLinePlaceholder":58},[145,26532,26533,26536,26538],{"class":147,"line":483},[145,26534,26535],{"class":155},"SHOT_LIST",[145,26537,372],{"class":258},[145,26539,8637],{"class":262},[145,26541,26542],{"class":147,"line":489},[145,26543,25878],{"class":262},[145,26545,26546,26549,26551,26554],{"class":147,"line":494},[145,26547,26548],{"class":159},"        \"shot_id\"",[145,26550,454],{"class":262},[145,26552,26553],{"class":159},"\"01_entrance\"",[145,26555,469],{"class":262},[145,26557,26558,26560],{"class":147,"line":499},[145,26559,1095],{"class":159},[145,26561,1098],{"class":262},[145,26563,26564],{"class":147,"line":519},[145,26565,26566],{"class":159},"            \"@Image1 is the main character. \"\n",[145,26568,26569],{"class":147,"line":525},[145,26570,26571],{"class":159},"            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n",[145,26573,26574],{"class":147,"line":536},[145,26575,26576],{"class":159},"            \"Dust swirls in the doorway light. \"\n",[145,26578,26579],{"class":147,"line":541},[145,26580,26581],{"class":159},"            \"Camera follows her from behind, over-the-shoulder angle.\"\n",[145,26583,26584],{"class":147,"line":552},[145,26585,1122],{"class":262},[145,26587,26588,26591],{"class":147,"line":563},[145,26589,26590],{"class":159},"        \"env_images\"",[145,26592,25911],{"class":262},[145,26594,26595,26597,26599],{"class":147,"line":590},[145,26596,1128],{"class":159},[145,26598,454],{"class":262},[145,26600,26601],{"class":155},"6\n",[145,26603,26604],{"class":147,"line":602},[145,26605,22010],{"class":262},[145,26607,26608],{"class":147,"line":608},[145,26609,25878],{"class":262},[145,26611,26612,26614,26616,26619],{"class":147,"line":614},[145,26613,26548],{"class":159},[145,26615,454],{"class":262},[145,26617,26618],{"class":159},"\"02_discovery\"",[145,26620,469],{"class":262},[145,26622,26623,26625],{"class":147,"line":625},[145,26624,1095],{"class":159},[145,26626,1098],{"class":262},[145,26628,26629],{"class":147,"line":630},[145,26630,26631],{"class":159},"            \"@Image1 is the main character. @Image2 is the room interior. \"\n",[145,26633,26634],{"class":147,"line":647},[145,26635,26636],{"class":159},"            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n",[145,26638,26639],{"class":147,"line":668},[145,26640,26641],{"class":159},"            \"Her face shows surprise. Blue light illuminates her features. \"\n",[145,26643,26644],{"class":147,"line":688},[145,26645,26646],{"class":159},"            \"Camera pushes in from medium shot to close-up on her expression.\"\n",[145,26648,26649],{"class":147,"line":693},[145,26650,1122],{"class":262},[145,26652,26653,26655,26657,26660],{"class":147,"line":738},[145,26654,26590],{"class":159},[145,26656,10632],{"class":262},[145,26658,26659],{"class":159},"\"https://example.com/mysterious-room.jpg\"",[145,26661,10638],{"class":262},[145,26663,26664,26666,26668],{"class":147,"line":743},[145,26665,1128],{"class":159},[145,26667,454],{"class":262},[145,26669,25920],{"class":155},[145,26671,26672],{"class":147,"line":760},[145,26673,22010],{"class":262},[145,26675,26676],{"class":147,"line":769},[145,26677,25878],{"class":262},[145,26679,26680,26682,26684,26687],{"class":147,"line":784},[145,26681,26548],{"class":159},[145,26683,454],{"class":262},[145,26685,26686],{"class":159},"\"03_transformation\"",[145,26688,469],{"class":262},[145,26690,26691,26693],{"class":147,"line":810},[145,26692,1095],{"class":159},[145,26694,1098],{"class":262},[145,26696,26697],{"class":147,"line":837},[145,26698,26566],{"class":159},[145,26700,26701],{"class":147,"line":842},[145,26702,26703],{"class":159},"            \"She reaches out and touches the glowing object. \"\n",[145,26705,26706],{"class":147,"line":848},[145,26707,26708],{"class":159},"            \"Light radiates outward from the point of contact. \"\n",[145,26710,26711],{"class":147,"line":853},[145,26712,26713],{"class":159},"            \"The room transforms — walls dissolve into a starfield. \"\n",[145,26715,26716],{"class":147,"line":858},[145,26717,26718],{"class":159},"            \"Camera rapidly pulls back to extreme wide shot.\"\n",[145,26720,26721],{"class":147,"line":869},[145,26722,1122],{"class":262},[145,26724,26725,26727],{"class":147,"line":875},[145,26726,26590],{"class":159},[145,26728,25911],{"class":262},[145,26730,26731,26733,26735],{"class":147,"line":900},[145,26732,1128],{"class":159},[145,26734,454],{"class":262},[145,26736,25968],{"class":155},[145,26738,26739],{"class":147,"line":921},[145,26740,22010],{"class":262},[145,26742,26743],{"class":147,"line":927},[145,26744,644],{"class":262},[145,26746,26747],{"class":147,"line":932},[145,26748,357],{"emptyLinePlaceholder":58},[145,26750,26751,26753,26756],{"class":147,"line":956},[145,26752,502],{"class":258},[145,26754,26755],{"class":151}," submit_shot",[145,26757,26042],{"class":262},[145,26759,26760],{"class":147,"line":981},[145,26761,26762],{"class":159},"    \"\"\"Submit a single shot for generation.\"\"\"\n",[145,26764,26765,26767,26769,26771,26773,26775,26777,26779,26782],{"class":147,"line":987},[145,26766,6034],{"class":262},[145,26768,266],{"class":258},[145,26770,7961],{"class":262},[145,26772,26521],{"class":155},[145,26774,14725],{"class":262},[145,26776,5246],{"class":258},[145,26778,26059],{"class":262},[145,26780,26781],{"class":159},"\"env_images\"",[145,26783,644],{"class":262},[145,26785,26786,26788,26790],{"class":147,"line":992},[145,26787,1068],{"class":262},[145,26789,266],{"class":258},[145,26791,445],{"class":262},[145,26793,26794,26796,26798,26800],{"class":147,"line":1009},[145,26795,1078],{"class":159},[145,26797,454],{"class":262},[145,26799,1083],{"class":159},[145,26801,469],{"class":262},[145,26803,26804,26806,26808,26810],{"class":147,"line":1044},[145,26805,1095],{"class":159},[145,26807,26089],{"class":262},[145,26809,5723],{"class":159},[145,26811,10638],{"class":262},[145,26813,26814,26816],{"class":147,"line":1049},[145,26815,2503],{"class":159},[145,26817,26100],{"class":262},[145,26819,26820,26822,26824,26826],{"class":147,"line":1054},[145,26821,1128],{"class":159},[145,26823,26089],{"class":262},[145,26825,5768],{"class":159},[145,26827,10638],{"class":262},[145,26829,26830,26832,26834,26836],{"class":147,"line":1065},[145,26831,1145],{"class":159},[145,26833,454],{"class":262},[145,26835,3525],{"class":159},[145,26837,469],{"class":262},[145,26839,26840,26842,26844,26846],{"class":147,"line":1075},[145,26841,1162],{"class":159},[145,26843,454],{"class":262},[145,26845,1167],{"class":159},[145,26847,469],{"class":262},[145,26849,26850,26852,26854],{"class":147,"line":1092},[145,26851,1179],{"class":159},[145,26853,454],{"class":262},[145,26855,3553],{"class":155},[145,26857,26858],{"class":147,"line":1101},[145,26859,1192],{"class":262},[145,26861,26862,26864,26866,26869,26871,26873,26875,26877,26879,26881,26883,26885,26887,26889,26891],{"class":147,"line":1107},[145,26863,9454],{"class":262},[145,26865,266],{"class":258},[145,26867,26868],{"class":262}," requests.post(",[145,26870,457],{"class":258},[145,26872,466],{"class":159},[145,26874,571],{"class":155},[145,26876,1232],{"class":159},[145,26878,290],{"class":262},[145,26880,17630],{"class":593},[145,26882,266],{"class":258},[145,26884,440],{"class":155},[145,26886,290],{"class":262},[145,26888,1671],{"class":593},[145,26890,266],{"class":258},[145,26892,26893],{"class":262},"payload)\n",[145,26895,26896,26898,26900,26902,26904],{"class":147,"line":1113},[145,26897,7023],{"class":262},[145,26899,266],{"class":258},[145,26901,20564],{"class":262},[145,26903,7476],{"class":159},[145,26905,644],{"class":262},[145,26907,26908,26910,26912,26915,26917,26919,26921,26923],{"class":147,"line":1119},[145,26909,1512],{"class":258},[145,26911,5838],{"class":262},[145,26913,26914],{"class":159},"\"shot_id\"",[145,26916,26089],{"class":262},[145,26918,26914],{"class":159},[145,26920,10546],{"class":262},[145,26922,7476],{"class":159},[145,26924,26925],{"class":262},": task_id}\n",[145,26927,26928],{"class":147,"line":1125},[145,26929,357],{"emptyLinePlaceholder":58},[145,26931,26932,26934,26937,26940,26942,26944],{"class":147,"line":1142},[145,26933,502],{"class":258},[145,26935,26936],{"class":151}," poll_until_done",[145,26938,26939],{"class":262},"(task_id, max_wait",[145,26941,266],{"class":258},[145,26943,11490],{"class":155},[145,26945,516],{"class":262},[145,26947,26948],{"class":147,"line":1159},[145,26949,26950],{"class":159},"    \"\"\"Block until task completes or fails.\"\"\"\n",[145,26952,26953,26955,26957,26959,26961,26963,26965,26967,26969,26971],{"class":147,"line":1176},[145,26954,23327],{"class":262},[145,26956,266],{"class":258},[145,26958,3173],{"class":258},[145,26960,466],{"class":159},[145,26962,571],{"class":155},[145,26964,574],{"class":159},[145,26966,577],{"class":155},[145,26968,580],{"class":262},[145,26970,583],{"class":155},[145,26972,5185],{"class":159},[145,26974,26975,26977,26979],{"class":147,"line":1189},[145,26976,9158],{"class":262},[145,26978,266],{"class":258},[145,26980,9163],{"class":155},[145,26982,26983,26985,26987,26989],{"class":147,"line":1195},[145,26984,544],{"class":258},[145,26986,9170],{"class":262},[145,26988,5784],{"class":258},[145,26990,23368],{"class":262},[145,26992,26993,26995,26997,26999,27001,27003,27005],{"class":147,"line":1200},[145,26994,23389],{"class":262},[145,26996,266],{"class":258},[145,26998,908],{"class":262},[145,27000,17630],{"class":593},[145,27002,266],{"class":258},[145,27004,440],{"class":155},[145,27006,27007],{"class":262},").json()\n",[145,27009,27010,27012,27014,27016,27018,27020,27022,27025,27027,27030],{"class":147,"line":1212},[145,27011,746],{"class":258},[145,27013,23402],{"class":262},[145,27015,641],{"class":159},[145,27017,14725],{"class":262},[145,27019,965],{"class":258},[145,27021,114],{"class":262},[145,27023,27024],{"class":159},"\"completed\"",[145,27026,290],{"class":262},[145,27028,27029],{"class":159},"\"failed\"",[145,27031,516],{"class":262},[145,27033,27034,27036],{"class":147,"line":1222},[145,27035,763],{"class":258},[145,27037,23465],{"class":262},[145,27039,27040,27042,27044],{"class":147,"line":1241},[145,27041,14863],{"class":262},[145,27043,1133],{"class":155},[145,27045,392],{"class":262},[145,27047,27048,27050,27052],{"class":147,"line":1257},[145,27049,671],{"class":262},[145,27051,9364],{"class":258},[145,27053,20765],{"class":155},[145,27055,27056,27058],{"class":147,"line":1271},[145,27057,1512],{"class":258},[145,27059,11741],{"class":155},[145,27061,27062],{"class":147,"line":1277},[145,27063,357],{"emptyLinePlaceholder":58},[145,27065,27066],{"class":147,"line":1286},[145,27067,27068],{"class":174},"# Submit all shots in parallel\n",[145,27070,27071,27073,27075],{"class":147,"line":1300},[145,27072,21710],{"class":262},[145,27074,266],{"class":258},[145,27076,5679],{"class":262},[145,27078,27079,27081,27083,27085,27088],{"class":147,"line":1305},[145,27080,7998],{"class":258},[145,27082,26208],{"class":262},[145,27084,965],{"class":258},[145,27086,27087],{"class":155}," SHOT_LIST",[145,27089,412],{"class":262},[145,27091,27092,27094,27096],{"class":147,"line":1311},[145,27093,1420],{"class":262},[145,27095,266],{"class":258},[145,27097,27098],{"class":262}," submit_shot(shot)\n",[145,27100,27101],{"class":147,"line":1340},[145,27102,27103],{"class":262},"    results.append(result)\n",[145,27105,27106,27108,27110,27112,27114,27116,27118,27121,27123,27125,27127,27129,27131,27133,27135,27137,27139],{"class":147,"line":1374},[145,27107,878],{"class":155},[145,27109,424],{"class":262},[145,27111,457],{"class":258},[145,27113,26224],{"class":159},[145,27115,577],{"class":155},[145,27117,11605],{"class":262},[145,27119,27120],{"class":159},"'shot_id'",[145,27122,1331],{"class":262},[145,27124,583],{"class":155},[145,27126,23583],{"class":159},[145,27128,577],{"class":155},[145,27130,11605],{"class":262},[145,27132,19692],{"class":159},[145,27134,1331],{"class":262},[145,27136,583],{"class":155},[145,27138,466],{"class":159},[145,27140,392],{"class":262},[145,27142,27143,27145,27148],{"class":147,"line":1406},[145,27144,19705],{"class":262},[145,27146,27147],{"class":155},"0.5",[145,27149,392],{"class":262},[145,27151,27152],{"class":147,"line":1411},[145,27153,357],{"emptyLinePlaceholder":58},[145,27155,27156],{"class":147,"line":1417},[145,27157,27158],{"class":174},"# Collect results in order\n",[145,27160,27161,27164,27166],{"class":147,"line":1434},[145,27162,27163],{"class":262},"final_videos ",[145,27165,266],{"class":258},[145,27167,5679],{"class":262},[145,27169,27170,27172,27174,27176],{"class":147,"line":1439},[145,27171,7998],{"class":258},[145,27173,21630],{"class":262},[145,27175,965],{"class":258},[145,27177,7204],{"class":262},[145,27179,27180,27182,27184,27186,27188,27190,27193,27195,27198,27200,27202,27204,27206],{"class":147,"line":1445},[145,27181,878],{"class":155},[145,27183,424],{"class":262},[145,27185,457],{"class":258},[145,27187,466],{"class":159},[145,27189,1476],{"class":155},[145,27191,27192],{"class":159},"Polling ",[145,27194,577],{"class":155},[145,27196,27197],{"class":262},"r[",[145,27199,27120],{"class":159},[145,27201,1331],{"class":262},[145,27203,583],{"class":155},[145,27205,895],{"class":159},[145,27207,392],{"class":262},[145,27209,27210,27213,27215,27218,27220],{"class":147,"line":1465},[145,27211,27212],{"class":262},"    data ",[145,27214,266],{"class":258},[145,27216,27217],{"class":262}," poll_until_done(r[",[145,27219,7476],{"class":159},[145,27221,1431],{"class":262},[145,27223,27224,27226,27229,27232,27234,27236,27238,27240,27242],{"class":147,"line":1493},[145,27225,2320],{"class":258},[145,27227,27228],{"class":262}," data ",[145,27230,27231],{"class":258},"and",[145,27233,23402],{"class":262},[145,27235,641],{"class":159},[145,27237,14725],{"class":262},[145,27239,752],{"class":258},[145,27241,755],{"class":159},[145,27243,412],{"class":262},[145,27245,27246,27249,27251,27253,27255,27257,27259],{"class":147,"line":1504},[145,27247,27248],{"class":262},"        video_url ",[145,27250,266],{"class":258},[145,27252,23402],{"class":262},[145,27254,21346],{"class":159},[145,27256,1359],{"class":262},[145,27258,14747],{"class":159},[145,27260,644],{"class":262},[145,27262,27263,27266,27268,27271,27273,27275,27278],{"class":147,"line":1509},[145,27264,27265],{"class":262},"        final_videos.append({",[145,27267,26914],{"class":159},[145,27269,27270],{"class":262},": r[",[145,27272,26914],{"class":159},[145,27274,10546],{"class":262},[145,27276,27277],{"class":159},"\"url\"",[145,27279,27280],{"class":262},": video_url})\n",[145,27282,27283,27285,27287,27289,27292,27294,27296,27298,27300,27302,27304,27306,27308,27310,27312],{"class":147,"line":1518},[145,27284,696],{"class":155},[145,27286,424],{"class":262},[145,27288,457],{"class":258},[145,27290,27291],{"class":159},"\"  Done: ",[145,27293,577],{"class":155},[145,27295,27197],{"class":262},[145,27297,27120],{"class":159},[145,27299,1331],{"class":262},[145,27301,583],{"class":155},[145,27303,454],{"class":159},[145,27305,577],{"class":155},[145,27307,1484],{"class":262},[145,27309,583],{"class":155},[145,27311,466],{"class":159},[145,27313,392],{"class":262},[145,27315,27316,27318],{"class":147,"line":1523},[145,27317,2357],{"class":258},[145,27319,412],{"class":262},[145,27321,27322,27324,27326,27328,27331,27333,27335,27337,27339,27341,27344],{"class":147,"line":1528},[145,27323,696],{"class":155},[145,27325,424],{"class":262},[145,27327,457],{"class":258},[145,27329,27330],{"class":159},"\"  Failed: ",[145,27332,577],{"class":155},[145,27334,27197],{"class":262},[145,27336,27120],{"class":159},[145,27338,1331],{"class":262},[145,27340,583],{"class":155},[145,27342,27343],{"class":159},": generation failed\"",[145,27345,392],{"class":262},[145,27347,27348],{"class":147,"line":1544},[145,27349,357],{"emptyLinePlaceholder":58},[145,27351,27352],{"class":147,"line":10165},[145,27353,27354],{"class":174},"# Output the ordered shot list\n",[145,27356,27357,27359,27361,27363,27365,27368],{"class":147,"line":10211},[145,27358,6387],{"class":155},[145,27360,424],{"class":262},[145,27362,466],{"class":159},[145,27364,1476],{"class":155},[145,27366,27367],{"class":159},"=== Final Shot List ===\"",[145,27369,392],{"class":262},[145,27371,27372,27374,27377,27379],{"class":147,"line":10216},[145,27373,7998],{"class":258},[145,27375,27376],{"class":262}," v ",[145,27378,965],{"class":258},[145,27380,27381],{"class":262}," final_videos:\n",[145,27383,27384,27386,27388,27390,27392,27394,27397,27399,27401,27403,27405,27407,27409,27412,27414,27416,27418],{"class":147,"line":10221},[145,27385,878],{"class":155},[145,27387,424],{"class":262},[145,27389,457],{"class":258},[145,27391,466],{"class":159},[145,27393,577],{"class":155},[145,27395,27396],{"class":262},"v[",[145,27398,27120],{"class":159},[145,27400,1331],{"class":262},[145,27402,583],{"class":155},[145,27404,454],{"class":159},[145,27406,577],{"class":155},[145,27408,27396],{"class":262},[145,27410,27411],{"class":159},"'url'",[145,27413,1331],{"class":262},[145,27415,583],{"class":155},[145,27417,466],{"class":159},[145,27419,392],{"class":262},[11,27421,27422,27423,13429,27425,1580],{},"Este pipeline produce una lista ordenada de URLs de video que puede alimentar a cualquier editor de video o herramienta de ensamblaje automatizado (FFmpeg, MoviePy, etc.) para montar la secuencia narrativa final. El personaje se mantiene consistente en todas las tomas porque cada solicitud usa el mismo ",[28,27424,26521],{},[28,27426,2722],{},[92,27428,27430],{"id":27429},"manejo-de-casos-extremos-de-consistencia","Manejo de casos extremos de consistencia",[11,27432,27433],{},"Incluso con la misma imagen de referencia, pueden aparecer ligeras variaciones entre tomas: el color de la ropa de un personaje podría cambiar unos tonos, o las proporciones podrían cambiar ligeramente en planos generales extremos. Estas son estrategias para minimizar estas variaciones:",[11,27435,27436,27439],{},[23,27437,27438],{},"Reafirme los detalles del personaje en cada prompt."," Si su personaje lleva un atuendo específico, menciónelo brevemente: \"@Image1 is the main character wearing a blue denim jacket.\" Esto refuerza el anclaje visual de la imagen de referencia.",[11,27441,27442,27445],{},[23,27443,27444],{},"Evite cambios extremos de ángulo entre tomas."," Un plano medio frontal seguido de un plano general cenital extremo introduce la mayor variación. Haga la transición gradualmente: plano medio → plano ligeramente más amplio → plano general.",[11,27447,27448,27451,27452,2774,27454,27456],{},[23,27449,27450],{},"Use la misma calidad y relación de aspecto."," Mezclar ",[28,27453,1599],{},[28,27455,1607],{}," entre tomas puede introducir diferencias sutiles de renderizado. Estandarice todos los parámetros en su lista de tomas.",[45,27458],{},[48,27460,27462],{"id":27461},"video-de-producto-para-e-commerce-flujo-de-trabajo-completo","Video de producto para e-commerce: flujo de trabajo completo",[11,27464,27465,27466,27469],{},"La fotografía de producto es costosa. La ",[2434,27467,27468],{},"videografía"," de producto es aún más costosa: un estudio, una plataforma giratoria, iluminación adecuada, un camarógrafo, tiempo de edición. La API de imagen a video de Seedance 2.0 reemplaza la mayor parte de ese pipeline con una sola llamada API.",[92,27471,27473],{"id":27472},"el-problema-del-video-de-producto","El problema del video de producto",[11,27475,27476],{},"Las plataformas de e-commerce favorecen cada vez más el contenido de video. Amazon reporta que los listados de productos con video tienen tasas de conversión más altas. Instagram y TikTok son plataformas que priorizan el video. Pero producir incluso un simple video de rotación de producto de 10 segundos tradicionalmente requiere:",[70,27478,27479,27482,27485,27488,27491],{},[73,27480,27481],{},"Una plataforma giratoria física",[73,27483,27484],{},"Equipo de iluminación adecuado",[73,27486,27487],{},"Un videógrafo (o un trabajo cuidadoso por cuenta propia)",[73,27489,27490],{},"Edición y corrección de color",[73,27492,27493],{},"Exportación y carga",[11,27495,27496],{},"Con Seedance 2.0, el pipeline se reduce a:",[70,27498,27499,27502,27505],{},[73,27500,27501],{},"Tomar una foto de producto (ya la tiene)",[73,27503,27504],{},"Hacer una llamada API",[73,27506,27507],{},"Descargar el video",[92,27509,27511],{"id":27510},"producto-individual-anuncio-de-reloj","Producto individual: Anuncio de reloj",[11,27513,27514],{},"Aquí tiene un flujo de trabajo completo para generar un video de presentación de producto a partir de una sola imagen de producto:",[136,27516,27518],{"className":326,"code":27517,"language":328,"meta":141,"style":141},"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,27519,27520,27526,27532,27536,27544,27552,27560,27576,27584,27588,27592,27612,27634,27642,27652,27668,27676,27688,27700,27728,27734,27746,27774,27780,27808,27812,27820,27826,27830,27835,27843,27853,27859,27864,27869,27874,27879,27884,27889,27893,27899,27904,27908,27918,27928,27938,27946,27950,27954,27962,27974,27984,27992,27996,28004,28028,28032],{"__ignoreMap":141},[145,27521,27522,27524],{"class":147,"line":148},[145,27523,335],{"class":258},[145,27525,352],{"class":262},[145,27527,27528,27530],{"class":147,"line":166},[145,27529,335],{"class":258},[145,27531,345],{"class":262},[145,27533,27534],{"class":147,"line":178},[145,27535,357],{"emptyLinePlaceholder":58},[145,27537,27538,27540,27542],{"class":147,"line":187},[145,27539,381],{"class":155},[145,27541,372],{"class":258},[145,27543,17401],{"class":159},[145,27545,27546,27548,27550],{"class":147,"line":360},[145,27547,369],{"class":155},[145,27549,372],{"class":258},[145,27551,9077],{"class":159},[145,27553,27554,27556,27558],{"class":147,"line":366},[145,27555,440],{"class":155},[145,27557,372],{"class":258},[145,27559,445],{"class":262},[145,27561,27562,27564,27566,27568,27570,27572,27574],{"class":147,"line":378},[145,27563,451],{"class":159},[145,27565,454],{"class":262},[145,27567,457],{"class":258},[145,27569,460],{"class":159},[145,27571,463],{"class":155},[145,27573,466],{"class":159},[145,27575,469],{"class":262},[145,27577,27578,27580,27582],{"class":147,"line":395},[145,27579,475],{"class":159},[145,27581,454],{"class":262},[145,27583,480],{"class":159},[145,27585,27586],{"class":147,"line":400},[145,27587,486],{"class":262},[145,27589,27590],{"class":147,"line":415},[145,27591,357],{"emptyLinePlaceholder":58},[145,27593,27594,27596,27598,27600,27602,27604,27606,27608,27610],{"class":147,"line":432},[145,27595,502],{"class":258},[145,27597,505],{"class":151},[145,27599,11479],{"class":262},[145,27601,266],{"class":258},[145,27603,1133],{"class":155},[145,27605,23311],{"class":262},[145,27607,266],{"class":258},[145,27609,11490],{"class":155},[145,27611,516],{"class":262},[145,27613,27614,27616,27618,27620,27622,27624,27626,27628,27630,27632],{"class":147,"line":437},[145,27615,23327],{"class":262},[145,27617,266],{"class":258},[145,27619,3173],{"class":258},[145,27621,466],{"class":159},[145,27623,571],{"class":155},[145,27625,574],{"class":159},[145,27627,577],{"class":155},[145,27629,580],{"class":262},[145,27631,583],{"class":155},[145,27633,5185],{"class":159},[145,27635,27636,27638,27640],{"class":147,"line":448},[145,27637,9158],{"class":262},[145,27639,266],{"class":258},[145,27641,9163],{"class":155},[145,27643,27644,27646,27648,27650],{"class":147,"line":472},[145,27645,544],{"class":258},[145,27647,9170],{"class":262},[145,27649,5784],{"class":258},[145,27651,23368],{"class":262},[145,27653,27654,27656,27658,27660,27662,27664,27666],{"class":147,"line":483},[145,27655,6733],{"class":262},[145,27657,266],{"class":258},[145,27659,908],{"class":262},[145,27661,17630],{"class":593},[145,27663,266],{"class":258},[145,27665,440],{"class":155},[145,27667,392],{"class":262},[145,27669,27670,27672,27674],{"class":147,"line":489},[145,27671,23389],{"class":262},[145,27673,266],{"class":258},[145,27675,11560],{"class":262},[145,27677,27678,27680,27682,27684,27686],{"class":147,"line":494},[145,27679,633],{"class":262},[145,27681,266],{"class":258},[145,27683,23402],{"class":262},[145,27685,641],{"class":159},[145,27687,644],{"class":262},[145,27689,27690,27692,27694,27696,27698],{"class":147,"line":499},[145,27691,746],{"class":258},[145,27693,749],{"class":262},[145,27695,752],{"class":258},[145,27697,755],{"class":159},[145,27699,412],{"class":262},[145,27701,27702,27704,27706,27708,27710,27712,27714,27716,27718,27720,27722,27724,27726],{"class":147,"line":519},[145,27703,5392],{"class":155},[145,27705,424],{"class":262},[145,27707,457],{"class":258},[145,27709,11600],{"class":159},[145,27711,577],{"class":155},[145,27713,23855],{"class":262},[145,27715,17692],{"class":159},[145,27717,1359],{"class":262},[145,27719,17697],{"class":159},[145,27721,1331],{"class":262},[145,27723,583],{"class":155},[145,27725,466],{"class":159},[145,27727,392],{"class":262},[145,27729,27730,27732],{"class":147,"line":525},[145,27731,763],{"class":258},[145,27733,23465],{"class":262},[145,27735,27736,27738,27740,27742,27744],{"class":147,"line":536},[145,27737,772],{"class":258},[145,27739,749],{"class":262},[145,27741,752],{"class":258},[145,27743,779],{"class":159},[145,27745,412],{"class":262},[145,27747,27748,27750,27752,27754,27756,27758,27760,27762,27764,27766,27768,27770,27772],{"class":147,"line":541},[145,27749,5392],{"class":155},[145,27751,424],{"class":262},[145,27753,457],{"class":258},[145,27755,23898],{"class":159},[145,27757,577],{"class":155},[145,27759,23492],{"class":262},[145,27761,11657],{"class":159},[145,27763,290],{"class":262},[145,27765,17747],{"class":159},[145,27767,108],{"class":262},[145,27769,583],{"class":155},[145,27771,466],{"class":159},[145,27773,392],{"class":262},[145,27775,27776,27778],{"class":147,"line":552},[145,27777,763],{"class":258},[145,27779,23465],{"class":262},[145,27781,27782,27784,27786,27788,27790,27792,27794,27796,27798,27800,27802,27804,27806],{"class":147,"line":563},[145,27783,696],{"class":155},[145,27785,424],{"class":262},[145,27787,457],{"class":258},[145,27789,11686],{"class":159},[145,27791,577],{"class":155},[145,27793,718],{"class":262},[145,27795,583],{"class":155},[145,27797,114],{"class":159},[145,27799,577],{"class":155},[145,27801,708],{"class":262},[145,27803,583],{"class":155},[145,27805,10516],{"class":159},[145,27807,392],{"class":262},[145,27809,27810],{"class":147,"line":590},[145,27811,11710],{"class":262},[145,27813,27814,27816,27818],{"class":147,"line":602},[145,27815,671],{"class":262},[145,27817,9364],{"class":258},[145,27819,11719],{"class":262},[145,27821,27822,27824],{"class":147,"line":608},[145,27823,1512],{"class":258},[145,27825,11741],{"class":155},[145,27827,27828],{"class":147,"line":614},[145,27829,357],{"emptyLinePlaceholder":58},[145,27831,27832],{"class":147,"line":625},[145,27833,27834],{"class":174},"# --- Product Video: Luxury Watch ---\n",[145,27836,27837,27839,27841],{"class":147,"line":630},[145,27838,3476],{"class":262},[145,27840,266],{"class":258},[145,27842,445],{"class":262},[145,27844,27845,27847,27849,27851],{"class":147,"line":647},[145,27846,3485],{"class":159},[145,27848,454],{"class":262},[145,27850,1083],{"class":159},[145,27852,469],{"class":262},[145,27854,27855,27857],{"class":147,"line":668},[145,27856,3496],{"class":159},[145,27858,1098],{"class":262},[145,27860,27861],{"class":147,"line":688},[145,27862,27863],{"class":159},"        \"@Image1 is a luxury wristwatch. \"\n",[145,27865,27866],{"class":147,"line":693},[145,27867,27868],{"class":159},"        \"The watch rotates slowly on a dark marble surface. \"\n",[145,27870,27871],{"class":147,"line":738},[145,27872,27873],{"class":159},"        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n",[145,27875,27876],{"class":147,"line":743},[145,27877,27878],{"class":159},"        \"Light reflections move across the polished surfaces as the watch turns. \"\n",[145,27880,27881],{"class":147,"line":760},[145,27882,27883],{"class":159},"        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n",[145,27885,27886],{"class":147,"line":769},[145,27887,27888],{"class":159},"        \"Premium product advertisement aesthetic.\"\n",[145,27890,27891],{"class":147,"line":784},[145,27892,3620],{"class":262},[145,27894,27895,27897],{"class":147,"line":810},[145,27896,15181],{"class":159},[145,27898,2506],{"class":262},[145,27900,27901],{"class":147,"line":837},[145,27902,27903],{"class":159},"        \"https://example.com/watch-product.jpg\"\n",[145,27905,27906],{"class":147,"line":842},[145,27907,16164],{"class":262},[145,27909,27910,27912,27914,27916],{"class":147,"line":848},[145,27911,3508],{"class":159},[145,27913,454],{"class":262},[145,27915,3513],{"class":155},[145,27917,469],{"class":262},[145,27919,27920,27922,27924,27926],{"class":147,"line":853},[145,27921,3520],{"class":159},[145,27923,454],{"class":262},[145,27925,3525],{"class":159},[145,27927,469],{"class":262},[145,27929,27930,27932,27934,27936],{"class":147,"line":858},[145,27931,3532],{"class":159},[145,27933,454],{"class":262},[145,27935,1167],{"class":159},[145,27937,469],{"class":262},[145,27939,27940,27942,27944],{"class":147,"line":869},[145,27941,3548],{"class":159},[145,27943,454],{"class":262},[145,27945,15227],{"class":155},[145,27947,27948],{"class":147,"line":875},[145,27949,486],{"class":262},[145,27951,27952],{"class":147,"line":900},[145,27953,357],{"emptyLinePlaceholder":58},[145,27955,27956,27958,27960],{"class":147,"line":921},[145,27957,24091],{"class":262},[145,27959,266],{"class":258},[145,27961,1219],{"class":262},[145,27963,27964,27966,27968,27970,27972],{"class":147,"line":927},[145,27965,6341],{"class":258},[145,27967,466],{"class":159},[145,27969,571],{"class":155},[145,27971,1232],{"class":159},[145,27973,469],{"class":262},[145,27975,27976,27978,27980,27982],{"class":147,"line":932},[145,27977,6354],{"class":593},[145,27979,266],{"class":258},[145,27981,440],{"class":155},[145,27983,469],{"class":262},[145,27985,27986,27988,27990],{"class":147,"line":956},[145,27987,6365],{"class":593},[145,27989,266],{"class":258},[145,27991,2603],{"class":262},[145,27993,27994],{"class":147,"line":981},[145,27995,392],{"class":262},[145,27997,27998,28000,28002],{"class":147,"line":987},[145,27999,12031],{"class":262},[145,28001,266],{"class":258},[145,28003,11560],{"class":262},[145,28005,28006,28008,28010,28012,28014,28016,28018,28020,28022,28024,28026],{"class":147,"line":992},[145,28007,6387],{"class":155},[145,28009,424],{"class":262},[145,28011,457],{"class":258},[145,28013,24148],{"class":159},[145,28015,577],{"class":155},[145,28017,11605],{"class":262},[145,28019,19692],{"class":159},[145,28021,1331],{"class":262},[145,28023,583],{"class":155},[145,28025,466],{"class":159},[145,28027,392],{"class":262},[145,28029,28030],{"class":147,"line":1009},[145,28031,357],{"emptyLinePlaceholder":58},[145,28033,28034,28036,28038,28040,28042],{"class":147,"line":1044},[145,28035,24176],{"class":262},[145,28037,266],{"class":258},[145,28039,24181],{"class":262},[145,28041,7476],{"class":159},[145,28043,1431],{"class":262},[92,28045,28047],{"id":28046},"demo-video-de-producto-de-reloj","Demo: Video de producto de reloj",[56,28049,60,28050],{"controls":58,"playsInline":58,"style":59},[62,28051],{"src":17964,"type":65},[11,28053,28054,14079,28056],{},[23,28055,24209],{},[2434,28057,28058],{},"\"@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,28060,28061],{},"A partir de una sola foto de producto, la API genera un video de presentación con rotación e iluminación de calidad de estudio. Los detalles de diseño del reloj, las marcas del dial, los eslabones de la pulsera, la forma de la caja, provienen todos de la imagen de referencia.",[92,28063,28065],{"id":28064},"variantes-de-producto-multicolor","Variantes de producto multicolor",[11,28067,28068,28069,28071],{},"Muchos productos vienen en múltiples combinaciones de colores. En lugar de fotografiar cada variante por separado, puede usar el sistema ",[28,28070,22930],{}," para presentar todas las variantes en un solo video:",[136,28073,28075],{"className":326,"code":28074,"language":328,"meta":141,"style":141},"# --- 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,28076,28077,28082,28090,28100,28106,28111,28116,28121,28126,28131,28136,28140,28146,28151,28155,28165,28175,28183,28187,28191,28199,28211,28221,28229,28233,28241,28265],{"__ignoreMap":141},[145,28078,28079],{"class":147,"line":148},[145,28080,28081],{"class":174},"# --- Multi-Color Product: Headphones ---\n",[145,28083,28084,28086,28088],{"class":147,"line":166},[145,28085,3476],{"class":262},[145,28087,266],{"class":258},[145,28089,445],{"class":262},[145,28091,28092,28094,28096,28098],{"class":147,"line":178},[145,28093,3485],{"class":159},[145,28095,454],{"class":262},[145,28097,1083],{"class":159},[145,28099,469],{"class":262},[145,28101,28102,28104],{"class":147,"line":187},[145,28103,3496],{"class":159},[145,28105,1098],{"class":262},[145,28107,28108],{"class":147,"line":360},[145,28109,28110],{"class":159},"        \"@Image1 shows premium over-ear headphones in four different colors \"\n",[145,28112,28113],{"class":147,"line":366},[145,28114,28115],{"class":159},"        \"arranged on a clean surface. The camera slowly pans across all four \"\n",[145,28117,28118],{"class":147,"line":378},[145,28119,28120],{"class":159},"        \"variants. Each headphone catches the studio light differently. \"\n",[145,28122,28123],{"class":147,"line":395},[145,28124,28125],{"class":159},"        \"Smooth dolly movement from left to right. \"\n",[145,28127,28128],{"class":147,"line":400},[145,28129,28130],{"class":159},"        \"Clean white background with subtle shadows. \"\n",[145,28132,28133],{"class":147,"line":415},[145,28134,28135],{"class":159},"        \"Product catalog video style.\"\n",[145,28137,28138],{"class":147,"line":432},[145,28139,3620],{"class":262},[145,28141,28142,28144],{"class":147,"line":437},[145,28143,15181],{"class":159},[145,28145,2506],{"class":262},[145,28147,28148],{"class":147,"line":448},[145,28149,28150],{"class":159},"        \"https://example.com/headphones-all-colors.jpg\"\n",[145,28152,28153],{"class":147,"line":472},[145,28154,16164],{"class":262},[145,28156,28157,28159,28161,28163],{"class":147,"line":483},[145,28158,3508],{"class":159},[145,28160,454],{"class":262},[145,28162,513],{"class":155},[145,28164,469],{"class":262},[145,28166,28167,28169,28171,28173],{"class":147,"line":489},[145,28168,3520],{"class":159},[145,28170,454],{"class":262},[145,28172,3525],{"class":159},[145,28174,469],{"class":262},[145,28176,28177,28179,28181],{"class":147,"line":494},[145,28178,3532],{"class":159},[145,28180,454],{"class":262},[145,28182,2545],{"class":159},[145,28184,28185],{"class":147,"line":499},[145,28186,486],{"class":262},[145,28188,28189],{"class":147,"line":519},[145,28190,357],{"emptyLinePlaceholder":58},[145,28192,28193,28195,28197],{"class":147,"line":525},[145,28194,24091],{"class":262},[145,28196,266],{"class":258},[145,28198,1219],{"class":262},[145,28200,28201,28203,28205,28207,28209],{"class":147,"line":536},[145,28202,6341],{"class":258},[145,28204,466],{"class":159},[145,28206,571],{"class":155},[145,28208,1232],{"class":159},[145,28210,469],{"class":262},[145,28212,28213,28215,28217,28219],{"class":147,"line":541},[145,28214,6354],{"class":593},[145,28216,266],{"class":258},[145,28218,440],{"class":155},[145,28220,469],{"class":262},[145,28222,28223,28225,28227],{"class":147,"line":552},[145,28224,6365],{"class":593},[145,28226,266],{"class":258},[145,28228,2603],{"class":262},[145,28230,28231],{"class":147,"line":563},[145,28232,392],{"class":262},[145,28234,28235,28237,28239],{"class":147,"line":590},[145,28236,12031],{"class":262},[145,28238,266],{"class":258},[145,28240,11560],{"class":262},[145,28242,28243,28245,28247,28249,28251,28253,28255,28257,28259,28261,28263],{"class":147,"line":602},[145,28244,6387],{"class":155},[145,28246,424],{"class":262},[145,28248,457],{"class":258},[145,28250,24148],{"class":159},[145,28252,577],{"class":155},[145,28254,11605],{"class":262},[145,28256,19692],{"class":159},[145,28258,1331],{"class":262},[145,28260,583],{"class":155},[145,28262,466],{"class":159},[145,28264,392],{"class":262},[145,28266,28267,28269,28271,28273,28275],{"class":147,"line":608},[145,28268,24176],{"class":262},[145,28270,266],{"class":258},[145,28272,24181],{"class":262},[145,28274,7476],{"class":159},[145,28276,1431],{"class":262},[92,28278,28280],{"id":28279},"demo-variantes-de-color-de-auriculares","Demo: Variantes de color de auriculares",[56,28282,60,28283],{"controls":58,"playsInline":58,"style":59},[62,28284],{"src":18233,"type":65},[11,28286,28287,14079,28289],{},[23,28288,24209],{},[2434,28290,28291],{},"\"@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,28293,28294],{},"Una sola foto de línea de productos se convierte en un video de presentación con paneo suave. Cada combinación de colores se luce por igual, y la estética de iluminación de estudio iguala la videografía profesional de productos.",[92,28296,28298],{"id":28297},"generación-por-lotes-para-catálogos-de-productos","Generación por lotes para catálogos de productos",[11,28300,28301],{},"Si tiene decenas o cientos de productos, envuelva la lógica de generación en un procesador por lotes:",[136,28303,28305],{"className":326,"code":28304,"language":328,"meta":141,"style":141},"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,28306,28307,28313,28319,28325,28329,28337,28345,28353,28369,28377,28381,28385,28402,28407,28416,28423,28440,28445,28450,28455,28460,28464,28471,28485,28490,28495,28500,28505,28509,28516,28530,28535,28540,28544,28548,28552,28560,28570,28577,28583,28593,28603,28612,28616,28620,28628,28640,28650,28658,28662,28670,28680,28684,28688,28693,28698,28707,28727,28746,28765,28769,28773,28781,28793,28802,28807,28836,28847,28851,28878],{"__ignoreMap":141},[145,28308,28309,28311],{"class":147,"line":148},[145,28310,335],{"class":258},[145,28312,19916],{"class":262},[145,28314,28315,28317],{"class":147,"line":166},[145,28316,335],{"class":258},[145,28318,345],{"class":262},[145,28320,28321,28323],{"class":147,"line":178},[145,28322,335],{"class":258},[145,28324,352],{"class":262},[145,28326,28327],{"class":147,"line":187},[145,28328,357],{"emptyLinePlaceholder":58},[145,28330,28331,28333,28335],{"class":147,"line":360},[145,28332,381],{"class":155},[145,28334,372],{"class":258},[145,28336,17401],{"class":159},[145,28338,28339,28341,28343],{"class":147,"line":366},[145,28340,369],{"class":155},[145,28342,372],{"class":258},[145,28344,9077],{"class":159},[145,28346,28347,28349,28351],{"class":147,"line":378},[145,28348,440],{"class":155},[145,28350,372],{"class":258},[145,28352,445],{"class":262},[145,28354,28355,28357,28359,28361,28363,28365,28367],{"class":147,"line":395},[145,28356,451],{"class":159},[145,28358,454],{"class":262},[145,28360,457],{"class":258},[145,28362,460],{"class":159},[145,28364,463],{"class":155},[145,28366,466],{"class":159},[145,28368,469],{"class":262},[145,28370,28371,28373,28375],{"class":147,"line":400},[145,28372,475],{"class":159},[145,28374,454],{"class":262},[145,28376,480],{"class":159},[145,28378,28379],{"class":147,"line":415},[145,28380,486],{"class":262},[145,28382,28383],{"class":147,"line":432},[145,28384,357],{"emptyLinePlaceholder":58},[145,28386,28387,28389,28392,28395,28397,28400],{"class":147,"line":437},[145,28388,502],{"class":258},[145,28390,28391],{"class":151}," generate_product_video",[145,28393,28394],{"class":262},"(product_name, image_url, style",[145,28396,266],{"class":258},[145,28398,28399],{"class":159},"\"premium\"",[145,28401,516],{"class":262},[145,28403,28404],{"class":147,"line":448},[145,28405,28406],{"class":159},"    \"\"\"Generate a product video from a single product image.\"\"\"\n",[145,28408,28409,28412,28414],{"class":147,"line":472},[145,28410,28411],{"class":262},"    style_prompts ",[145,28413,266],{"class":258},[145,28415,445],{"class":262},[145,28417,28418,28421],{"class":147,"line":483},[145,28419,28420],{"class":159},"        \"premium\"",[145,28422,1098],{"class":262},[145,28424,28425,28427,28430,28432,28435,28437],{"class":147,"line":489},[145,28426,566],{"class":258},[145,28428,28429],{"class":159},"\"@Image1 is a ",[145,28431,577],{"class":155},[145,28433,28434],{"class":262},"product_name",[145,28436,583],{"class":155},[145,28438,28439],{"class":159},". \"\n",[145,28441,28442],{"class":147,"line":494},[145,28443,28444],{"class":159},"            \"The product rotates slowly under dramatic studio lighting \"\n",[145,28446,28447],{"class":147,"line":499},[145,28448,28449],{"class":159},"            \"on a dark reflective surface. Cinematic close-up. \"\n",[145,28451,28452],{"class":147,"line":519},[145,28453,28454],{"class":159},"            \"Light reveals surface details and textures. \"\n",[145,28456,28457],{"class":147,"line":525},[145,28458,28459],{"class":159},"            \"Premium advertisement quality.\"\n",[145,28461,28462],{"class":147,"line":536},[145,28463,1122],{"class":262},[145,28465,28466,28469],{"class":147,"line":541},[145,28467,28468],{"class":159},"        \"lifestyle\"",[145,28470,1098],{"class":262},[145,28472,28473,28475,28477,28479,28481,28483],{"class":147,"line":552},[145,28474,566],{"class":258},[145,28476,28429],{"class":159},[145,28478,577],{"class":155},[145,28480,28434],{"class":262},[145,28482,583],{"class":155},[145,28484,28439],{"class":159},[145,28486,28487],{"class":147,"line":563},[145,28488,28489],{"class":159},"            \"The product is shown in a lifestyle setting — \"\n",[145,28491,28492],{"class":147,"line":590},[145,28493,28494],{"class":159},"            \"a modern living space with natural light. \"\n",[145,28496,28497],{"class":147,"line":602},[145,28498,28499],{"class":159},"            \"Camera slowly pushes in to reveal product details. \"\n",[145,28501,28502],{"class":147,"line":608},[145,28503,28504],{"class":159},"            \"Warm, inviting atmosphere.\"\n",[145,28506,28507],{"class":147,"line":614},[145,28508,1122],{"class":262},[145,28510,28511,28514],{"class":147,"line":625},[145,28512,28513],{"class":159},"        \"minimal\"",[145,28515,1098],{"class":262},[145,28517,28518,28520,28522,28524,28526,28528],{"class":147,"line":630},[145,28519,566],{"class":258},[145,28521,28429],{"class":159},[145,28523,577],{"class":155},[145,28525,28434],{"class":262},[145,28527,583],{"class":155},[145,28529,28439],{"class":159},[145,28531,28532],{"class":147,"line":647},[145,28533,28534],{"class":159},"            \"Clean white background. The product rotates 360 degrees. \"\n",[145,28536,28537],{"class":147,"line":668},[145,28538,28539],{"class":159},"            \"Even, shadowless lighting. E-commerce product spin.\"\n",[145,28541,28542],{"class":147,"line":688},[145,28543,1122],{"class":262},[145,28545,28546],{"class":147,"line":693},[145,28547,1192],{"class":262},[145,28549,28550],{"class":147,"line":738},[145,28551,357],{"emptyLinePlaceholder":58},[145,28553,28554,28556,28558],{"class":147,"line":743},[145,28555,1068],{"class":262},[145,28557,266],{"class":258},[145,28559,445],{"class":262},[145,28561,28562,28564,28566,28568],{"class":147,"line":760},[145,28563,1078],{"class":159},[145,28565,454],{"class":262},[145,28567,1083],{"class":159},[145,28569,469],{"class":262},[145,28571,28572,28574],{"class":147,"line":769},[145,28573,1095],{"class":159},[145,28575,28576],{"class":262},": style_prompts[style],\n",[145,28578,28579,28581],{"class":147,"line":784},[145,28580,2503],{"class":159},[145,28582,20462],{"class":262},[145,28584,28585,28587,28589,28591],{"class":147,"line":810},[145,28586,1128],{"class":159},[145,28588,454],{"class":262},[145,28590,3513],{"class":155},[145,28592,469],{"class":262},[145,28594,28595,28597,28599,28601],{"class":147,"line":837},[145,28596,1145],{"class":159},[145,28598,454],{"class":262},[145,28600,3525],{"class":159},[145,28602,469],{"class":262},[145,28604,28605,28607,28609],{"class":147,"line":842},[145,28606,1162],{"class":159},[145,28608,454],{"class":262},[145,28610,28611],{"class":159},"\"1:1\"\n",[145,28613,28614],{"class":147,"line":848},[145,28615,1192],{"class":262},[145,28617,28618],{"class":147,"line":853},[145,28619,357],{"emptyLinePlaceholder":58},[145,28621,28622,28624,28626],{"class":147,"line":858},[145,28623,9454],{"class":262},[145,28625,266],{"class":258},[145,28627,1219],{"class":262},[145,28629,28630,28632,28634,28636,28638],{"class":147,"line":869},[145,28631,1225],{"class":258},[145,28633,466],{"class":159},[145,28635,571],{"class":155},[145,28637,1232],{"class":159},[145,28639,469],{"class":262},[145,28641,28642,28644,28646,28648],{"class":147,"line":875},[145,28643,1244],{"class":593},[145,28645,266],{"class":258},[145,28647,440],{"class":155},[145,28649,469],{"class":262},[145,28651,28652,28654,28656],{"class":147,"line":900},[145,28653,1260],{"class":593},[145,28655,266],{"class":258},[145,28657,2603],{"class":262},[145,28659,28660],{"class":147,"line":921},[145,28661,1274],{"class":262},[145,28663,28664,28666,28668],{"class":147,"line":927},[145,28665,27212],{"class":262},[145,28667,266],{"class":258},[145,28669,11560],{"class":262},[145,28671,28672,28674,28676,28678],{"class":147,"line":932},[145,28673,1512],{"class":258},[145,28675,23402],{"class":262},[145,28677,7476],{"class":159},[145,28679,644],{"class":262},[145,28681,28682],{"class":147,"line":956},[145,28683,357],{"emptyLinePlaceholder":58},[145,28685,28686],{"class":147,"line":981},[145,28687,357],{"emptyLinePlaceholder":58},[145,28689,28690],{"class":147,"line":987},[145,28691,28692],{"class":174},"# Example: process a CSV product catalog\n",[145,28694,28695],{"class":147,"line":992},[145,28696,28697],{"class":174},"# CSV format: product_name, image_url, style\n",[145,28699,28700,28703,28705],{"class":147,"line":1009},[145,28701,28702],{"class":262},"products ",[145,28704,266],{"class":258},[145,28706,8637],{"class":262},[145,28708,28709,28712,28715,28717,28720,28722,28724],{"class":147,"line":1044},[145,28710,28711],{"class":262},"    (",[145,28713,28714],{"class":159},"\"Wireless Earbuds\"",[145,28716,290],{"class":262},[145,28718,28719],{"class":159},"\"https://example.com/earbuds.jpg\"",[145,28721,290],{"class":262},[145,28723,28399],{"class":159},[145,28725,28726],{"class":262},"),\n",[145,28728,28729,28731,28734,28736,28739,28741,28744],{"class":147,"line":1049},[145,28730,28711],{"class":262},[145,28732,28733],{"class":159},"\"Leather Wallet\"",[145,28735,290],{"class":262},[145,28737,28738],{"class":159},"\"https://example.com/wallet.jpg\"",[145,28740,290],{"class":262},[145,28742,28743],{"class":159},"\"lifestyle\"",[145,28745,28726],{"class":262},[145,28747,28748,28750,28753,28755,28758,28760,28763],{"class":147,"line":1054},[145,28749,28711],{"class":262},[145,28751,28752],{"class":159},"\"Running Shoes\"",[145,28754,290],{"class":262},[145,28756,28757],{"class":159},"\"https://example.com/shoes.jpg\"",[145,28759,290],{"class":262},[145,28761,28762],{"class":159},"\"minimal\"",[145,28764,28726],{"class":262},[145,28766,28767],{"class":147,"line":1065},[145,28768,644],{"class":262},[145,28770,28771],{"class":147,"line":1075},[145,28772,357],{"emptyLinePlaceholder":58},[145,28774,28775,28777,28779],{"class":147,"line":1092},[145,28776,19527],{"class":262},[145,28778,266],{"class":258},[145,28780,5679],{"class":262},[145,28782,28783,28785,28788,28790],{"class":147,"line":1101},[145,28784,7998],{"class":258},[145,28786,28787],{"class":262}," name, url, style ",[145,28789,965],{"class":258},[145,28791,28792],{"class":262}," products:\n",[145,28794,28795,28797,28799],{"class":147,"line":1107},[145,28796,7023],{"class":262},[145,28798,266],{"class":258},[145,28800,28801],{"class":262}," generate_product_video(name, url, style)\n",[145,28803,28804],{"class":147,"line":1113},[145,28805,28806],{"class":262},"    tasks.append((name, task_id))\n",[145,28808,28809,28811,28813,28815,28818,28820,28822,28824,28826,28828,28830,28832,28834],{"class":147,"line":1119},[145,28810,878],{"class":155},[145,28812,424],{"class":262},[145,28814,457],{"class":258},[145,28816,28817],{"class":159},"\"Submitted: ",[145,28819,577],{"class":155},[145,28821,20472],{"class":262},[145,28823,583],{"class":155},[145,28825,23583],{"class":159},[145,28827,577],{"class":155},[145,28829,580],{"class":262},[145,28831,583],{"class":155},[145,28833,466],{"class":159},[145,28835,392],{"class":262},[145,28837,28838,28840,28842,28844],{"class":147,"line":1125},[145,28839,19705],{"class":262},[145,28841,5256],{"class":155},[145,28843,19710],{"class":262},[145,28845,28846],{"class":174},"# Rate limiting courtesy\n",[145,28848,28849],{"class":147,"line":1142},[145,28850,357],{"emptyLinePlaceholder":58},[145,28852,28853,28855,28857,28859,28861,28863,28866,28868,28871,28873,28876],{"class":147,"line":1159},[145,28854,6387],{"class":155},[145,28856,424],{"class":262},[145,28858,457],{"class":258},[145,28860,466],{"class":159},[145,28862,1476],{"class":155},[145,28864,28865],{"class":159},"Submitted ",[145,28867,6073],{"class":155},[145,28869,28870],{"class":262},"(tasks)",[145,28872,583],{"class":155},[145,28874,28875],{"class":159}," product videos\"",[145,28877,392],{"class":262},[145,28879,28880,28882,28884,28887],{"class":147,"line":1176},[145,28881,6387],{"class":155},[145,28883,424],{"class":262},[145,28885,28886],{"class":159},"\"Poll each task_id to retrieve the completed video URLs\"",[145,28888,392],{"class":262},[11,28890,28891,28892,28894],{},"Este patrón de procesamiento por lotes escala a cualquier tamaño de catálogo. Puede extenderlo con URLs de callback (parámetro ",[28,28893,3416],{},") en lugar de sondeo, lo cual es más eficiente para lotes grandes: la API envía un POST a su endpoint cuando cada video se completa.",[92,28896,28898],{"id":28897},"plantillas-de-prompts-para-videos-de-producto","Plantillas de prompts para videos de producto",[11,28900,28901],{},"Aquí tiene plantillas de prompts probadas en el campo para necesidades comunes de video de e-commerce:",[136,28903,28905],{"className":326,"code":28904,"language":328,"meta":141,"style":141},"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,28906,28907,28916,28923,28928,28933,28938,28943,28948,28952,28959,28963,28968,28973,28978,28983,28987,28994,28998,29003,29008,29013,29018,29022,29029,29033,29038,29043,29048,29053,29057],{"__ignoreMap":141},[145,28908,28909,28912,28914],{"class":147,"line":148},[145,28910,28911],{"class":155},"PRODUCT_TEMPLATES",[145,28913,372],{"class":258},[145,28915,445],{"class":262},[145,28917,28918,28921],{"class":147,"line":166},[145,28919,28920],{"class":159},"    \"rotation_360\"",[145,28922,1098],{"class":262},[145,28924,28925],{"class":147,"line":178},[145,28926,28927],{"class":159},"        \"@Image1 is the product. \"\n",[145,28929,28930],{"class":147,"line":187},[145,28931,28932],{"class":159},"        \"Full 360-degree rotation on a clean background. \"\n",[145,28934,28935],{"class":147,"line":360},[145,28936,28937],{"class":159},"        \"Consistent studio lighting throughout the rotation. \"\n",[145,28939,28940],{"class":147,"line":366},[145,28941,28942],{"class":159},"        \"Smooth, steady turntable motion. \"\n",[145,28944,28945],{"class":147,"line":378},[145,28946,28947],{"class":159},"        \"Product catalog photography style.\"\n",[145,28949,28950],{"class":147,"line":395},[145,28951,3620],{"class":262},[145,28953,28954,28957],{"class":147,"line":400},[145,28955,28956],{"class":159},"    \"unboxing_reveal\"",[145,28958,1098],{"class":262},[145,28960,28961],{"class":147,"line":415},[145,28962,28927],{"class":159},[145,28964,28965],{"class":147,"line":432},[145,28966,28967],{"class":159},"        \"The product emerges from soft tissue paper inside a premium box. \"\n",[145,28969,28970],{"class":147,"line":437},[145,28971,28972],{"class":159},"        \"Hands carefully lift it into view. \"\n",[145,28974,28975],{"class":147,"line":448},[145,28976,28977],{"class":159},"        \"Camera slowly pushes in as the product is revealed. \"\n",[145,28979,28980],{"class":147,"line":472},[145,28981,28982],{"class":159},"        \"Luxury unboxing experience. Warm lighting.\"\n",[145,28984,28985],{"class":147,"line":483},[145,28986,3620],{"class":262},[145,28988,28989,28992],{"class":147,"line":489},[145,28990,28991],{"class":159},"    \"hero_shot\"",[145,28993,1098],{"class":262},[145,28995,28996],{"class":147,"line":494},[145,28997,28927],{"class":159},[145,28999,29000],{"class":147,"line":499},[145,29001,29002],{"class":159},"        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n",[145,29004,29005],{"class":147,"line":519},[145,29006,29007],{"class":159},"        \"Volumetric light beams hit the product from the side. \"\n",[145,29009,29010],{"class":147,"line":525},[145,29011,29012],{"class":159},"        \"Slow motion. Particles float in the light. \"\n",[145,29014,29015],{"class":147,"line":536},[145,29016,29017],{"class":159},"        \"Epic product launch trailer aesthetic.\"\n",[145,29019,29020],{"class":147,"line":541},[145,29021,3620],{"class":262},[145,29023,29024,29027],{"class":147,"line":552},[145,29025,29026],{"class":159},"    \"in_use\"",[145,29028,1098],{"class":262},[145,29030,29031],{"class":147,"line":563},[145,29032,28927],{"class":159},[145,29034,29035],{"class":147,"line":590},[145,29036,29037],{"class":159},"        \"Someone picks up the product and uses it naturally. \"\n",[145,29039,29040],{"class":147,"line":602},[145,29041,29042],{"class":159},"        \"Lifestyle setting with soft natural window light. \"\n",[145,29044,29045],{"class":147,"line":608},[145,29046,29047],{"class":159},"        \"Medium close-up. The camera follows the interaction. \"\n",[145,29049,29050],{"class":147,"line":614},[145,29051,29052],{"class":159},"        \"Authentic, relatable product usage.\"\n",[145,29054,29055],{"class":147,"line":625},[145,29056,3620],{"class":262},[145,29058,29059],{"class":147,"line":630},[145,29060,486],{"class":262},[45,29062],{},[48,29064,29066],{"id":29065},"errores-comunes-y-cómo-solucionarlos","Errores comunes y cómo solucionarlos",[11,29068,29069],{},"Después de cientos de llamadas API, surgen patrones claros sobre lo que funciona y lo que falla. Estos son los errores más comunes y sus soluciones.",[92,29071,29073],{"id":29072},"error-1-usar-fotos-de-rostros-humanos-realistas","Error 1: Usar fotos de rostros humanos realistas",[11,29075,29076,29079,29080,29082,29083,1580],{},[23,29077,29078],{},"Qué ocurre:"," La API devuelve un error ",[28,29081,3452],{}," o un estado de tarea ",[28,29084,1901],{},[11,29086,29087,29090],{},[23,29088,29089],{},"Por qué:"," Seedance 2.0 bloquea la generación de imagen a video a partir de imágenes de rostros humanos fotorrealistas. Esta es una política de seguridad, no un error.",[11,29092,29093,29095],{},[23,29094,13029],{}," Use imágenes de personajes ilustrados, estilizados o de estilo caricatura en su lugar. Los personajes de anime, retratos al óleo, personajes renderizados en 3D y siluetas funcionan perfectamente. Si su flujo de trabajo requiere personajes humanos, genérelos primero usando un modelo de texto a imagen con un estilo no fotorrealista.",[136,29097,29099],{"className":326,"code":29098,"language":328,"meta":141,"style":141},"# 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,29100,29101,29106,29117,29121,29126,29137,29148],{"__ignoreMap":141},[145,29102,29103],{"class":147,"line":148},[145,29104,29105],{"class":174},"# Will be rejected\n",[145,29107,29108,29110,29112,29115],{"class":147,"line":166},[145,29109,6041],{"class":159},[145,29111,10632],{"class":262},[145,29113,29114],{"class":159},"\"https://example.com/real-person-photo.jpg\"",[145,29116,644],{"class":262},[145,29118,29119],{"class":147,"line":178},[145,29120,357],{"emptyLinePlaceholder":58},[145,29122,29123],{"class":147,"line":187},[145,29124,29125],{"class":174},"# Works fine\n",[145,29127,29128,29130,29132,29135],{"class":147,"line":360},[145,29129,6041],{"class":159},[145,29131,10632],{"class":262},[145,29133,29134],{"class":159},"\"https://example.com/illustrated-character.png\"",[145,29136,644],{"class":262},[145,29138,29139,29141,29143,29146],{"class":147,"line":366},[145,29140,6041],{"class":159},[145,29142,10632],{"class":262},[145,29144,29145],{"class":159},"\"https://example.com/3d-rendered-character.jpg\"",[145,29147,644],{"class":262},[145,29149,29150,29152,29154,29157],{"class":147,"line":378},[145,29151,6041],{"class":159},[145,29153,10632],{"class":262},[145,29155,29156],{"class":159},"\"https://example.com/anime-character.png\"",[145,29158,644],{"class":262},[92,29160,29162],{"id":29161},"error-2-prompts-estáticos-que-solo-describen-la-apariencia","Error 2: Prompts estáticos que solo describen la apariencia",[11,29164,29165,29167],{},[23,29166,29078],{}," El video generado muestra un movimiento mínimo o nulo. El sujeto permanece inmóvil, o solo ocurre una ligera deriva de cámara.",[11,29169,29170,29172],{},[23,29171,29089],{}," El modelo toma su prompt literalmente. Si describe una escena estática (\"a cat on a windowsill\"), obtiene un video casi estático.",[11,29174,29175,29177],{},[23,29176,13029],{}," Incluya siempre verbos de movimiento, acciones secuenciales y dinámica ambiental.",[136,29179,29181],{"className":326,"code":29180,"language":328,"meta":141,"style":141},"# 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,29182,29183,29188,29197,29201,29206,29212,29217,29222,29227,29232,29237],{"__ignoreMap":141},[145,29184,29185],{"class":147,"line":148},[145,29186,29187],{"class":174},"# Static: produces near-still video\n",[145,29189,29190,29192,29194],{"class":147,"line":166},[145,29191,5723],{"class":159},[145,29193,454],{"class":262},[145,29195,29196],{"class":159},"\"A beautiful sunset over the ocean with golden light\"\n",[145,29198,29199],{"class":147,"line":178},[145,29200,357],{"emptyLinePlaceholder":58},[145,29202,29203],{"class":147,"line":187},[145,29204,29205],{"class":174},"# Dynamic: produces engaging video\n",[145,29207,29208,29210],{"class":147,"line":360},[145,29209,5723],{"class":159},[145,29211,1098],{"class":262},[145,29213,29214],{"class":147,"line":366},[145,29215,29216],{"class":159},"    \"Waves crash against rocky coastline during golden sunset. \"\n",[145,29218,29219],{"class":147,"line":378},[145,29220,29221],{"class":159},"    \"Water sprays upward, catching the warm light. \"\n",[145,29223,29224],{"class":147,"line":395},[145,29225,29226],{"class":159},"    \"Camera slowly descends from sky level to water level. \"\n",[145,29228,29229],{"class":147,"line":400},[145,29230,29231],{"class":159},"    \"Seabirds glide across the frame. \"\n",[145,29233,29234],{"class":147,"line":415},[145,29235,29236],{"class":159},"    \"Light shifts from golden to deep amber.\"\n",[145,29238,29239],{"class":147,"line":432},[145,29240,392],{"class":262},[92,29242,29244],{"id":29243},"error-3-duración-incorrecta-para-el-contenido","Error 3: Duración incorrecta para el contenido",[11,29246,29247,29249],{},[23,29248,29078],{}," Las acciones simples se sienten estiradas e incómodas, o las secuencias complejas se sienten apresuradas y entrecortadas.",[11,29251,29252,29254],{},[23,29253,29089],{}," La duración debe coincidir con la complejidad de su prompt. Una simple rotación de producto no necesita 15 segundos. Una secuencia de personaje con múltiples acciones no funciona en 4 segundos.",[11,29256,29257,29259],{},[23,29258,13029],{}," Haga coincidir la duración con la complejidad del prompt:",[1849,29261,29262,29274],{},[1852,29263,29264],{},[1855,29265,29266,29269,29272],{},[1858,29267,29268],{},"Complejidad del prompt",[1858,29270,29271],{},"Acciones descritas",[1858,29273,19220],{},[1865,29275,29276,29286,29297],{},[1855,29277,29278,29281,29284],{},[1870,29279,29280],{},"Simple (un movimiento)",[1870,29282,29283],{},"1 acción",[1870,29285,25020],{},[1855,29287,29288,29291,29294],{},[1870,29289,29290],{},"Moderada (2-3 acciones)",[1870,29292,29293],{},"2-3 acciones secuenciales",[1870,29295,29296],{},"6-10s",[1855,29298,29299,29302,29305],{},[1870,29300,29301],{},"Compleja (narrativa)",[1870,29303,29304],{},"4+ acciones, cambios de escena",[1870,29306,25044],{},[92,29308,29310],{"id":29309},"error-4-problemas-con-las-urls-de-imagen","Error 4: Problemas con las URLs de imagen",[11,29312,29313,29315],{},[23,29314,29078],{}," La API devuelve errores sobre imágenes inválidas, o la tarea falla durante el procesamiento.",[11,29317,29318,29320],{},[23,29319,29089],{}," Varios problemas comunes de URL:",[97,29322,29323,29326,29329,29332,29335],{},[73,29324,29325],{},"La URL requiere autenticación (no es accesible públicamente)",[73,29327,29328],{},"La URL apunta a una página web, no a un archivo de imagen directo",[73,29330,29331],{},"El formato de imagen no es compatible (WebP a veces falla)",[73,29333,29334],{},"La imagen es demasiado grande (archivos de muy alta resolución pueden agotar el tiempo)",[73,29336,29337],{},"La URL ha expirado (URLs prefirmadas con límites de tiempo)",[11,29339,29340,29342],{},[23,29341,13029],{}," Asegúrese de que sus URLs de imagen sean:",[70,29344,29345,29351,29364,29370,29376],{},[73,29346,29347,29350],{},[23,29348,29349],{},"Accesibles públicamente"," - sin encabezados de autenticación necesarios para descargar",[73,29352,29353,29356,29357,290,29360,29363],{},[23,29354,29355],{},"Enlaces directos de imagen"," - que terminen en ",[28,29358,29359],{},".jpg",[28,29361,29362],{},".png"," o similar (no una página HTML)",[73,29365,29366,29369],{},[23,29367,29368],{},"Formatos estándar"," - JPEG y PNG son los más seguros",[73,29371,29372,29375],{},[23,29373,29374],{},"Tamaño razonable"," - menos de 10MB por imagen",[73,29377,29378,29381],{},[23,29379,29380],{},"Persistentes"," - que no expiren durante el procesamiento",[136,29383,29385],{"className":326,"code":29384,"language":328,"meta":141,"style":141},"# 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,29386,29387,29392,29400,29408,29416,29420,29425,29433],{"__ignoreMap":141},[145,29388,29389],{"class":147,"line":148},[145,29390,29391],{"class":174},"# Problem URLs\n",[145,29393,29394,29397],{"class":147,"line":166},[145,29395,29396],{"class":159},"\"https://drive.google.com/file/d/abc123/view\"",[145,29398,29399],{"class":174},"  # Requires auth\n",[145,29401,29402,29405],{"class":147,"line":178},[145,29403,29404],{"class":159},"\"https://example.com/product-page\"",[145,29406,29407],{"class":174},"              # HTML page, not image\n",[145,29409,29410,29413],{"class":147,"line":187},[145,29411,29412],{"class":159},"\"https://storage.com/image.jpg?token=abc&exp=1h\"",[145,29414,29415],{"class":174}," # Might expire\n",[145,29417,29418],{"class":147,"line":360},[145,29419,357],{"emptyLinePlaceholder":58},[145,29421,29422],{"class":147,"line":366},[145,29423,29424],{"class":174},"# Good URLs\n",[145,29426,29427,29430],{"class":147,"line":378},[145,29428,29429],{"class":159},"\"https://cdn.example.com/images/product.jpg\"",[145,29431,29432],{"class":174},"     # Direct CDN link\n",[145,29434,29435,29438],{"class":147,"line":395},[145,29436,29437],{"class":159},"\"https://i.imgur.com/abc123.png\"",[145,29439,29440],{"class":174},"                  # Public image host\n",[92,29442,29444],{"id":29443},"error-5-no-usar-tags-con-múltiples-imágenes","Error 5: No usar @Tags con múltiples imágenes",[11,29446,29447,29449,29450,29452],{},[23,29448,29078],{}," Cuando pasa más de 3 imágenes sin usar etiquetas ",[28,29451,3960],{}," en su prompt, el modelo adivina qué imagen cumple qué propósito. Los resultados son impredecibles: a veces la imagen de fondo se usa como personaje, o la referencia de estilo se trata como un elemento de la escena.",[11,29454,29455,29457,29458,29460],{},[23,29456,13029],{}," Use siempre etiquetas ",[28,29459,3960],{}," cuando pase más de una imagen. Sea explícito sobre el rol de cada imagen.",[136,29462,29464],{"className":326,"code":29463,"language":328,"meta":141,"style":141},"# 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,29465,29466,29471,29480,29487,29491,29496,29502,29507,29512,29517,29522,29526],{"__ignoreMap":141},[145,29467,29468],{"class":147,"line":148},[145,29469,29470],{"class":174},"# Ambiguous: model guesses roles\n",[145,29472,29473,29475,29477],{"class":147,"line":166},[145,29474,5723],{"class":159},[145,29476,454],{"class":262},[145,29478,29479],{"class":159},"\"A character walks through a forest in watercolor style\"\n",[145,29481,29482,29484],{"class":147,"line":178},[145,29483,6041],{"class":159},[145,29485,29486],{"class":262},": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[145,29488,29489],{"class":147,"line":187},[145,29490,357],{"emptyLinePlaceholder":58},[145,29492,29493],{"class":147,"line":360},[145,29494,29495],{"class":174},"# Explicit: model knows each role\n",[145,29497,29498,29500],{"class":147,"line":366},[145,29499,5723],{"class":159},[145,29501,1098],{"class":262},[145,29503,29504],{"class":147,"line":378},[145,29505,29506],{"class":159},"    \"@Image1 is the character. @Image2 is the forest environment. \"\n",[145,29508,29509],{"class":147,"line":395},[145,29510,29511],{"class":159},"    \"@Image3 defines the watercolor art style. \"\n",[145,29513,29514],{"class":147,"line":400},[145,29515,29516],{"class":159},"    \"The character (@Image1) walks through the forest (@Image2) \"\n",[145,29518,29519],{"class":147,"line":415},[145,29520,29521],{"class":159},"    \"rendered in the watercolor style of @Image3.\"\n",[145,29523,29524],{"class":147,"line":432},[145,29525,392],{"class":262},[145,29527,29528,29530],{"class":147,"line":437},[145,29529,6041],{"class":159},[145,29531,29486],{"class":262},[92,29533,29535],{"id":29534},"error-6-olvidar-la-expiración-de-urls-de-video","Error 6: Olvidar la expiración de URLs de video",[11,29537,29538,29540],{},[23,29539,29078],{}," Genera un video, guarda la URL, intenta acceder al día siguiente y obtiene un 403 o 404.",[11,29542,29543,29545],{},[23,29544,29089],{}," Las URLs de video generadas expiran después de 24 horas.",[11,29547,29548,29550],{},[23,29549,13029],{}," Descargue el archivo de video inmediatamente después de que se complete la generación. Añada un paso de descarga a su función de sondeo:",[136,29552,29554],{"className":326,"code":29553,"language":328,"meta":141,"style":141},"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,29555,29556,29562,29566,29575,29580,29597,29601,29618,29636,29640,29662,29666,29671,29689],{"__ignoreMap":141},[145,29557,29558,29560],{"class":147,"line":148},[145,29559,335],{"class":258},[145,29561,338],{"class":262},[145,29563,29564],{"class":147,"line":166},[145,29565,357],{"emptyLinePlaceholder":58},[145,29567,29568,29570,29572],{"class":147,"line":178},[145,29569,502],{"class":258},[145,29571,863],{"class":151},[145,29573,29574],{"class":262},"(video_url, output_path):\n",[145,29576,29577],{"class":147,"line":187},[145,29578,29579],{"class":159},"    \"\"\"Download a video before the URL expires.\"\"\"\n",[145,29581,29582,29584,29586,29589,29591,29593,29595],{"class":147,"line":360},[145,29583,9454],{"class":262},[145,29585,266],{"class":258},[145,29587,29588],{"class":262}," requests.get(video_url, ",[145,29590,911],{"class":593},[145,29592,266],{"class":258},[145,29594,916],{"class":155},[145,29596,392],{"class":262},[145,29598,29599],{"class":147,"line":366},[145,29600,9471],{"class":262},[145,29602,29603,29605,29607,29610,29612,29614,29616],{"class":147,"line":378},[145,29604,935],{"class":258},[145,29606,938],{"class":155},[145,29608,29609],{"class":262},"(output_path, ",[145,29611,944],{"class":159},[145,29613,947],{"class":262},[145,29615,950],{"class":258},[145,29617,953],{"class":262},[145,29619,29620,29622,29624,29626,29628,29630,29632,29634],{"class":147,"line":395},[145,29621,959],{"class":258},[145,29623,962],{"class":262},[145,29625,965],{"class":258},[145,29627,6790],{"class":262},[145,29629,971],{"class":593},[145,29631,266],{"class":258},[145,29633,976],{"class":155},[145,29635,516],{"class":262},[145,29637,29638],{"class":147,"line":400},[145,29639,984],{"class":262},[145,29641,29642,29644,29646,29648,29651,29653,29656,29658,29660],{"class":147,"line":415},[145,29643,878],{"class":155},[145,29645,424],{"class":262},[145,29647,457],{"class":258},[145,29649,29650],{"class":159},"\"Saved to ",[145,29652,577],{"class":155},[145,29654,29655],{"class":262},"output_path",[145,29657,583],{"class":155},[145,29659,466],{"class":159},[145,29661,392],{"class":262},[145,29663,29664],{"class":147,"line":432},[145,29665,357],{"emptyLinePlaceholder":58},[145,29667,29668],{"class":147,"line":437},[145,29669,29670],{"class":174},"# After generation completes:\n",[145,29672,29673,29676,29678,29681,29683,29685,29687],{"class":147,"line":448},[145,29674,29675],{"class":262},"video_url ",[145,29677,266],{"class":258},[145,29679,29680],{"class":262}," video_data[",[145,29682,21346],{"class":159},[145,29684,1359],{"class":262},[145,29686,14747],{"class":159},[145,29688,644],{"class":262},[145,29690,29691,29694,29697],{"class":147,"line":472},[145,29692,29693],{"class":262},"download_video(video_url, ",[145,29695,29696],{"class":159},"\"output/my-product-video.mp4\"",[145,29698,392],{"class":262},[45,29700],{},[92,29702,29704],{"id":29703},"error-7-conflicto-entre-el-prompt-y-el-contenido-de-la-imagen","Error 7: Conflicto entre el prompt y el contenido de la imagen",[11,29706,29707,29709],{},[23,29708,29078],{}," El video de salida se ve confuso: los elementos de la imagen y los elementos del prompt compiten por el dominio, produciendo artefactos visuales o escenas incoherentes.",[11,29711,29712,29714],{},[23,29713,29089],{}," Describió algo en el prompt que contradice directamente la imagen de referencia. Por ejemplo, su imagen muestra un auto rojo, pero su prompt dice \"a blue sports car races down the highway.\"",[11,29716,29717,29719,29720,29723],{},[23,29718,13029],{}," Su prompt debe ",[2434,29721,29722],{},"complementar"," la imagen, no contradecirla. Describa acciones, movimientos de cámara y cambios ambientales, no la apariencia de elementos ya definidos por sus imágenes de referencia.",[136,29725,29727],{"className":326,"code":29726,"language":328,"meta":141,"style":141},"# 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,29728,29729,29734,29743,29747,29752,29758,29763,29768,29773],{"__ignoreMap":141},[145,29730,29731],{"class":147,"line":148},[145,29732,29733],{"class":174},"# Contradicts image (image shows red car)\n",[145,29735,29736,29738,29740],{"class":147,"line":166},[145,29737,5723],{"class":159},[145,29739,454],{"class":262},[145,29741,29742],{"class":159},"\"A blue sports car races down the highway at sunset\"\n",[145,29744,29745],{"class":147,"line":178},[145,29746,357],{"emptyLinePlaceholder":58},[145,29748,29749],{"class":147,"line":187},[145,29750,29751],{"class":174},"# Complements image (lets the image define appearance)\n",[145,29753,29754,29756],{"class":147,"line":360},[145,29755,5723],{"class":159},[145,29757,1098],{"class":262},[145,29759,29760],{"class":147,"line":366},[145,29761,29762],{"class":159},"    \"@Image1 is the car. The car accelerates down an open highway. \"\n",[145,29764,29765],{"class":147,"line":378},[145,29766,29767],{"class":159},"    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n",[145,29769,29770],{"class":147,"line":395},[145,29771,29772],{"class":159},"    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n",[145,29774,29775],{"class":147,"line":400},[145,29776,392],{"class":262},[45,29778],{},[48,29780,29782],{"id":29781},"referencia-de-parámetros-de-la-api","Referencia de parámetros de la API",[11,29784,29785],{},"Aquí tiene todos los parámetros relevantes para la generación de imagen a video en una sola tabla de referencia:",[1849,29787,29788,29803],{},[1852,29789,29790],{},[1855,29791,29792,29794,29796,29798,29801],{},[1858,29793,3215],{},[1858,29795,3218],{},[1858,29797,16293],{},[1858,29799,29800],{},"Predeterminado",[1858,29802,3227],{},[1865,29804,29805,29822,29839,29858,29873,29896,29923,29940,29957,29974],{},[1855,29806,29807,29811,29813,29815,29817],{},[1870,29808,29809],{},[28,29810,1559],{},[1870,29812,3238],{},[1870,29814,4769],{},[1870,29816,3241],{},[1870,29818,29819,29820],{},"Debe ser ",[28,29821,1083],{},[1855,29823,29824,29828,29830,29832,29834],{},[1870,29825,29826],{},[28,29827,1574],{},[1870,29829,3238],{},[1870,29831,4769],{},[1870,29833,3241],{},[1870,29835,29836,29837],{},"Descripción de movimiento con etiquetas opcionales ",[28,29838,3960],{},[1855,29840,29841,29845,29847,29850,29855],{},[1870,29842,29843],{},[28,29844,2710],{},[1870,29846,3367],{},[1870,29848,29849],{},"Sí (para i2v)",[1870,29851,29852],{},[28,29853,29854],{},"[]",[1870,29856,29857],{},"1-9 URLs de imagen accesibles públicamente",[1855,29859,29860,29864,29866,29868,29870],{},[1870,29861,29862],{},[28,29863,1587],{},[1870,29865,3273],{},[1870,29867,4658],{},[1870,29869,1133],{},[1870,29871,29872],{},"Duración del video en segundos (4-15)",[1855,29874,29875,29879,29881,29883,29887],{},[1870,29876,29877],{},[28,29878,1595],{},[1870,29880,3238],{},[1870,29882,4658],{},[1870,29884,29885],{},[28,29886,1150],{},[1870,29888,29889,29890,290,29892,290,29894],{},"Resolución de salida: ",[28,29891,3829],{},[28,29893,1150],{},[28,29895,3525],{},[1855,29897,29898,29902,29904,29906,29910],{},[1870,29899,29900],{},[28,29901,1615],{},[1870,29903,3238],{},[1870,29905,4658],{},[1870,29907,29908],{},[28,29909,1167],{},[1870,29911,29912,29913,290,29915,290,29917,290,29919,290,29921],{},"Relación de salida: ",[28,29914,1167],{},[28,29916,3537],{},[28,29918,5943],{},[28,29920,5948],{},[28,29922,5953],{},[1855,29924,29925,29929,29931,29933,29937],{},[1870,29926,29927],{},[28,29928,1635],{},[1870,29930,3345],{},[1870,29932,4658],{},[1870,29934,29935],{},[28,29936,2749],{},[1870,29938,29939],{},"Generar pista de audio sincronizada",[1855,29941,29942,29946,29948,29950,29954],{},[1870,29943,29944],{},[28,29945,3382],{},[1870,29947,3367],{},[1870,29949,4658],{},[1870,29951,29952],{},[28,29953,29854],{},[1870,29955,29956],{},"0-3 URLs de referencia de video (para medios mixtos)",[1855,29958,29959,29963,29965,29967,29971],{},[1870,29960,29961],{},[28,29962,3399],{},[1870,29964,3367],{},[1870,29966,4658],{},[1870,29968,29969],{},[28,29970,29854],{},[1870,29972,29973],{},"0-3 URLs de referencia de audio (para medios mixtos)",[1855,29975,29976,29980,29982,29984,29986],{},[1870,29977,29978],{},[28,29979,3416],{},[1870,29981,3238],{},[1870,29983,4658],{},[1870,29985,3241],{},[1870,29987,29988],{},"URL de webhook para notificación de finalización",[11,29990,29991,29994,29995,23583,29998,290,30000,23583,30003,290,30005,23583,30008,1580],{},[23,29992,29993],{},"Límites:"," Máximo 9 imágenes + 3 videos + 3 archivos de audio por solicitud. El total de todos los tipos de medios no puede exceder 12. Las etiquetas se asignan por posición en el array: ",[28,29996,29997],{},"image_urls[0]",[28,29999,2722],{},[28,30001,30002],{},"video_urls[0]",[28,30004,11211],{},[28,30006,30007],{},"audio_urls[0]",[28,30009,16332],{},[45,30011],{},[48,30013,13096],{"id":8835},[92,30015,30017],{"id":30016},"puedo-usar-cualquier-formato-de-imagen-con-la-api-de-imagen-a-video-de-seedance-20","¿Puedo usar cualquier formato de imagen con la API de imagen a video de Seedance 2.0?",[11,30019,30020],{},"JPEG y PNG son totalmente compatibles y recomendados. GIF (solo el primer fotograma), BMP y TIFF generalmente funcionan pero están menos probados. El soporte de WebP es inconsistente: convierta a JPEG o PNG para resultados fiables. Todas las imágenes deben ser accesibles a través de una URL pública sin autenticación.",[92,30022,30024],{"id":30023},"cuánto-tiempo-toma-la-generación-de-imagen-a-video","¿Cuánto tiempo toma la generación de imagen a video?",[11,30026,30027,30028,30030,30031,30033],{},"Los tiempos de generación típicos van de 60 a 180 segundos dependiendo de la duración, la configuración de calidad y la carga actual del servidor. Un clip de 4 segundos a 480p se genera más rápido que un clip de 15 segundos a 1080p. Use el endpoint de sondeo (",[28,30029,8942],{},") o configure un ",[28,30032,3416],{}," para recibir una notificación cuando el procesamiento se complete.",[92,30035,30037],{"id":30036},"cuál-es-el-número-máximo-de-imágenes-que-puedo-usar-en-una-sola-solicitud","¿Cuál es el número máximo de imágenes que puedo usar en una sola solicitud?",[11,30039,30040,30041,30043],{},"Puede incluir hasta 9 imágenes en ",[28,30042,2710],{},". El conteo total de archivos en todos los tipos de medios (imágenes + videos + audio) tiene un límite de 12 por solicitud. Así que si está usando 9 imágenes, aún puede agregar hasta 3 referencias de video o audio.",[92,30045,30047],{"id":30046},"puedo-combinar-imagen-a-video-con-generación-de-audio","¿Puedo combinar imagen a video con generación de audio?",[11,30049,30050,30051,30053,30054,30056,30057,30059,30060,30062],{},"Sí. Configure ",[28,30052,23119],{}," en el payload de su solicitud junto con ",[28,30055,2710],{},". El modelo genera audio sincronizado que coincide con el contenido visual: pasos para escenas de caminata, sonidos ambientales para escenas de naturaleza, sonidos mecánicos para rotaciones de productos. También puede proporcionar su propio audio a través de ",[28,30058,3399],{}," y referenciarlo con ",[28,30061,16332],{}," en su prompt.",[92,30064,30066],{"id":30065},"cómo-manejo-la-expiración-de-urls-de-video-en-producción","¿Cómo manejo la expiración de URLs de video en producción?",[11,30068,30069,30070,30072,30073,30075],{},"Las URLs de video generadas expiran después de 24 horas. Para sistemas de producción, implemente un paso de descarga inmediata en su pipeline. Después de que el estado de la tarea cambie a ",[28,30071,1897],{},", descargue el archivo de video a su propio almacenamiento (S3, GCS o disco local) antes de devolver la URL a su aplicación. Nunca almacene la URL generada por la API como referencia permanente. Si está usando ",[28,30074,3416],{},", su manejador de webhook debe incluir el paso de descarga como parte de su lógica de procesamiento.",[92,30077,30079],{"id":30078},"puedo-usar-imagen-a-video-de-seedance-20-para-logos-animados-o-intros-de-marca","¿Puedo usar imagen a video de Seedance 2.0 para logos animados o intros de marca?",[11,30081,30082,30083,30085,30086,30088],{},"Sí, y este es uno de los casos de uso más sólidos. Suba su logo o marca como ",[28,30084,2722],{}," y escriba el prompt para el estilo de animación que desea: ensamblaje de partículas, revelación líquida, rotación 3D, etc. Dado que los logos son elementos gráficos (no rostros fotorrealistas), funcionan perfectamente con el pipeline de imagen a video. Configure ",[28,30087,23119],{}," para agregar un efecto de sonido sincronizado para la revelación.",[92,30090,30092],{"id":30091},"por-qué-fue-rechazada-mi-solicitud-de-imagen-a-video","¿Por qué fue rechazada mi solicitud de imagen a video?",[11,30094,30095,30096,30098],{},"La razón de rechazo más común es un rostro humano fotorrealista en la imagen de entrada. Seedance 2.0 detecta y bloquea automáticamente imágenes de rostros realistas por razones de seguridad. Otras causas de rechazo incluyen: URLs de imagen inaccesibles, formatos de archivo no compatibles, exceder el límite de 9 imágenes o que el conteo total de archivos multimedia exceda 12. Consulte el mensaje de error en la respuesta de tarea ",[28,30097,1901],{}," para obtener detalles específicos.",[45,30100],{},[48,30102,30104],{"id":30103},"comience-a-animar-sus-imágenes","Comience a animar sus imágenes",[11,30106,30107,30108,30111],{},"Ahora dispone de tres métodos distintos para convertir imágenes estáticas en video a través de la API de Seedance 2.0: animación de imagen única para movimiento rápido de personajes o escenas, control de primer y último fotograma para transiciones precisas de inicio a fin, y composición multi-imagen con ",[28,30109,30110],{},"@tags"," para escenas complejas con roles asignados.",[11,30113,30114],{},"Los ejemplos de código a lo largo de esta guía son completos y ejecutables. Copie cualquiera de ellos, inserte su clave API, apunte a sus propias imágenes y tendrá un video generado en minutos.",[11,30116,30117,30118,30120],{},"Para equipos de producto, el flujo de trabajo de generación por lotes convierte un catálogo completo de productos en activos de video sin un estudio. Para equipos creativos, el patrón de consistencia de personajes permite la narración multi-toma a partir de una sola referencia de personaje. Para desarrolladores, el sistema ",[28,30119,22930],{}," proporciona un nivel de control composicional que ninguna otra API de video con IA ofrece actualmente.",[11,30122,30123],{},[23,30124,30125],{},[37,30126,30128],{"href":211,"rel":30127},[41],"Comience a animar sus imágenes. Regístrese gratis en EvoLink →",[45,30130],{},[11,30132,30133],{},[2434,30134,30135,30136,290,30138,290,30140,2774,30142,1580],{},"Esta guía es parte de la serie de tutoriales de Seedance 2.0. Anteriormente: ",[37,30137,2026],{"href":1578},[37,30139,23596],{"href":17348},[37,30141,23090],{"href":2781},[37,30143,24346],{"href":3672},[11008,30145,13233],{},{"title":141,"searchDepth":166,"depth":166,"links":30147},[30148,30154,30160,30167,30174,30181,30188,30197,30206,30207,30216],{"id":22936,"depth":166,"text":22937,"children":30149},[30150,30151,30152,30153],{"id":22950,"depth":178,"text":22951},{"id":23093,"depth":178,"text":23094},{"id":23112,"depth":178,"text":23113},{"id":23123,"depth":178,"text":23124},{"id":23132,"depth":166,"text":23133,"children":30155},[30156,30157,30158,30159],{"id":23142,"depth":178,"text":23143},{"id":23169,"depth":178,"text":23170},{"id":23188,"depth":178,"text":23189},{"id":23287,"depth":178,"text":23288},{"id":23601,"depth":166,"text":23602,"children":30161},[30162,30163,30164,30165,30166],{"id":6243,"depth":178,"text":23608},{"id":23654,"depth":178,"text":23655},{"id":24199,"depth":178,"text":24200},{"id":24221,"depth":178,"text":24222},{"id":24240,"depth":178,"text":24241},{"id":24351,"depth":166,"text":24352,"children":30168},[30169,30170,30171,30172,30173],{"id":24362,"depth":178,"text":23608},{"id":24392,"depth":178,"text":24393},{"id":24431,"depth":178,"text":24432},{"id":24951,"depth":178,"text":24952},{"id":24970,"depth":178,"text":24971},{"id":25049,"depth":166,"text":25050,"children":30175},[30176,30177,30178,30179,30180],{"id":25059,"depth":178,"text":25060},{"id":25087,"depth":178,"text":25088},{"id":25668,"depth":178,"text":25669},{"id":25689,"depth":178,"text":25690},{"id":25793,"depth":178,"text":25794},{"id":25824,"depth":166,"text":25825,"children":30182},[30183,30184,30185,30186,30187],{"id":25838,"depth":178,"text":25839},{"id":26303,"depth":178,"text":26304},{"id":26321,"depth":178,"text":26322},{"id":26423,"depth":178,"text":26424},{"id":27429,"depth":178,"text":27430},{"id":27461,"depth":166,"text":27462,"children":30189},[30190,30191,30192,30193,30194,30195,30196],{"id":27472,"depth":178,"text":27473},{"id":27510,"depth":178,"text":27511},{"id":28046,"depth":178,"text":28047},{"id":28064,"depth":178,"text":28065},{"id":28279,"depth":178,"text":28280},{"id":28297,"depth":178,"text":28298},{"id":28897,"depth":178,"text":28898},{"id":29065,"depth":166,"text":29066,"children":30198},[30199,30200,30201,30202,30203,30204,30205],{"id":29072,"depth":178,"text":29073},{"id":29161,"depth":178,"text":29162},{"id":29243,"depth":178,"text":29244},{"id":29309,"depth":178,"text":29310},{"id":29443,"depth":178,"text":29444},{"id":29534,"depth":178,"text":29535},{"id":29703,"depth":178,"text":29704},{"id":29781,"depth":166,"text":29782},{"id":8835,"depth":166,"text":13096,"children":30208},[30209,30210,30211,30212,30213,30214,30215],{"id":30016,"depth":178,"text":30017},{"id":30023,"depth":178,"text":30024},{"id":30036,"depth":178,"text":30037},{"id":30046,"depth":178,"text":30047},{"id":30065,"depth":178,"text":30066},{"id":30078,"depth":178,"text":30079},{"id":30091,"depth":178,"text":30092},{"id":30103,"depth":166,"text":30104},"Aprenda a animar imágenes con la API de Seedance 2.0 — imagen única, primer y último fotograma, flujos de trabajo multi-imagen. Código Python completo, sintaxis @tag y demos de e-commerce.",{"date":22906,"image":30219,"seoTitle":30220},"/s5-hero-image-to-video.webp","API de Imagen a Video de Seedance 2.0: Anima cualquier imagen (2026)","/es/blog/seedance-2-image-to-video-api",{"title":22915,"description":30217},"es/blog/seedance-2-image-to-video-api","Rsg2QUU5mPDUMCeaQEpbFZxGlqqj2jm4MZMb6KUdrqc",{"id":30226,"title":13219,"body":30227,"description":31987,"extension":11069,"meta":31988,"navigation":58,"path":31991,"seo":31992,"stem":31993,"__hash__":31994},"content/es/blog/seedance-2-multimodal-tags-guide.md",{"type":8,"value":30228,"toc":31938},[30229,30235,30238,30246,30248,30252,30258,30261,30309,30312,30332,30339,30341,30345,30349,30355,30361,30364,30370,30394,30398,30487,30491,30494,30508,30514,30516,30520,30523,30527,30643,30647,30651,30657,30663,30669,30673,30678,30682,30686,30692,30697,30702,30706,30709,30715,30718,30720,30724,30731,30735,30824,30828,30832,30838,30843,30848,30852,30855,30900,30909,30913,30917,30922,30924,30928,30931,30935,31009,31013,31019,31023,31029,31034,31038,31041,31047,31050,31054,31059,31064,31067,31069,31073,31076,31080,31086,31091,31105,31109,31115,31121,31125,31130,31134,31148,31152,31158,31163,31167,31172,31176,31190,31194,31200,31205,31209,31212,31303,31309,31313,31316,31526,31529,31721,31728,31730,31732,31736,31743,31750,31753,31757,31760,31771,31775,31778,31782,31788,31792,31795,31803,31813,31817,31820,31822,31824,31828,31831,31835,31845,31849,31858,31862,31869,31873,31876,31878,31882,31885,31888,31908,31916,31921,31928,31930,31935],[11,30230,30231,30232,30234],{},"La mayoría de los generadores de video con IA toman un prompt de texto y producen lo que les parece. Seedance 2.0 funciona de manera diferente. Usted sube imágenes, videos y archivos de audio, y luego utiliza ",[23,30233,30110],{}," para indicar al modelo exactamente qué debe hacer cada archivo: actuar como primer fotograma, definir el movimiento de cámara, establecer el tempo musical o proporcionar una referencia de personaje.",[11,30236,30237],{},"Este sistema de referencias @tag es lo que diferencia a Seedance 2.0 de Sora 2, Kling 3.0 y Veo 3.1. Ninguno de ellos ofrece este nivel de control multimodal.",[11,30239,30240,30241,30245],{},"Esta guía cubre cada tipo de @tag, las reglas de sintaxis, los límites de archivos y ejemplos reales de prompts que puede utilizar de inmediato. Si desea seguir los ejemplos con llamadas a la API, ",[37,30242,30244],{"href":211,"rel":30243},[41],"obtenga su clave API gratuita de EvoLink"," — solo toma 30 segundos.",[45,30247],{},[48,30249,30251],{"id":30250},"qué-es-el-sistema-de-referencias-tag","¿Qué es el sistema de referencias @Tag?",[11,30253,30254,30255,1580],{},"La generación tradicional de texto a video es un proceso de una entrada y una salida: usted escribe un prompt y el modelo lo interpreta como quiere. Seedance 2.0 convierte esto en un proceso de ",[23,30256,30257],{},"múltiples entradas con salida dirigida",[11,30259,30260],{},"Esta es la diferencia:",[1849,30262,30263,30279],{},[1852,30264,30265],{},[1855,30266,30267,30270,30273,30276],{},[1858,30268,30269],{},"Enfoque",[1858,30271,30272],{},"Entrada",[1858,30274,30275],{},"Nivel de control",[1858,30277,30278],{},"Resultado",[1865,30280,30281,30295],{},[1855,30282,30283,30286,30289,30292],{},[1870,30284,30285],{},"Solo texto",[1870,30287,30288],{},"\"Una mujer baila en el escenario\"",[1870,30290,30291],{},"Bajo — el modelo decide todo",[1870,30293,30294],{},"Qué mujer, qué baile y qué escenario aparecen depende enteramente del modelo",[1855,30296,30297,30300,30303,30306],{},[1870,30298,30299],{},"Con @tags",[1870,30301,30302],{},"@Image1 (personaje) + @Video1 (referencia de baile) + prompt",[1870,30304,30305],{},"Alto — usted dirige cada elemento",[1870,30307,30308],{},"Su personaje específico realiza exactamente el baile que usted referenció",[11,30310,30311],{},"El sistema de @tags funciona como la hoja de planos de un director de cine. Cada archivo subido recibe una asignación de rol mediante lenguaje natural en su prompt:",[97,30313,30314,30320,30326],{},[73,30315,30316,30319],{},[28,30317,30318],{},"@Image1 as the first frame"," — fija el visual de apertura",[73,30321,30322,30325],{},[28,30323,30324],{},"@Video1 for camera movement reference"," — copia la cinematografía",[73,30327,30328,30331],{},[28,30329,30330],{},"@Audio1 as background music"," — establece la banda sonora y el ritmo",[11,30333,30334,30335,30338],{},"Puede combinar hasta ",[23,30336,30337],{},"12 archivos"," (9 imágenes + 3 videos + 3 clips de audio) en una sola generación, cada uno etiquetado con un propósito específico.",[45,30340],{},[48,30342,30344],{"id":30343},"reglas-de-sintaxis-de-tags-la-referencia-completa","Reglas de sintaxis de @Tags — La referencia completa",[92,30346,30348],{"id":30347},"sintaxis-básica","Sintaxis básica",[11,30350,30351,30352,30354],{},"El formato es sencillo: ",[28,30353,11335],{}," + tipo de recurso + número.",[136,30356,30359],{"className":30357,"code":30358,"language":1999},[1997],"@Image1, @Image2, @Image3 ... @Image9\n@Video1, @Video2, @Video3\n@Audio1, @Audio2, @Audio3\n",[28,30360,30358],{"__ignoreMap":141},[11,30362,30363],{},"En su prompt, se hace referencia a estas etiquetas y se describe su rol en lenguaje natural:",[136,30365,30368],{"className":30366,"code":30367,"language":1999},[1997],"@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,30369,30367],{"__ignoreMap":141},[18,30371,30372],{},[11,30373,30374,30377,30378,290,30381,290,30384,30387,30388,290,30390,290,30392,1580],{},[23,30375,30376],{},"Nota:"," En la plataforma Jimeng (即梦), las etiquetas usan formato en chino: ",[28,30379,30380],{},"@图片1",[28,30382,30383],{},"@视频1",[28,30385,30386],{},"@音频1",". A través de la API, utilice ",[28,30389,2722],{},[28,30391,11211],{},[28,30393,16332],{},[92,30395,30397],{"id":30396},"límites-de-archivos-y-formatos","Límites de archivos y formatos",[1849,30399,30400,30418],{},[1852,30401,30402],{},[1855,30403,30404,30407,30410,30413,30416],{},[1858,30405,30406],{},"Tipo de recurso",[1858,30408,30409],{},"Cantidad máxima",[1858,30411,30412],{},"Formatos",[1858,30414,30415],{},"Límite de tamaño",[1858,30417,19223],{},[1865,30419,30420,30436,30452,30468],{},[1855,30421,30422,30425,30428,30430,30433],{},[1870,30423,30424],{},"Imágenes",[1870,30426,30427],{},"9",[1870,30429,3070],{},[1870,30431,30432],{},"30 MB cada una",[1870,30434,30435],{},"Mayor resolución = mejor resultado",[1855,30437,30438,30441,30443,30446,30449],{},[1870,30439,30440],{},"Videos",[1870,30442,4874],{},[1870,30444,30445],{},"MP4, MOV",[1870,30447,30448],{},"50 MB cada uno",[1870,30450,30451],{},"Duración total: 2–15s, resolución: 480p–720p",[1855,30453,30454,30457,30459,30462,30465],{},[1870,30455,30456],{},"Audio",[1870,30458,4874],{},[1870,30460,30461],{},"MP3, WAV",[1870,30463,30464],{},"15 MB cada uno",[1870,30466,30467],{},"Duración total: ≤ 15s",[1855,30469,30470,30475,30480,30482,30484],{},[1870,30471,30472],{},[23,30473,30474],{},"Combinado",[1870,30476,30477],{},[23,30478,30479],{},"12 en total",[1870,30481,3241],{},[1870,30483,3241],{},[1870,30485,30486],{},"Cualquier combinación dentro de los límites",[92,30488,30490],{"id":30489},"los-dos-modos-de-entrada","Los dos modos de entrada",[11,30492,30493],{},"Seedance 2.0 tiene dos modos de generación. Su entrada determina cuál utilizar:",[70,30495,30496,30502],{},[73,30497,30498,30501],{},[23,30499,30500],{},"Modo de primer/último fotograma"," — Suba solo una imagen inicial (+ imagen final opcional) con un prompt de texto. Simple y rápido.",[73,30503,30504,30507],{},[23,30505,30506],{},"Modo de referencia integral"," — Suba cualquier combinación de imágenes, videos y audio con asignaciones de @tags. Aquí es donde reside todo el potencial.",[11,30509,30510,30513],{},[23,30511,30512],{},"Regla:"," Si sube cualquier referencia de video o audio, o más de 2 imágenes, debe usar el modo de referencia integral.",[45,30515],{},[48,30517,30519],{"id":30518},"tags-de-imagen-controle-la-expresión-visual","@Tags de imagen — Controle la expresión visual",[11,30521,30522],{},"Las referencias de imagen son el tipo de @tag más versátil. Una sola imagen puede cumplir muchos propósitos diferentes según cómo la describa en su prompt.",[92,30524,30526],{"id":30525},"tipos-de-referencia-para-imágenes","Tipos de referencia para imágenes",[1849,30528,30529,30540],{},[1852,30530,30531],{},[1855,30532,30533,30535,30538],{},[1858,30534,25710],{},[1858,30536,30537],{},"Patrón de prompt",[1858,30539,11263],{},[1865,30541,30542,30556,30571,30585,30599,30614,30629],{},[1855,30543,30544,30549,30553],{},[1870,30545,30546],{},[23,30547,30548],{},"Primer fotograma",[1870,30550,30551],{},[28,30552,30318],{},[1870,30554,30555],{},"Fija el visual exacto de apertura del video",[1855,30557,30558,30563,30568],{},[1870,30559,30560],{},[23,30561,30562],{},"Último fotograma",[1870,30564,30565],{},[28,30566,30567],{},"@Image2 as the last frame",[1870,30569,30570],{},"Define el visual final para transiciones",[1855,30572,30573,30578,30582],{},[1870,30574,30575],{},[23,30576,30577],{},"Identidad del personaje",[1870,30579,30580],{},[28,30581,25722],{},[1870,30583,30584],{},"Mantiene la consistencia de rostro/cuerpo a lo largo del video",[1855,30586,30587,30591,30596],{},[1870,30588,30589],{},[23,30590,25743],{},[1870,30592,30593],{},[28,30594,30595],{},"reference @Image1's art style",[1870,30597,30598],{},"Aplica estilo pictórico, paleta de colores o estética visual",[1855,30600,30601,30606,30611],{},[1870,30602,30603],{},[23,30604,30605],{},"Escena/entorno",[1870,30607,30608],{},[28,30609,30610],{},"scene references @Image3",[1870,30612,30613],{},"Establece la ubicación, fondo, arquitectura",[1855,30615,30616,30621,30626],{},[1870,30617,30618],{},[23,30619,30620],{},"Referencia de objeto",[1870,30622,30623],{},[28,30624,30625],{},"the product in @Image1",[1870,30627,30628],{},"Mantiene los detalles del producto para anuncios comerciales",[1855,30630,30631,30635,30640],{},[1870,30632,30633],{},[23,30634,23631],{},[1870,30636,30637],{},[28,30638,30639],{},"framing references @Image1",[1870,30641,30642],{},"Copia el ángulo de cámara y la disposición",[92,30644,30646],{"id":30645},"ejemplo-transferencia-de-estilo-con-van-gogh","Ejemplo: Transferencia de estilo con Van Gogh",[11,30648,30649],{},[23,30650,11788],{},[136,30652,30655],{"className":30653,"code":30654,"language":1999},[1997],"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,30656,30654],{"__ignoreMap":141},[11,30658,30659,30662],{},[23,30660,30661],{},"Entrada:"," Una pintura de Van Gogh como @Image1",[11,30664,30665,30668],{},[23,30666,30667],{},"Resultado:"," El modelo renderiza toda la escena en el estilo característico de Van Gogh — no es una superposición de filtro, sino una transferencia de estilo genuina que mantiene la textura de las pinceladas a lo largo de todo el video.",[56,30670,60,30671],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30672],{"src":24227,"type":65},[11,30674,30675],{},[2434,30676,30677],{},"Video: Transferencia de estilo usando referencia @Image — renderizado postimpresionista de Van Gogh",[92,30679,30681],{"id":30680},"ejemplo-anuncio-comercial-de-producto","Ejemplo: Anuncio comercial de producto",[11,30683,30684],{},[23,30685,11788],{},[136,30687,30690],{"className":30688,"code":30689,"language":1999},[1997],"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,30691,30689],{"__ignoreMap":141},[11,30693,30694,30696],{},[23,30695,30661],{}," 3 imágenes — vista lateral, foto principal del producto, primer plano del material",[11,30698,30699,30701],{},[23,30700,30667],{}," Un video de producto pulido que mantiene las texturas exactas del material y las proporciones de sus imágenes de referencia — sin alucinaciones de IA en los detalles del producto.",[92,30703,30705],{"id":30704},"consistencia-de-personaje-con-múltiples-imágenes","Consistencia de personaje con múltiples imágenes",[11,30707,30708],{},"Cuando necesite el mismo personaje en múltiples tomas, suba varias imágenes de referencia desde diferentes ángulos:",[136,30710,30713],{"className":30711,"code":30712,"language":1999},[1997],"@Image1 and @Image2 define the main character's appearance.\nThe character walks through @Image3's environment,\nwearing the outfit from @Image4.\n",[28,30714,30712],{"__ignoreMap":141},[11,30716,30717],{},"Cuantas más imágenes de referencia proporcione para un personaje, más consistente será el resultado. Esto resuelve el problema de \"deformación facial\" que afecta a la generación con una sola imagen.",[45,30719],{},[48,30721,30723],{"id":30722},"tags-de-video-replique-cámara-y-movimiento","@Tags de video — Replique cámara y movimiento",[11,30725,30726,30727,30730],{},"Las referencias de video desbloquean la capacidad más potente de Seedance 2.0: ",[23,30728,30729],{},"la replicación precisa del trabajo de cámara y el movimiento físico",". Suba un video de referencia y el modelo copia la cinematografía exacta, la coreografía de acción o los efectos visuales.",[92,30732,30734],{"id":30733},"tipos-de-referencia-para-videos","Tipos de referencia para videos",[1849,30736,30737,30748],{},[1852,30738,30739],{},[1855,30740,30741,30743,30745],{},[1858,30742,25710],{},[1858,30744,30537],{},[1858,30746,30747],{},"Qué se copia",[1865,30749,30750,30765,30780,30794,30809],{},[1855,30751,30752,30757,30762],{},[1870,30753,30754],{},[23,30755,30756],{},"Movimiento de cámara",[1870,30758,30759],{},[28,30760,30761],{},"reference @Video1's camera movement",[1870,30763,30764],{},"Panorámica, inclinación, dolly, seguimiento, patrones de zoom",[1855,30766,30767,30772,30777],{},[1870,30768,30769],{},[23,30770,30771],{},"Acción/coreografía",[1870,30773,30774],{},[28,30775,30776],{},"perform the actions from @Video1",[1870,30778,30779],{},"Movimiento corporal, pasos de baile, coreografía de combate",[1855,30781,30782,30786,30791],{},[1870,30783,30784],{},[23,30785,11313],{},[1870,30787,30788],{},[28,30789,30790],{},"reference @Video1's transition effects",[1870,30792,30793],{},"Efectos de partículas, transiciones de estilo, VFX",[1855,30795,30796,30801,30806],{},[1870,30797,30798],{},[23,30799,30800],{},"Ritmo/tempo",[1870,30802,30803],{},[28,30804,30805],{},"match @Video1's editing rhythm",[1870,30807,30808],{},"Tiempo de cortes, sincronización con el beat, tempo",[1855,30810,30811,30816,30821],{},[1870,30812,30813],{},[23,30814,30815],{},"Replicación completa",[1870,30817,30818],{},[28,30819,30820],{},"completely reference @Video1",[1870,30822,30823],{},"Todo — cámara, acción, efectos, ritmo",[92,30825,30827],{"id":30826},"ejemplo-replicación-de-cámara-cinematográfica","Ejemplo: Replicación de cámara cinematográfica",[11,30829,30830],{},[23,30831,11788],{},[136,30833,30836],{"className":30834,"code":30835,"language":1999},[1997],"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,30837,30835],{"__ignoreMap":141},[11,30839,30840,30842],{},[23,30841,30661],{}," 3 imágenes (personaje, interior del ascensor, escena exterior) + 1 video de referencia (con el trabajo de cámara deseado)",[11,30844,30845,30847],{},[23,30846,30667],{}," El modelo reproduce exactamente el zoom Hitchcock, los movimientos de cámara orbital y los planos de seguimiento del video de referencia — aplicados a un personaje y escenario completamente diferentes.",[92,30849,30851],{"id":30850},"técnicas-de-cámara-que-puede-replicar","Técnicas de cámara que puede replicar",[11,30853,30854],{},"Seedance 2.0 puede reproducir estos movimientos de cámara a partir de un video de referencia:",[97,30856,30857,30863,30869,30875,30880,30885,30890,30895],{},[73,30858,30859,30862],{},[23,30860,30861],{},"Zoom Hitchcock"," (dolly zoom / efecto vértigo)",[73,30864,30865,30868],{},[23,30866,30867],{},"Órbita de 360°"," alrededor del sujeto",[73,30870,30871,30874],{},[23,30872,30873],{},"Toma continua en un solo plano"," (sin cortes)",[73,30876,30877],{},[23,30878,30879],{},"Seguimiento multiángulo con brazo mecánico",[73,30881,30882],{},[23,30883,30884],{},"Planos contrapicados heroicos",[73,30886,30887],{},[23,30888,30889],{},"Cámara en mano de persecución",[73,30891,30892],{},[23,30893,30894],{},"Distorsión de lente ojo de pez",[73,30896,30897],{},[23,30898,30899],{},"Movimiento rítmico de push-pull",[11,30901,30902,30905,30906,1580],{},[23,30903,30904],{},"Consejo de prompt:"," Sea específico sobre qué aspecto del video de referencia copiar. \"Reference @Video1's camera movement\" es mejor que solo \"reference @Video1\" — le indica al modelo que se concentre en la cinematografía en lugar de intentar copiar todo. Para más ejemplos de referencias de cámara y código Python completo, consulte nuestro ",[37,30907,30908],{"href":3672},"tutorial dedicado de movimiento de cámara",[92,30910,30912],{"id":30911},"ejemplo-parkour-de-acción","Ejemplo: Parkour de acción",[56,30914,60,30915],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30916],{"src":12051,"type":65},[11,30918,30919],{},[2434,30920,30921],{},"Video: Parkour dinámico con plano de seguimiento cinematográfico — generado con referencia de movimiento de cámara",[45,30923],{},[48,30925,30927],{"id":30926},"tags-de-audio-diseño-sonoro-con-referencias","@Tags de audio — Diseño sonoro con referencias",[11,30929,30930],{},"Seedance 2.0 genera audio nativo con cada video — efectos de sonido, ruido ambiental, música e incluso diálogos. Los @tags de audio le dan control sobre cómo suena.",[92,30932,30934],{"id":30933},"tipos-de-referencia-para-audio","Tipos de referencia para audio",[1849,30936,30937,30947],{},[1852,30938,30939],{},[1855,30940,30941,30943,30945],{},[1858,30942,25710],{},[1858,30944,30537],{},[1858,30946,30747],{},[1865,30948,30949,30964,30979,30994],{},[1855,30950,30951,30956,30961],{},[1870,30952,30953],{},[23,30954,30955],{},"Música de fondo",[1870,30957,30958],{},[28,30959,30960],{},"use @Audio1 for background music",[1870,30962,30963],{},"Estilo musical, tempo, instrumentos",[1855,30965,30966,30971,30976],{},[1870,30967,30968],{},[23,30969,30970],{},"Efectos de sonido",[1870,30972,30973],{},[28,30974,30975],{},"sound effects reference @Audio1",[1870,30977,30978],{},"Texturas de sonido específicas y sincronización",[1855,30980,30981,30986,30991],{},[1870,30982,30983],{},[23,30984,30985],{},"Estilo de voz/narración",[1870,30987,30988],{},[28,30989,30990],{},"narration voice references @Video1",[1870,30992,30993],{},"Tono vocal, velocidad de habla, acento",[1855,30995,30996,31001,31006],{},[1870,30997,30998],{},[23,30999,31000],{},"Sincronización de beat",[1870,31002,31003],{},[28,31004,31005],{},"match @Audio1's rhythm for editing cuts",[1870,31007,31008],{},"Los beats musicales impulsan las transiciones visuales",[92,31010,31012],{"id":31011},"sincronización-de-beat-modo-videoclip-musical","Sincronización de beat (Modo videoclip musical)",[11,31014,31015,31016,1580],{},"Una de las funciones de audio más potentes: suba una pista musical y el modelo ",[23,31017,31018],{},"sincroniza los cortes visuales y las transiciones con el beat",[11,31020,31021],{},[23,31022,11788],{},[136,31024,31027],{"className":31025,"code":31026,"language":1999},[1997],"@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,31028,31026],{"__ignoreMap":141},[11,31030,31031,31033],{},[23,31032,30667],{}," El modelo crea una edición estilo videoclip musical donde las transiciones de escena, los movimientos de cámara y los cambios de iluminación ocurren precisamente en el beat del audio de referencia.",[92,31035,31037],{"id":31036},"uso-del-audio-de-video-como-referencia","Uso del audio de video como referencia",[11,31039,31040],{},"No necesita un archivo de audio separado — puede referenciar la pista de audio de un video subido:",[136,31042,31045],{"className":31043,"code":31044,"language":1999},[1997],"Background music references @Video1's audio.\n",[28,31046,31044],{"__ignoreMap":141},[11,31048,31049],{},"Esto es útil cuando desea replicar el diseño sonoro de un video existente mientras cambia los visuales.",[92,31051,31053],{"id":31052},"ejemplo-diálogo-de-personajes","Ejemplo: Diálogo de personajes",[56,31055,60,31056],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31057],{"src":31058,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8C%AB%E7%8B%97%E8%B0%88%E5%BF%83.mp4",[11,31060,31061],{},[2434,31062,31063],{},"Video: Diálogo de personajes generado por IA con actuación de voz natural y sonidos ambientales de cafetería",[11,31065,31066],{},"Seedance 2.0 admite la generación de diálogos en múltiples idiomas, incluyendo inglés, chino, español, coreano y más. Escriba el diálogo directamente en su prompt y el modelo genera sincronización labial y actuación de voz correspondientes.",[45,31068],{},[48,31070,31072],{"id":31071},"combinaciones-avanzadas-recetas-multimodales","Combinaciones avanzadas — Recetas multimodales",[11,31074,31075],{},"El verdadero poder de los @tags surge cuando se combinan múltiples modalidades. Aquí presentamos tres recetas probadas para escenarios de producción comunes.",[92,31077,31079],{"id":31078},"receta-1-cortometraje-cinematográfico","Receta 1: Cortometraje cinematográfico",[11,31081,31082,31085],{},[23,31083,31084],{},"Objetivo:"," Escena con calidad de película con personaje específico, trabajo de cámara y banda sonora",[11,31087,31088],{},[23,31089,31090],{},"Archivos:",[97,31092,31093,31096,31099,31102],{},[73,31094,31095],{},"@Image1: Referencia de rostro/cuerpo del personaje",[73,31097,31098],{},"@Image2: Referencia de entorno/ubicación",[73,31100,31101],{},"@Video1: Referencia de movimiento de cámara (por ejemplo, plano de seguimiento de una película)",[73,31103,31104],{},"@Audio1: Pista de música de fondo",[11,31106,31107],{},[23,31108,11788],{},[136,31110,31113],{"className":31111,"code":31112,"language":1999},[1997],"@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,31114,31112],{"__ignoreMap":141},[11,31116,31117,31120],{},[23,31118,31119],{},"Asignación de archivos:"," 2 imágenes + 1 video + 1 audio = 4/12 archivos utilizados",[92,31122,31124],{"id":31123},"receta-2-video-de-producto-para-comercio-electrónico","Receta 2: Video de producto para comercio electrónico",[11,31126,31127,31129],{},[23,31128,31084],{}," Presentación profesional de producto a partir de fotos estáticas",[11,31131,31132],{},[23,31133,31090],{},[97,31135,31136,31139,31142,31145],{},[73,31137,31138],{},"@Image1: Toma principal del producto",[73,31140,31141],{},"@Image2: Vista lateral del producto",[73,31143,31144],{},"@Image3: Primer plano de material/textura",[73,31146,31147],{},"@Video1: Referencia de movimiento de cámara (toma orbital del producto)",[11,31149,31150],{},[23,31151,11788],{},[136,31153,31156],{"className":31154,"code":31155,"language":1999},[1997],"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,31157,31155],{"__ignoreMap":141},[11,31159,31160,31162],{},[23,31161,31119],{}," 3 imágenes + 1 video = 4/12 archivos utilizados",[92,31164,31166],{"id":31165},"receta-3-animación-con-múltiples-personajes","Receta 3: Animación con múltiples personajes",[11,31168,31169,31171],{},[23,31170,31084],{}," Dos personajes interactuando con acción coreografiada",[11,31173,31174],{},[23,31175,31090],{},[97,31177,31178,31181,31184,31187],{},[73,31179,31180],{},"@Image1, @Image2: Personaje A (referencia frontal + lateral)",[73,31182,31183],{},"@Image3, @Image4: Personaje B (referencia frontal + lateral)",[73,31185,31186],{},"@Image5: Referencia de fondo/escena",[73,31188,31189],{},"@Video1: Referencia de coreografía de acción",[11,31191,31192],{},[23,31193,11788],{},[136,31195,31198],{"className":31196,"code":31197,"language":1999},[1997],"@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,31199,31197],{"__ignoreMap":141},[11,31201,31202,31204],{},[23,31203,31119],{}," 5 imágenes + 1 video = 6/12 archivos utilizados",[92,31206,31208],{"id":31207},"el-presupuesto-de-12-archivos-estrategia-de-asignación","El presupuesto de 12 archivos: Estrategia de asignación",[11,31210,31211],{},"Tiene 12 espacios. Aquí se explica cómo asignarlos para máximo impacto:",[1849,31213,31214,31226],{},[1852,31215,31216],{},[1855,31217,31218,31221,31224],{},[1858,31219,31220],{},"Prioridad",[1858,31222,31223],{},"Asignación",[1858,31225,18133],{},[1865,31227,31228,31240,31253,31265,31278,31290],{},[1855,31229,31230,31234,31237],{},[1870,31231,31232],{},[23,31233,30577],{},[1870,31235,31236],{},"2-3 imágenes por personaje",[1870,31238,31239],{},"Más ángulos = mejor consistencia",[1855,31241,31242,31247,31250],{},[1870,31243,31244],{},[23,31245,31246],{},"Referencia de cámara/movimiento",[1870,31248,31249],{},"1 video",[1870,31251,31252],{},"Una buena referencia es suficiente",[1855,31254,31255,31259,31262],{},[1870,31256,31257],{},[23,31258,30605],{},[1870,31260,31261],{},"1-2 imágenes",[1870,31263,31264],{},"Establece el mundo",[1855,31266,31267,31272,31275],{},[1870,31268,31269],{},[23,31270,31271],{},"Audio/música",[1870,31273,31274],{},"1 audio o video (por su pista de audio)",[1870,31276,31277],{},"Establece el ambiente",[1855,31279,31280,31284,31287],{},[1870,31281,31282],{},[23,31283,25743],{},[1870,31285,31286],{},"1 imagen (si es necesario)",[1870,31288,31289],{},"Solo si desea un estilo no realista",[1855,31291,31292,31297,31300],{},[1870,31293,31294],{},[23,31295,31296],{},"Reserva",[1870,31298,31299],{},"Mantener 2-3 espacios libres",[1870,31301,31302],{},"Para iteración y detalle adicional",[11,31304,31305,31308],{},[23,31306,31307],{},"Consejo profesional:"," No use los 12 espacios. Comience con 4-6 archivos y agregue más solo si el resultado necesita más precisión. Sobrecargar con referencias puede confundir al modelo.",[92,31310,31312],{"id":31311},"ejemplo-de-llamada-a-la-api","Ejemplo de llamada a la API",[11,31314,31315],{},"Así es como se ve una generación multimodal a través de la API:",[136,31317,31319],{"className":326,"code":31318,"language":328,"meta":141,"style":141},"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,31320,31321,31327,31331,31339,31346,31364,31372,31382,31388,31393,31398,31403,31408,31413,31417,31423,31430,31435,31439,31445,31450,31454,31464,31474,31481,31485,31489,31493,31505],{"__ignoreMap":141},[145,31322,31323,31325],{"class":147,"line":148},[145,31324,335],{"class":258},[145,31326,352],{"class":262},[145,31328,31329],{"class":147,"line":166},[145,31330,357],{"emptyLinePlaceholder":58},[145,31332,31333,31335,31337],{"class":147,"line":178},[145,31334,6332],{"class":262},[145,31336,266],{"class":258},[145,31338,1219],{"class":262},[145,31340,31341,31344],{"class":147,"line":187},[145,31342,31343],{"class":159},"    \"https://api.evolink.ai/v1/videos/generations\"",[145,31345,469],{"class":262},[145,31347,31348,31350,31352,31354,31357,31359,31362],{"class":147,"line":360},[145,31349,6354],{"class":593},[145,31351,266],{"class":258},[145,31353,577],{"class":262},[145,31355,31356],{"class":159},"\"Authorization\"",[145,31358,454],{"class":262},[145,31360,31361],{"class":159},"\"Bearer YOUR_EVOLINK_API_KEY\"",[145,31363,19393],{"class":262},[145,31365,31366,31368,31370],{"class":147,"line":366},[145,31367,6365],{"class":593},[145,31369,266],{"class":258},[145,31371,1678],{"class":262},[145,31373,31374,31376,31378,31380],{"class":147,"line":378},[145,31375,1078],{"class":159},[145,31377,454],{"class":262},[145,31379,1083],{"class":159},[145,31381,469],{"class":262},[145,31383,31384,31386],{"class":147,"line":395},[145,31385,1095],{"class":159},[145,31387,1098],{"class":262},[145,31389,31390],{"class":147,"line":400},[145,31391,31392],{"class":159},"            \"@Image1 as the main character. \"\n",[145,31394,31395],{"class":147,"line":415},[145,31396,31397],{"class":159},"            \"@Image2 as the environment. \"\n",[145,31399,31400],{"class":147,"line":432},[145,31401,31402],{"class":159},"            \"Reference @Video1's tracking shot and camera movement. \"\n",[145,31404,31405],{"class":147,"line":437},[145,31406,31407],{"class":159},"            \"The character walks through a misty forest at dawn. \"\n",[145,31409,31410],{"class":147,"line":448},[145,31411,31412],{"class":159},"            \"Cinematic lighting, shallow depth of field.\"\n",[145,31414,31415],{"class":147,"line":472},[145,31416,1122],{"class":262},[145,31418,31419,31421],{"class":147,"line":483},[145,31420,2503],{"class":159},[145,31422,2506],{"class":262},[145,31424,31425,31428],{"class":147,"line":489},[145,31426,31427],{"class":159},"            \"https://your-cdn.com/character.jpg\"",[145,31429,469],{"class":262},[145,31431,31432],{"class":147,"line":494},[145,31433,31434],{"class":159},"            \"https://your-cdn.com/forest.jpg\"\n",[145,31436,31437],{"class":147,"line":499},[145,31438,2516],{"class":262},[145,31440,31441,31443],{"class":147,"line":519},[145,31442,11954],{"class":159},[145,31444,2506],{"class":262},[145,31446,31447],{"class":147,"line":525},[145,31448,31449],{"class":159},"            \"https://your-cdn.com/tracking-shot.mp4\"\n",[145,31451,31452],{"class":147,"line":536},[145,31453,2516],{"class":262},[145,31455,31456,31458,31460,31462],{"class":147,"line":541},[145,31457,1128],{"class":159},[145,31459,454],{"class":262},[145,31461,513],{"class":155},[145,31463,469],{"class":262},[145,31465,31466,31468,31470,31472],{"class":147,"line":552},[145,31467,1145],{"class":159},[145,31469,454],{"class":262},[145,31471,3525],{"class":159},[145,31473,469],{"class":262},[145,31475,31476,31478],{"class":147,"line":563},[145,31477,1179],{"class":159},[145,31479,31480],{"class":262},": true\n",[145,31482,31483],{"class":147,"line":590},[145,31484,1192],{"class":262},[145,31486,31487],{"class":147,"line":602},[145,31488,392],{"class":262},[145,31490,31491],{"class":147,"line":608},[145,31492,357],{"emptyLinePlaceholder":58},[145,31494,31495,31497,31499,31501,31503],{"class":147,"line":614},[145,31496,11996],{"class":262},[145,31498,266],{"class":258},[145,31500,12001],{"class":262},[145,31502,1428],{"class":159},[145,31504,644],{"class":262},[145,31506,31507,31509,31511,31513,31516,31518,31520,31522,31524],{"class":147,"line":625},[145,31508,6387],{"class":155},[145,31510,424],{"class":262},[145,31512,457],{"class":258},[145,31514,31515],{"class":159},"\"Generation started: ",[145,31517,577],{"class":155},[145,31519,580],{"class":262},[145,31521,583],{"class":155},[145,31523,466],{"class":159},[145,31525,392],{"class":262},[11,31527,31528],{},"Consulte el resultado:",[136,31530,31532],{"className":326,"code":31531,"language":328,"meta":141,"style":141},"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,31533,31534,31540,31544,31553,31561,31578,31594,31598,31607,31611,31627,31655,31660,31676,31705,31709,31713],{"__ignoreMap":141},[145,31535,31536,31538],{"class":147,"line":148},[145,31537,335],{"class":258},[145,31539,345],{"class":262},[145,31541,31542],{"class":147,"line":166},[145,31543,357],{"emptyLinePlaceholder":58},[145,31545,31546,31549,31551],{"class":147,"line":178},[145,31547,31548],{"class":258},"while",[145,31550,547],{"class":155},[145,31552,412],{"class":262},[145,31554,31555,31557,31559],{"class":147,"line":187},[145,31556,7041],{"class":262},[145,31558,266],{"class":258},[145,31560,560],{"class":262},[145,31562,31563,31565,31568,31570,31572,31574,31576],{"class":147,"line":360},[145,31564,1225],{"class":258},[145,31566,31567],{"class":159},"\"https://api.evolink.ai/v1/tasks/",[145,31569,577],{"class":155},[145,31571,580],{"class":262},[145,31573,583],{"class":155},[145,31575,466],{"class":159},[145,31577,469],{"class":262},[145,31579,31580,31582,31584,31586,31588,31590,31592],{"class":147,"line":366},[145,31581,1244],{"class":593},[145,31583,266],{"class":258},[145,31585,577],{"class":262},[145,31587,31356],{"class":159},[145,31589,454],{"class":262},[145,31591,31361],{"class":159},[145,31593,486],{"class":262},[145,31595,31596],{"class":147,"line":378},[145,31597,1274],{"class":262},[145,31599,31600,31602,31604],{"class":147,"line":395},[145,31601,1420],{"class":262},[145,31603,266],{"class":258},[145,31605,31606],{"class":262}," status.json()\n",[145,31608,31609],{"class":147,"line":400},[145,31610,357],{"emptyLinePlaceholder":58},[145,31612,31613,31615,31617,31619,31621,31623,31625],{"class":147,"line":415},[145,31614,2320],{"class":258},[145,31616,1453],{"class":262},[145,31618,641],{"class":159},[145,31620,14725],{"class":262},[145,31622,752],{"class":258},[145,31624,755],{"class":159},[145,31626,412],{"class":262},[145,31628,31629,31631,31633,31635,31637,31639,31641,31643,31645,31647,31649,31651,31653],{"class":147,"line":432},[145,31630,696],{"class":155},[145,31632,424],{"class":262},[145,31634,457],{"class":258},[145,31636,11600],{"class":159},[145,31638,577],{"class":155},[145,31640,11605],{"class":262},[145,31642,11608],{"class":159},[145,31644,1359],{"class":262},[145,31646,663],{"class":155},[145,31648,1331],{"class":262},[145,31650,583],{"class":155},[145,31652,466],{"class":159},[145,31654,392],{"class":262},[145,31656,31657],{"class":147,"line":437},[145,31658,31659],{"class":258},"        break\n",[145,31661,31662,31664,31666,31668,31670,31672,31674],{"class":147,"line":448},[145,31663,7316],{"class":258},[145,31665,1453],{"class":262},[145,31667,641],{"class":159},[145,31669,14725],{"class":262},[145,31671,752],{"class":258},[145,31673,779],{"class":159},[145,31675,412],{"class":262},[145,31677,31678,31680,31682,31684,31687,31689,31691,31693,31695,31697,31699,31701,31703],{"class":147,"line":472},[145,31679,696],{"class":155},[145,31681,424],{"class":262},[145,31683,457],{"class":258},[145,31685,31686],{"class":159},"\"Error: ",[145,31688,577],{"class":155},[145,31690,11654],{"class":262},[145,31692,11657],{"class":159},[145,31694,290],{"class":262},[145,31696,17747],{"class":159},[145,31698,108],{"class":262},[145,31700,583],{"class":155},[145,31702,466],{"class":159},[145,31704,392],{"class":262},[145,31706,31707],{"class":147,"line":483},[145,31708,31659],{"class":258},[145,31710,31711],{"class":147,"line":489},[145,31712,357],{"emptyLinePlaceholder":58},[145,31714,31715,31717,31719],{"class":147,"line":494},[145,31716,19705],{"class":262},[145,31718,1133],{"class":155},[145,31720,392],{"class":262},[11,31722,31723,31724,31727],{},"Ejecute este código con su ",[37,31725,11138],{"href":211,"rel":31726},[41],". El registro es gratuito — no se requiere tarjeta de crédito.",[45,31729],{},[48,31731,12986],{"id":12985},[92,31733,31735],{"id":31734},"no-especificar-el-propósito-del-tag","No especificar el propósito del @tag",[11,31737,31738,14079,31740],{},[23,31739,12995],{},[28,31741,31742],{},"@Image1 @Video1 generate a video of a dancer",[11,31744,31745,14079,31747],{},[23,31746,13011],{},[28,31748,31749],{},"@Image1 as the dancer's appearance reference. @Video1 for dance choreography and camera movement. Generate the dancer performing on a stage.",[11,31751,31752],{},"El modelo necesita asignaciones de rol explícitas. Sin ellas, adivina — y adivina mal.",[92,31754,31756],{"id":31755},"archivos-de-entrada-con-baja-resolución","Archivos de entrada con baja resolución",[11,31758,31759],{},"Si su @Image1 es de 480p, el resultado se verá borroso. Siempre utilice:",[97,31761,31762,31765,31768],{},[73,31763,31764],{},"Imágenes: resolución de 2K o superior",[73,31766,31767],{},"Videos: 720p, metraje limpio sin artefactos de compresión",[73,31769,31770],{},"Audio: MP3 de 128kbps o superior, o WAV sin pérdida",[92,31772,31774],{"id":31773},"intentar-usar-los-12-espacios-de-archivos","Intentar usar los 12 espacios de archivos",[11,31776,31777],{},"Más referencias no significa mejor resultado. Comience con 3-5 archivos y agregue solo si es necesario. Demasiadas referencias en conflicto confunden al modelo.",[92,31779,31781],{"id":31780},"subir-fotos-de-rostros-humanos-realistas","Subir fotos de rostros humanos realistas",[11,31783,31784,31787],{},[23,31785,31786],{},"Limitación de la plataforma:"," Seedance 2.0 actualmente no admite la subida de imágenes o videos que contengan rostros humanos realistas. El sistema bloqueará automáticamente estas subidas. Utilice referencias de personajes ilustrados, estilo anime o estilizados en su lugar.",[92,31789,31791],{"id":31790},"confundir-la-numeración-de-recursos","Confundir la numeración de recursos",[11,31793,31794],{},"Cuando sube 3 imágenes y 2 videos, se numeran de forma independiente:",[97,31796,31797,31800],{},[73,31798,31799],{},"Imágenes: @Image1, @Image2, @Image3",[73,31801,31802],{},"Videos: @Video1, @Video2",[11,31804,31805,31806,1898,31809,31812],{},"No escriba ",[28,31807,31808],{},"@File3",[28,31810,31811],{},"@Asset5"," — utilice la numeración específica por tipo.",[92,31814,31816],{"id":31815},"establecer-la-duración-incorrecta-para-extensiones-de-video","Establecer la duración incorrecta para extensiones de video",[11,31818,31819],{},"Al extender un video existente en 5 segundos, establezca la duración de generación en 5s (la porción nueva), no la duración total. La extensión se agrega al original.",[45,31821],{},[48,31823,13096],{"id":8835},[92,31825,31827],{"id":31826},"cuántos-archivos-puedo-subir-en-una-sola-generación","¿Cuántos archivos puedo subir en una sola generación?",[11,31829,31830],{},"Hasta 12 archivos en total: máximo 9 imágenes, 3 videos y 3 clips de audio. Los videos deben tener una duración combinada de entre 2 y 15 segundos. Los clips de audio pueden sumar hasta 15 segundos en total.",[92,31832,31834],{"id":31833},"puedo-usar-tags-a-través-de-la-api","¿Puedo usar @tags a través de la API?",[11,31836,31837,31838,290,31840,2774,31842,31844],{},"Sí. Al llamar a la API, pase los arrays ",[28,31839,2710],{},[28,31841,3382],{},[28,31843,3399],{}," en el cuerpo JSON de la solicitud. Cada array contiene URLs directas a sus archivos de referencia. La numeración de @tags (@Image1, @Image2...) corresponde al orden de las URLs en cada array. El texto del prompt utiliza la misma sintaxis de @tags que la interfaz.",[92,31846,31848],{"id":31847},"qué-sucede-si-no-asigno-un-rol-a-un-tag","¿Qué sucede si no asigno un rol a un @tag?",[11,31850,31851,31852,31854,31855,31857],{},"El modelo intentará inferir el propósito basándose en el contenido del archivo y el contexto de su prompt. Sin embargo, esto no es confiable. Siempre indique explícitamente el rol de cada etiqueta — por ejemplo, ",[28,31853,30318],{}," en lugar de solo mencionar ",[28,31856,2722],{}," sin contexto.",[92,31859,31861],{"id":31860},"puedo-referenciar-el-audio-de-un-archivo-de-video-subido","¿Puedo referenciar el audio de un archivo de video subido?",[11,31863,31864,31865,31868],{},"Sí. Utilice ",[28,31866,31867],{},"background music references @Video1's audio"," en su prompt. El modelo extrae la pista de audio del video y la utiliza como referencia sonora sin necesidad de un archivo de audio separado.",[92,31870,31872],{"id":31871},"qué-formatos-de-imagen-y-video-son-compatibles","¿Qué formatos de imagen y video son compatibles?",[11,31874,31875],{},"Imágenes: JPEG, PNG, WebP, BMP, TIFF, GIF (máximo 30 MB cada una). Videos: MP4, MOV (máximo 50 MB cada uno, resolución 480p–720p). Audio: MP3, WAV (máximo 15 MB cada uno).",[45,31877],{},[48,31879,31881],{"id":31880},"comience-a-crear-con-tags","Comience a crear con @Tags",[11,31883,31884],{},"El sistema de referencias @tag es lo que convierte a Seedance 2.0 en el generador de video con IA más controlable disponible. En lugar de describir lo que desea y esperar lo mejor, usted le muestra al modelo exactamente lo que quiere decir — y luego lo dirige como un equipo de filmación.",[11,31886,31887],{},"Los principios clave:",[70,31889,31890,31896,31902],{},[73,31891,31892,31895],{},[23,31893,31894],{},"Cada @tag necesita un rol."," No solo suba archivos — indique al modelo qué hace cada uno.",[73,31897,31898,31901],{},[23,31899,31900],{},"Comience con poco, agregue precisión."," Empiece con 3-4 referencias. Agregue más solo si el resultado lo necesita.",[73,31903,31904,31907],{},[23,31905,31906],{},"Sea específico sobre qué copiar."," \"Reference @Video1's camera movement\" supera a \"reference @Video1.\"",[11,31909,31910,31911,31915],{},"¿Listo para dirigir sus propios videos con IA? ",[37,31912,31914],{"href":211,"rel":31913},[41],"Comience gratis en EvoLink"," — una clave API para Seedance 2.0 y todos los principales modelos de video con IA, con enrutamiento inteligente que le ahorra entre 20-70%.",[11,31917,31918],{},[23,31919,31920],{},"Continúe aprendiendo:",[97,31922,31923],{},[73,31924,31925,31927],{},[37,31926,22840],{"href":1578}," — Domine los fundamentos de escritura de prompts",[45,31929],{},[11,31931,31932],{},[2434,31933,31934],{},"Última actualización: 20 de febrero de 2026 | Written by J, Growth Lead at EvoLink",[11008,31936,31937],{},"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":141,"searchDepth":166,"depth":166,"links":31939},[31940,31941,31946,31952,31958,31964,31971,31979,31986],{"id":30250,"depth":166,"text":30251},{"id":30343,"depth":166,"text":30344,"children":31942},[31943,31944,31945],{"id":30347,"depth":178,"text":30348},{"id":30396,"depth":178,"text":30397},{"id":30489,"depth":178,"text":30490},{"id":30518,"depth":166,"text":30519,"children":31947},[31948,31949,31950,31951],{"id":30525,"depth":178,"text":30526},{"id":30645,"depth":178,"text":30646},{"id":30680,"depth":178,"text":30681},{"id":30704,"depth":178,"text":30705},{"id":30722,"depth":166,"text":30723,"children":31953},[31954,31955,31956,31957],{"id":30733,"depth":178,"text":30734},{"id":30826,"depth":178,"text":30827},{"id":30850,"depth":178,"text":30851},{"id":30911,"depth":178,"text":30912},{"id":30926,"depth":166,"text":30927,"children":31959},[31960,31961,31962,31963],{"id":30933,"depth":178,"text":30934},{"id":31011,"depth":178,"text":31012},{"id":31036,"depth":178,"text":31037},{"id":31052,"depth":178,"text":31053},{"id":31071,"depth":166,"text":31072,"children":31965},[31966,31967,31968,31969,31970],{"id":31078,"depth":178,"text":31079},{"id":31123,"depth":178,"text":31124},{"id":31165,"depth":178,"text":31166},{"id":31207,"depth":178,"text":31208},{"id":31311,"depth":178,"text":31312},{"id":12985,"depth":166,"text":12986,"children":31972},[31973,31974,31975,31976,31977,31978],{"id":31734,"depth":178,"text":31735},{"id":31755,"depth":178,"text":31756},{"id":31773,"depth":178,"text":31774},{"id":31780,"depth":178,"text":31781},{"id":31790,"depth":178,"text":31791},{"id":31815,"depth":178,"text":31816},{"id":8835,"depth":166,"text":13096,"children":31980},[31981,31982,31983,31984,31985],{"id":31826,"depth":178,"text":31827},{"id":31833,"depth":178,"text":31834},{"id":31847,"depth":178,"text":31848},{"id":31860,"depth":178,"text":31861},{"id":31871,"depth":178,"text":31872},{"id":31880,"depth":166,"text":31881},"Domine el sistema de referencias @tag de Seedance 2.0. Aprenda la sintaxis de etiquetado de imágenes, videos y audio con ejemplos reales y plantillas de prompts. Comience a crear gratis.",{"date":13285,"image":31989,"seoTitle":31990},"/screenshot-20260220-193326.png","Guía de @Tags en Seedance 2.0: Sistema de Referencias Multimodales Explicado","/es/blog/seedance-2-multimodal-tags-guide",{"title":13219,"description":31987},"es/blog/seedance-2-multimodal-tags-guide","Iex2_U1ohXBap47eTYuVhw9hQosaQhj9kXLI0OXiAt0",{"id":31996,"title":31997,"body":31998,"description":38430,"extension":11069,"meta":38431,"navigation":58,"path":38434,"seo":38435,"stem":38436,"__hash__":38437},"content/es/blog/seedance-2-prompt-guide.md","Prompts de Seedance 2.0: Guia completa para la generacion multimodal de video",{"type":8,"value":31999,"toc":38381},[32000,32006,32014,32029,32041,32043,32047,32050,32055,32136,32140,32149,32156,32162,32166,32172,32175,32198,32201,32207,32212,32215,32220,32226,32231,32237,32241,32244,32268,32277,32283,32287,32294,32300,32306,32312,32315,32319,32322,32327,32805,32808,32815,32829,32831,32835,32840,32844,32892,32899,32905,32909,32996,33000,33074,33078,33136,33140,33143,33242,33249,33251,33255,33259,33263,33269,33273,33506,33510,33515,33519,33755,33759,33764,33769,34000,34004,34008,34019,34023,34252,34256,34264,34268,34542,34546,34554,34558,34799,34803,34811,34815,35159,35163,35167,35175,35180,35478,35482,35487,35492,35759,35763,35768,35772,36028,36032,36037,36042,36284,36288,36292,36297,36470,36474,36479,36652,36660,36662,36666,36858,36864,36866,36870,36874,36877,37165,37168,37172,37175,37215,37219,37222,37244,37250,37254,37257,37276,37286,37290,37293,37402,37405,37409,37412,37582,37585,37605,37607,37611,37615,37618,37745,37749,37752,37892,37896,37899,38055,38063,38065,38067,38071,38074,38078,38081,38112,38116,38130,38134,38137,38140,38151,38158,38162,38165,38176,38180,38194,38198,38201,38227,38231,38248,38252,38259,38263,38295,38299,38302,38319,38321,38325,38328,38331,38334,38345,38355,38371,38373,38378],[11,32001,32002,32003,1580],{},"Seedance 2.0 acepta texto, imagenes, clips de video y archivos de audio, todo en un solo prompt. La clave para obtener resultados cinematograficos reside en como estructuras ese prompt y como haces referencia a los archivos multimedia subidos mediante ",[28,32004,32005],{},"@Tags",[11,32007,32008,32009,32013],{},"Construido sobre el ",[37,32010,32012],{"href":17196,"rel":32011},[41],"modelo fundacional de video Seed"," de ByteDance, Seedance 2.0 es el modelo de generacion de video multimodal mas potente disponible a traves de API.",[11,32015,32016,32017,32020,32021,32024,32025,32028],{},"Esta guia desglosa la ",[23,32018,32019],{},"formula de prompts de Seedance 2.0",", explica el sistema de referencia ",[28,32022,32023],{},"@Tag",", y te ofrece ",[23,32026,32027],{},"mas de 15 plantillas de prompts listas para copiar y pegar"," con codigo Python funcional para la API.",[18,32030,32031],{},[11,32032,32033,14079,32036,32040],{},[23,32034,32035],{},"Sigue los ejemplos de codigo:",[37,32037,32039],{"href":211,"rel":32038},[41],"Obtiene tu clave API gratuita en EvoLink"," para ejecutar todos los fragmentos de codigo a continuacion.",[45,32042],{},[48,32044,32046],{"id":32045},"la-formula-de-prompts-de-seedance-20","La formula de prompts de Seedance 2.0",[11,32048,32049],{},"Cada prompt eficaz de Seedance sigue una estructura de cinco partes:",[11,32051,32052],{},[23,32053,32054],{},"Sujeto + Accion + Camara + Estilo + Restricciones",[1849,32056,32057,32069],{},[1852,32058,32059],{},[1855,32060,32061,32064,32067],{},[1858,32062,32063],{},"Componente",[1858,32065,32066],{},"Que controla",[1858,32068,11263],{},[1865,32070,32071,32084,32097,32110,32123],{},[1855,32072,32073,32078,32081],{},[1870,32074,32075],{},[23,32076,32077],{},"Sujeto",[1870,32079,32080],{},"Quien o que aparece en pantalla",[1870,32082,32083],{},"\"Un astronauta con traje espacial blanco en Marte\"",[1855,32085,32086,32091,32094],{},[1870,32087,32088],{},[23,32089,32090],{},"Accion",[1870,32092,32093],{},"Movimiento y eventos",[1870,32095,32096],{},"\"Da un paso adelante desde el borde del crater\"",[1855,32098,32099,32104,32107],{},[1870,32100,32101],{},[23,32102,32103],{},"Camara",[1870,32105,32106],{},"Angulo, movimiento, lente",[1870,32108,32109],{},"\"Plano general extremo, acercamiento lento hasta primer plano\"",[1855,32111,32112,32117,32120],{},[1870,32113,32114],{},[23,32115,32116],{},"Estilo",[1870,32118,32119],{},"Estetica visual",[1870,32121,32122],{},"\"Epica de ciencia ficcion, IMAX 70mm, paleta desaturada turquesa-naranja\"",[1855,32124,32125,32130,32133],{},[1870,32126,32127],{},[23,32128,32129],{},"Restricciones",[1870,32131,32132],{},"Duracion, resolucion, atmosfera",[1870,32134,32135],{},"\"10 segundos, fisica de polvo realista, diseno consistente del traje espacial\"",[92,32137,32139],{"id":32138},"por-que-funciona-esta-formula","Por que funciona esta formula",[11,32141,32142,32143,32148],{},"Seedance 2.0 utiliza una arquitectura de ",[37,32144,32147],{"href":32145,"rel":32146},"https://arxiv.org/abs/2212.09748",[41],"Diffusion Transformer"," de doble rama. Una rama procesa la informacion espacial (como se ven las cosas), mientras que la otra maneja la informacion temporal (como se mueven las cosas a lo largo del tiempo). Un prompt bien estructurado alimenta ambas ramas con claridad.",[11,32150,32151,32152,32155],{},"Los prompts vagos como ",[2434,32153,32154],{},"\"un video genial de un coche\""," obligan al modelo a adivinar los detalles espaciales y temporales. Los prompts estructurados eliminan esa incertidumbre.",[11,32157,32158,32159,1580],{},"Para la referencia completa de parametros de la API, consulta la ",[37,32160,32161],{"href":14180},"documentacion de generacion de video",[92,32163,32165],{"id":32164},"avanzado-el-formato-de-guion-de-tomas","Avanzado: El formato de guion de tomas",[11,32167,32168,32169,1580],{},"La formula de cinco partes es un excelente punto de partida. Pero los resultados de mayor calidad de Seedance 2.0 — los que se vuelven virales en redes sociales — utilizan un formato mas potente: ",[23,32170,32171],{},"el guion de tomas",[11,32173,32174],{},"Un guion de tomas anade tres capas sobre la formula basica:",[70,32176,32177,32186,32192],{},[73,32178,32179,32182,32183],{},[23,32180,32181],{},"Codigos de tiempo"," — Divide tu video en segmentos de 3-5 segundos con marcadores explicitos ",[28,32184,32185],{},"[00:00-00:05]",[73,32187,32188,32191],{},[23,32189,32190],{},"Lenguaje de tomas"," — Nombra cada toma y su funcion: \"Toma 1: La Escala (Plano General Extremo)\"",[73,32193,32194,32197],{},[23,32195,32196],{},"Anclas de estilo + detalles de fisica"," — Ancla a un estilo especifico de director/pelicula, y describe reacciones fisicas en lugar de conceptos abstractos",[11,32199,32200],{},"Aqui esta la estructura:",[136,32202,32205],{"className":32203,"code":32204,"language":1999},[1997],"【Style】Ancla de estilo especifica (nombre de director / estilo cinematografico / movimiento artistico)\n【Duration】Duracion total\n\n[00:00-00:04] Shot 1: Nombre de la Toma (Tipo de Camara).\nDescripcion de la escena con detalles fisicos.\nAccion del personaje con lenguaje corporal especifico.\nIndicacion de audio.\n\n[00:04-00:07] Shot 2: Nombre de la Toma (Tipo de Camara).\n...\n\n[00:07-00:10] Shot 3: Nombre de la Toma (Tipo de Camara).\n...\n\nRestricciones de consistencia. Requisitos de fisica. Notas de paleta de colores.\n",[28,32206,32204],{"__ignoreMap":141},[32208,32209,32211],"h4",{"id":32210},"formula-basica-vs-guion-de-tomas-comparacion-directa","Formula basica vs. guion de tomas: comparacion directa",[11,32213,32214],{},"Comparemos el mismo concepto — un astronauta en Marte — escrito de ambas formas:",[11,32216,32217],{},[23,32218,32219],{},"Formula basica (ideal para principiantes):",[136,32221,32224],{"className":32222,"code":32223,"language":1999},[1997],"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,32225,32223],{"__ignoreMap":141},[11,32227,32228],{},[23,32229,32230],{},"Guion de tomas (utilizado por los mejores creadores):",[136,32232,32235],{"className":32233,"code":32234,"language":1999},[1997],"【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,32236,32234],{"__ignoreMap":141},[32208,32238,32240],{"id":32239},"por-que-el-guion-de-tomas-produce-mejores-resultados","Por que el guion de tomas produce mejores resultados",[11,32242,32243],{},"El guion de tomas supera a la formula basica por tres razones:",[70,32245,32246,32256,32262],{},[73,32247,32248,32251,32252,32255],{},[23,32249,32250],{},"Precision temporal."," Los codigos de tiempo le indican a Seedance exactamente ",[2434,32253,32254],{},"cuando"," ocurre cada accion. Sin ellos, el modelo distribuye las acciones de forma impredecible a lo largo de la duracion.",[73,32257,32258,32261],{},[23,32259,32260],{},"Arco narrativo."," Las tomas con nombre te obligan a construir una historia: planteamiento - descubrimiento - desenlace. El modelo genera un movimiento mas convincente cuando entiende la progresion emocional.",[73,32263,32264,32267],{},[23,32265,32266],{},"Fundamentacion fisica."," Detalles como \"particulas de polvo flotan en camara lenta alrededor de las botas\" le dan al motor de fisica restricciones concretas en lugar de esteticas vagas.",[11,32269,32270,32271,32276],{},"Los mejores creadores en la comunidad ",[37,32272,32275],{"href":32273,"rel":32274},"https://github.com/EvoLinkAI/awesome-seedance-2-guide",[41],"awesome-seedance"," utilizan consistentemente el formato de guion de tomas para sus mejores trabajos — desde escenas de carreras hasta transformaciones de estilo artistico. El patron es claro: codigos de tiempo estructurados + anclas de estilo especificas = resultado cinematografico.",[11,32278,32279,32280,1580],{},"Desglosamos estas tecnicas de camara paso a paso en nuestra ",[37,32281,32282],{"href":3672},"guia de replicacion de movimiento de camara",[92,32284,32286],{"id":32285},"prompts-de-solo-texto-vs-prompts-multimodales","Prompts de solo texto vs. prompts multimodales",[11,32288,32289,32290,32293],{},"Un ",[23,32291,32292],{},"prompt de solo texto"," depende enteramente del lenguaje para describir la escena:",[136,32295,32298],{"className":32296,"code":32297,"language":1999},[1997],"A red sports car drifts around a mountain curve, tires smoking,\ndrone shot tracking from above, cinematic color grading, 10 seconds\n",[28,32299,32297],{"__ignoreMap":141},[11,32301,32289,32302,32305],{},[23,32303,32304],{},"prompt multimodal"," combina texto con referencias subidas:",[136,32307,32310],{"className":32308,"code":32309,"language":1999},[1997],"@Image1 as first frame, car drifts around the curve following\n@Video1 camera path, @Audio1 as engine sound, cinematic grading, 10 seconds\n",[28,32311,32309],{"__ignoreMap":141},[11,32313,32314],{},"La version multimodal le proporciona a Seedance 2.0 anclas visuales exactas en lugar de depender de la interpretacion del modelo de \"coche deportivo rojo\".",[92,32316,32318],{"id":32317},"tu-primer-prompt-de-seedance-20-ejemplo-con-la-api","Tu primer prompt de Seedance 2.0 — Ejemplo con la API",[11,32320,32321],{},"Aqui tienes una llamada completa de generacion de texto a video usando el formato de guion de tomas:",[56,32323,60,32324],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,32325],{"src":32326,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%B5%9B%E8%BD%A6%E7%94%B5%E5%BD%B1%E6%84%9F.mp4",[136,32328,32330],{"className":326,"code":32329,"language":328,"meta":141,"style":141},"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,32331,32332,32338,32344,32350,32354,32367,32375,32379,32384,32392,32404,32426,32434,32444,32450,32459,32468,32477,32482,32487,32496,32505,32514,32519,32524,32533,32542,32551,32556,32561,32570,32575,32580,32584,32594,32603,32607,32611,32619,32631,32635,32640,32648,32656,32676,32698,32703,32720,32749,32753,32769,32793,32797],{"__ignoreMap":141},[145,32333,32334,32336],{"class":147,"line":148},[145,32335,335],{"class":258},[145,32337,352],{"class":262},[145,32339,32340,32342],{"class":147,"line":166},[145,32341,335],{"class":258},[145,32343,338],{"class":262},[145,32345,32346,32348],{"class":147,"line":178},[145,32347,335],{"class":258},[145,32349,345],{"class":262},[145,32351,32352],{"class":147,"line":187},[145,32353,357],{"emptyLinePlaceholder":58},[145,32355,32356,32358,32360,32362,32365],{"class":147,"line":360},[145,32357,381],{"class":155},[145,32359,372],{"class":258},[145,32361,386],{"class":262},[145,32363,32364],{"class":159},"\"SEEDANCE_API_KEY\"",[145,32366,392],{"class":262},[145,32368,32369,32371,32373],{"class":147,"line":366},[145,32370,369],{"class":155},[145,32372,372],{"class":258},[145,32374,9077],{"class":159},[145,32376,32377],{"class":147,"line":378},[145,32378,357],{"emptyLinePlaceholder":58},[145,32380,32381],{"class":147,"line":395},[145,32382,32383],{"class":174},"# Submit generation task\n",[145,32385,32386,32388,32390],{"class":147,"line":400},[145,32387,6332],{"class":262},[145,32389,266],{"class":258},[145,32391,1219],{"class":262},[145,32393,32394,32396,32398,32400,32402],{"class":147,"line":415},[145,32395,6341],{"class":258},[145,32397,466],{"class":159},[145,32399,571],{"class":155},[145,32401,1232],{"class":159},[145,32403,469],{"class":262},[145,32405,32406,32408,32410,32412,32414,32416,32418,32420,32422,32424],{"class":147,"line":432},[145,32407,6354],{"class":593},[145,32409,266],{"class":258},[145,32411,577],{"class":262},[145,32413,31356],{"class":159},[145,32415,454],{"class":262},[145,32417,457],{"class":258},[145,32419,460],{"class":159},[145,32421,463],{"class":155},[145,32423,466],{"class":159},[145,32425,19393],{"class":262},[145,32427,32428,32430,32432],{"class":147,"line":437},[145,32429,6365],{"class":593},[145,32431,266],{"class":258},[145,32433,1678],{"class":262},[145,32435,32436,32438,32440,32442],{"class":147,"line":448},[145,32437,1078],{"class":159},[145,32439,454],{"class":262},[145,32441,1083],{"class":159},[145,32443,469],{"class":262},[145,32445,32446,32448],{"class":147,"line":472},[145,32447,1095],{"class":159},[145,32449,1098],{"class":262},[145,32451,32452,32455,32457],{"class":147,"line":483},[145,32453,32454],{"class":159},"            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.",[145,32456,1476],{"class":155},[145,32458,5185],{"class":159},[145,32460,32461,32464,32466],{"class":147,"line":489},[145,32462,32463],{"class":159},"            \"【Duration】10 seconds",[145,32465,11918],{"class":155},[145,32467,5185],{"class":159},[145,32469,32470,32473,32475],{"class":147,"line":494},[145,32471,32472],{"class":159},"            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).",[145,32474,1476],{"class":155},[145,32476,5185],{"class":159},[145,32478,32479],{"class":147,"line":499},[145,32480,32481],{"class":159},"            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n",[145,32483,32484],{"class":147,"line":519},[145,32485,32486],{"class":159},"            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n",[145,32488,32489,32492,32494],{"class":147,"line":525},[145,32490,32491],{"class":159},"            \"at his rival. Dashboard instruments glow green on his visor.",[145,32493,1476],{"class":155},[145,32495,5185],{"class":159},[145,32497,32498,32501,32503],{"class":147,"line":536},[145,32499,32500],{"class":159},"            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'",[145,32502,11918],{"class":155},[145,32504,5185],{"class":159},[145,32506,32507,32510,32512],{"class":147,"line":541},[145,32508,32509],{"class":159},"            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).",[145,32511,1476],{"class":155},[145,32513,5185],{"class":159},[145,32515,32516],{"class":147,"line":552},[145,32517,32518],{"class":159},"            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n",[145,32520,32521],{"class":147,"line":563},[145,32522,32523],{"class":159},"            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n",[145,32525,32526,32529,32531],{"class":147,"line":590},[145,32527,32528],{"class":159},"            \"adrenaline through the visor slit.",[145,32530,1476],{"class":155},[145,32532,5185],{"class":159},[145,32534,32535,32538,32540],{"class":147,"line":602},[145,32536,32537],{"class":159},"            \"Dialogue Cue: He whispers 'Focus' to himself.",[145,32539,11918],{"class":155},[145,32541,5185],{"class":159},[145,32543,32544,32547,32549],{"class":147,"line":608},[145,32545,32546],{"class":159},"            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).",[145,32548,1476],{"class":155},[145,32550,5185],{"class":159},[145,32552,32553],{"class":147,"line":614},[145,32554,32555],{"class":159},"            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n",[145,32557,32558],{"class":147,"line":625},[145,32559,32560],{"class":159},"            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n",[145,32562,32563,32566,32568],{"class":147,"line":630},[145,32564,32565],{"class":159},"            \"the camera lens. Motion blur turns stadium lights into long golden streaks.",[145,32567,11918],{"class":155},[145,32569,5185],{"class":159},[145,32571,32572],{"class":147,"line":647},[145,32573,32574],{"class":159},"            \"Consistent car designs. Realistic rain physics, water reflections. \"\n",[145,32576,32577],{"class":147,"line":668},[145,32578,32579],{"class":159},"            \"Tension-building audio.\"\n",[145,32581,32582],{"class":147,"line":688},[145,32583,1122],{"class":262},[145,32585,32586,32588,32590,32592],{"class":147,"line":693},[145,32587,1128],{"class":159},[145,32589,454],{"class":262},[145,32591,513],{"class":155},[145,32593,469],{"class":262},[145,32595,32596,32598,32600],{"class":147,"line":738},[145,32597,1145],{"class":159},[145,32599,454],{"class":262},[145,32601,32602],{"class":159},"\"1080p\"\n",[145,32604,32605],{"class":147,"line":743},[145,32606,1192],{"class":262},[145,32608,32609],{"class":147,"line":760},[145,32610,392],{"class":262},[145,32612,32613,32615,32617],{"class":147,"line":769},[145,32614,6378],{"class":262},[145,32616,266],{"class":258},[145,32618,622],{"class":262},[145,32620,32621,32623,32625,32627,32629],{"class":147,"line":784},[145,32622,11996],{"class":262},[145,32624,266],{"class":258},[145,32626,638],{"class":262},[145,32628,1428],{"class":159},[145,32630,644],{"class":262},[145,32632,32633],{"class":147,"line":810},[145,32634,357],{"emptyLinePlaceholder":58},[145,32636,32637],{"class":147,"line":837},[145,32638,32639],{"class":174},"# Poll for result\n",[145,32641,32642,32644,32646],{"class":147,"line":842},[145,32643,31548],{"class":258},[145,32645,547],{"class":155},[145,32647,412],{"class":262},[145,32649,32650,32652,32654],{"class":147,"line":848},[145,32651,7041],{"class":262},[145,32653,266],{"class":258},[145,32655,560],{"class":262},[145,32657,32658,32660,32662,32664,32666,32668,32670,32672,32674],{"class":147,"line":853},[145,32659,1225],{"class":258},[145,32661,466],{"class":159},[145,32663,571],{"class":155},[145,32665,574],{"class":159},[145,32667,577],{"class":155},[145,32669,580],{"class":262},[145,32671,583],{"class":155},[145,32673,466],{"class":159},[145,32675,469],{"class":262},[145,32677,32678,32680,32682,32684,32686,32688,32690,32692,32694,32696],{"class":147,"line":858},[145,32679,1244],{"class":593},[145,32681,266],{"class":258},[145,32683,577],{"class":262},[145,32685,31356],{"class":159},[145,32687,454],{"class":262},[145,32689,457],{"class":258},[145,32691,460],{"class":159},[145,32693,463],{"class":155},[145,32695,466],{"class":159},[145,32697,486],{"class":262},[145,32699,32700],{"class":147,"line":869},[145,32701,32702],{"class":262},"    ).json()\n",[145,32704,32705,32707,32710,32712,32714,32716,32718],{"class":147,"line":875},[145,32706,2320],{"class":258},[145,32708,32709],{"class":262}," status[",[145,32711,641],{"class":159},[145,32713,14725],{"class":262},[145,32715,752],{"class":258},[145,32717,755],{"class":159},[145,32719,412],{"class":262},[145,32721,32722,32724,32726,32728,32730,32732,32735,32737,32739,32741,32743,32745,32747],{"class":147,"line":900},[145,32723,696],{"class":155},[145,32725,424],{"class":262},[145,32727,457],{"class":258},[145,32729,11600],{"class":159},[145,32731,577],{"class":155},[145,32733,32734],{"class":262},"status[",[145,32736,11608],{"class":159},[145,32738,1359],{"class":262},[145,32740,663],{"class":155},[145,32742,1331],{"class":262},[145,32744,583],{"class":155},[145,32746,466],{"class":159},[145,32748,392],{"class":262},[145,32750,32751],{"class":147,"line":921},[145,32752,31659],{"class":258},[145,32754,32755,32757,32759,32761,32763,32765,32767],{"class":147,"line":927},[145,32756,7316],{"class":258},[145,32758,32709],{"class":262},[145,32760,641],{"class":159},[145,32762,14725],{"class":262},[145,32764,752],{"class":258},[145,32766,779],{"class":159},[145,32768,412],{"class":262},[145,32770,32771,32773,32775,32777,32779,32781,32783,32785,32787,32789,32791],{"class":147,"line":932},[145,32772,696],{"class":155},[145,32774,424],{"class":262},[145,32776,457],{"class":258},[145,32778,31686],{"class":159},[145,32780,577],{"class":155},[145,32782,32734],{"class":262},[145,32784,11657],{"class":159},[145,32786,1331],{"class":262},[145,32788,583],{"class":155},[145,32790,466],{"class":159},[145,32792,392],{"class":262},[145,32794,32795],{"class":147,"line":956},[145,32796,31659],{"class":258},[145,32798,32799,32801,32803],{"class":147,"line":981},[145,32800,19705],{"class":262},[145,32802,1133],{"class":155},[145,32804,392],{"class":262},[11,32806,32807],{},"Esto produce un video de 10 segundos en 1080p con audio nativo. El guion de tomas le proporciona a Seedance codigos de tiempo claros, direcciones de camara y detalles fisicos, lo que resulta en una secuencia cinematografica de carreras en tres actos a partir de un solo prompt de texto.",[11,32809,32810,32811,32814],{},"Nuevo en la API? Comienza con la ",[37,32812,32813],{"href":17348},"guia de inicio rapido"," para configuracion y autenticacion.",[18,32816,32817],{},[11,32818,32819,32821,32822,290,32824,290,32826,32828],{},[23,32820,30376],{}," Todos los siguientes ejemplos de codigo usan la misma configuracion. Copia el ",[28,32823,335],{},[28,32825,381],{},[28,32827,369],{}," y la logica de sondeo del ejemplo anterior. Solo mostramos la llamada a la API con el prompt y los parametros unicos.",[45,32830],{},[48,32832,32834],{"id":32833},"el-sistema-de-referencia-tag-explicado","El sistema de referencia @Tag explicado",[11,32836,23075,32837,32839],{},[28,32838,32023],{}," es lo que convierte los prompts de Seedance 2.0 en verdaderamente multimodales. Cuando subes archivos, cada uno recibe una etiqueta automatica basada en su tipo y orden de carga.",[92,32841,32843],{"id":32842},"reglas-de-sintaxis","Reglas de sintaxis",[97,32845,32846,32859,32872,32886],{},[73,32847,32848,14079,32851,290,32853,32855,32856,32858],{},[23,32849,32850],{},"Imagenes:",[28,32852,2722],{},[28,32854,2732],{},", ... ",[28,32857,2769],{}," (hasta 9 imagenes)",[73,32860,32861,14079,32864,290,32866,290,32868,32871],{},[23,32862,32863],{},"Videos:",[28,32865,11211],{},[28,32867,13111],{},[28,32869,32870],{},"@Video3"," (hasta 3 clips)",[73,32873,32874,14079,32877,290,32879,290,32882,32885],{},[23,32875,32876],{},"Audio:",[28,32878,16332],{},[28,32880,32881],{},"@Audio2",[28,32883,32884],{},"@Audio3"," (hasta 3 archivos)",[73,32887,32888,32891],{},[23,32889,32890],{},"Limite total de archivos:"," 12 archivos por solicitud",[11,32893,32894,32895,32898],{},"Las etiquetas se asignan en orden de carga dentro de cada tipo. El texto de tu prompt le indica a Seedance ",[2434,32896,32897],{},"como"," usar cada referencia.",[11,32900,32901,32902,1580],{},"Para una inmersion profunda en cada patron de @tag con 8+ casos reales, consulta la ",[37,32903,32904],{"href":2781},"guia completa de @Tags",[92,32906,32908],{"id":32907},"_5-formas-de-usar-referencias-de-imagen","5 formas de usar referencias de imagen",[1849,32910,32911,32924],{},[1852,32912,32913],{},[1855,32914,32915,32918,32921],{},[1858,32916,32917],{},"Uso",[1858,32919,32920],{},"Sintaxis del prompt",[1858,32922,32923],{},"Que hace",[1865,32925,32926,32939,32953,32967,32982],{},[1855,32927,32928,32932,32936],{},[1870,32929,32930],{},[23,32931,30548],{},[1870,32933,32934],{},[28,32935,2809],{},[1870,32937,32938],{},"El video comienza desde esta imagen exacta",[1855,32940,32941,32946,32950],{},[1870,32942,32943],{},[23,32944,32945],{},"Ultimo fotograma",[1870,32947,32948],{},[28,32949,2822],{},[1870,32951,32952],{},"El video termina en esta imagen",[1855,32954,32955,32960,32964],{},[1870,32956,32957],{},[23,32958,32959],{},"Apariencia del personaje",[1870,32961,32962],{},[28,32963,2835],{},[1870,32965,32966],{},"Preserva la apariencia del personaje durante todo el video",[1855,32968,32969,32974,32979],{},[1870,32970,32971],{},[23,32972,32973],{},"Entorno de la escena",[1870,32975,32976],{},[28,32977,32978],{},"@Image1 as background environment",[1870,32980,32981],{},"Usa la imagen como escenario de la escena",[1855,32983,32984,32989,32993],{},[1870,32985,32986],{},[23,32987,32988],{},"Estilo / estetica",[1870,32990,32991],{},[28,32992,2848],{},[1870,32994,32995],{},"Coincide con la paleta de colores, textura y atmosfera",[92,32997,32999],{"id":32998},"_4-formas-de-usar-referencias-de-video","4 formas de usar referencias de video",[1849,33001,33002,33012],{},[1852,33003,33004],{},[1855,33005,33006,33008,33010],{},[1858,33007,32917],{},[1858,33009,32920],{},[1858,33011,32923],{},[1865,33013,33014,33029,33044,33059],{},[1855,33015,33016,33021,33026],{},[1870,33017,33018],{},[23,33019,33020],{},"Replicacion de camara",[1870,33022,33023],{},[28,33024,33025],{},"follow @Video1 camera movement",[1870,33027,33028],{},"Copia el patron de panoramica, inclinacion y zoom",[1855,33030,33031,33036,33041],{},[1870,33032,33033],{},[23,33034,33035],{},"Imitacion de movimiento",[1870,33037,33038],{},[28,33039,33040],{},"character moves like @Video1",[1870,33042,33043],{},"Transfiere el movimiento corporal / coreografia",[1855,33045,33046,33051,33056],{},[1870,33047,33048],{},[23,33049,33050],{},"Replicacion de efectos",[1870,33052,33053],{},[28,33054,33055],{},"apply @Video1 transition effects",[1870,33057,33058],{},"Replica efectos visuales y transiciones",[1855,33060,33061,33066,33071],{},[1870,33062,33063],{},[23,33064,33065],{},"Referencia de ritmo",[1870,33067,33068],{},[28,33069,33070],{},"match @Video1 pacing and cuts",[1870,33072,33073],{},"Sincroniza el tiempo y el ritmo de la escena",[92,33075,33077],{"id":33076},"_3-formas-de-usar-referencias-de-audio","3 formas de usar referencias de audio",[1849,33079,33080,33090],{},[1852,33081,33082],{},[1855,33083,33084,33086,33088],{},[1858,33085,32917],{},[1858,33087,32920],{},[1858,33089,32923],{},[1865,33091,33092,33107,33121],{},[1855,33093,33094,33099,33104],{},[1870,33095,33096],{},[23,33097,33098],{},"Musica de fondo",[1870,33100,33101],{},[28,33102,33103],{},"@Audio1 as background soundtrack",[1870,33105,33106],{},"Establece la atmosfera con la musica subida",[1855,33108,33109,33113,33118],{},[1870,33110,33111],{},[23,33112,30970],{},[1870,33114,33115],{},[28,33116,33117],{},"@Audio1 as ambient sound",[1870,33119,33120],{},"Anade efectos de sonido especificos",[1855,33122,33123,33128,33133],{},[1870,33124,33125],{},[23,33126,33127],{},"Estilo de voz",[1870,33129,33130],{},[28,33131,33132],{},"@Audio1 as voice style reference",[1870,33134,33135],{},"Coincide con el tono y la cadencia vocal",[92,33137,33139],{"id":33138},"estrategia-optima-de-asignacion-de-archivos","Estrategia optima de asignacion de archivos",[11,33141,33142],{},"Con un limite de 12 archivos, asi es como distribuir las referencias para diferentes casos de uso:",[1849,33144,33145,33161],{},[1852,33146,33147],{},[1855,33148,33149,33151,33154,33156,33158],{},[1858,33150,13968],{},[1858,33152,33153],{},"Imagenes",[1858,33155,30440],{},[1858,33157,30456],{},[1858,33159,33160],{},"Total",[1865,33162,33163,33180,33195,33212,33227],{},[1855,33164,33165,33168,33171,33174,33177],{},[1870,33166,33167],{},"Comercial de producto",[1870,33169,33170],{},"4 (angulos del producto)",[1870,33172,33173],{},"1 (ref. de camara)",[1870,33175,33176],{},"1 (musica)",[1870,33178,33179],{},"6",[1855,33181,33182,33185,33188,33191,33193],{},[1870,33183,33184],{},"Animacion de personaje",[1870,33186,33187],{},"3 (personaje + escena)",[1870,33189,33190],{},"2 (ref. de movimiento)",[1870,33192,33176],{},[1870,33194,33179],{},[1855,33196,33197,33200,33203,33206,33209],{},[1870,33198,33199],{},"Video musical",[1870,33201,33202],{},"2 (estilo + personaje)",[1870,33204,33205],{},"2 (ref. de danza)",[1870,33207,33208],{},"3 (pistas)",[1870,33210,33211],{},"7",[1855,33213,33214,33217,33220,33223,33225],{},[1870,33215,33216],{},"Narrativa multi-toma",[1870,33218,33219],{},"6 (fotogramas clave de escena)",[1870,33221,33222],{},"1 (ref. de estilo)",[1870,33224,33176],{},[1870,33226,3513],{},[1855,33228,33229,33232,33235,33237,33240],{},[1870,33230,33231],{},"Maxima calidad en una sola toma",[1870,33233,33234],{},"9 (todos los angulos)",[1870,33236,663],{},[1870,33238,33239],{},"3 (capas de audio)",[1870,33241,16205],{},[18,33243,33244],{},[11,33245,33246,33248],{},[23,33247,10991],{}," Rara vez necesitaras los 12 espacios. Menos referencias de mayor calidad suelen superar a muchas de baja calidad.",[45,33250],{},[48,33252,33254],{"id":33253},"mas-de-15-plantillas-de-prompts-de-seedance-listas-para-usar","Mas de 15 plantillas de prompts de Seedance listas para usar",[92,33256,33258],{"id":33257},"plantillas-de-prompts-de-texto-a-video","Plantillas de prompts de texto a video",[32208,33260,33262],{"id":33261},"t1-cortometraje-de-dialogo-con-multiples-personajes","T1: Cortometraje de dialogo con multiples personajes",[11,33264,33265,33268],{},[23,33266,33267],{},"Descripcion:"," Dos personajes animados con personalidades vocales distintas participan en una conversacion dinamica, demostrando las capacidades de actuacion vocal, ahora en formato de guion de tomas.",[56,33270,60,33271],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33272],{"src":31058,"type":65},[136,33274,33276],{"className":326,"code":33275,"language":328,"meta":141,"style":141},"# T1: Dialogo multi-personaje — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,33277,33278,33283,33291,33303,33325,33333,33343,33349,33358,33367,33376,33381,33386,33391,33400,33409,33414,33419,33424,33433,33442,33447,33452,33461,33466,33471,33475,33485,33493,33497,33501],{"__ignoreMap":141},[145,33279,33280],{"class":147,"line":148},[145,33281,33282],{"class":174},"# T1: Dialogo multi-personaje — usa la configuracion del primer ejemplo\n",[145,33284,33285,33287,33289],{"class":147,"line":166},[145,33286,6332],{"class":262},[145,33288,266],{"class":258},[145,33290,1219],{"class":262},[145,33292,33293,33295,33297,33299,33301],{"class":147,"line":178},[145,33294,6341],{"class":258},[145,33296,466],{"class":159},[145,33298,571],{"class":155},[145,33300,1232],{"class":159},[145,33302,469],{"class":262},[145,33304,33305,33307,33309,33311,33313,33315,33317,33319,33321,33323],{"class":147,"line":187},[145,33306,6354],{"class":593},[145,33308,266],{"class":258},[145,33310,577],{"class":262},[145,33312,31356],{"class":159},[145,33314,454],{"class":262},[145,33316,457],{"class":258},[145,33318,460],{"class":159},[145,33320,463],{"class":155},[145,33322,466],{"class":159},[145,33324,19393],{"class":262},[145,33326,33327,33329,33331],{"class":147,"line":360},[145,33328,6365],{"class":593},[145,33330,266],{"class":258},[145,33332,1678],{"class":262},[145,33334,33335,33337,33339,33341],{"class":147,"line":366},[145,33336,1078],{"class":159},[145,33338,454],{"class":262},[145,33340,1083],{"class":159},[145,33342,469],{"class":262},[145,33344,33345,33347],{"class":147,"line":378},[145,33346,1095],{"class":159},[145,33348,1098],{"class":262},[145,33350,33351,33354,33356],{"class":147,"line":395},[145,33352,33353],{"class":159},"            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.",[145,33355,1476],{"class":155},[145,33357,5185],{"class":159},[145,33359,33360,33363,33365],{"class":147,"line":400},[145,33361,33362],{"class":159},"            \"【Duration】12 seconds",[145,33364,11918],{"class":155},[145,33366,5185],{"class":159},[145,33368,33369,33372,33374],{"class":147,"line":415},[145,33370,33371],{"class":159},"            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).",[145,33373,1476],{"class":155},[145,33375,5185],{"class":159},[145,33377,33378],{"class":147,"line":432},[145,33379,33380],{"class":159},"            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n",[145,33382,33383],{"class":147,"line":437},[145,33384,33385],{"class":159},"            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n",[145,33387,33388],{"class":147,"line":448},[145,33389,33390],{"class":159},"            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n",[145,33392,33393,33396,33398],{"class":147,"line":472},[145,33394,33395],{"class":159},"            \"light through the cafe window. Subtle ear twitch.",[145,33397,11918],{"class":155},[145,33399,5185],{"class":159},[145,33401,33402,33405,33407],{"class":147,"line":483},[145,33403,33404],{"class":159},"            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).",[145,33406,1476],{"class":155},[145,33408,5185],{"class":159},[145,33410,33411],{"class":147,"line":489},[145,33412,33413],{"class":159},"            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n",[145,33415,33416],{"class":147,"line":494},[145,33417,33418],{"class":159},"            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n",[145,33420,33421],{"class":147,"line":499},[145,33422,33423],{"class":159},"            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n",[145,33425,33426,33429,33431],{"class":147,"line":519},[145,33427,33428],{"class":159},"            \"gesture wildly, nearly knocking over a pastry plate.",[145,33430,11918],{"class":155},[145,33432,5185],{"class":159},[145,33434,33435,33438,33440],{"class":147,"line":525},[145,33436,33437],{"class":159},"            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).",[145,33439,1476],{"class":155},[145,33441,5185],{"class":159},[145,33443,33444],{"class":147,"line":536},[145,33445,33446],{"class":159},"            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n",[145,33448,33449],{"class":147,"line":541},[145,33450,33451],{"class":159},"            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n",[145,33453,33454,33457,33459],{"class":147,"line":552},[145,33455,33456],{"class":159},"            \"drops in amazement. Beat of silence. Both burst into laughter.",[145,33458,11918],{"class":155},[145,33460,5185],{"class":159},[145,33462,33463],{"class":147,"line":563},[145,33464,33465],{"class":159},"            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n",[145,33467,33468],{"class":147,"line":590},[145,33469,33470],{"class":159},"            \"Warm cafe lighting with bokeh background.\"\n",[145,33472,33473],{"class":147,"line":602},[145,33474,1122],{"class":262},[145,33476,33477,33479,33481,33483],{"class":147,"line":608},[145,33478,1128],{"class":159},[145,33480,454],{"class":262},[145,33482,16205],{"class":155},[145,33484,469],{"class":262},[145,33486,33487,33489,33491],{"class":147,"line":614},[145,33488,1145],{"class":159},[145,33490,454],{"class":262},[145,33492,32602],{"class":159},[145,33494,33495],{"class":147,"line":625},[145,33496,1192],{"class":262},[145,33498,33499],{"class":147,"line":630},[145,33500,392],{"class":262},[145,33502,33503],{"class":147,"line":647},[145,33504,33505],{"class":174},"# Sondear con el mismo bucle while del primer ejemplo\n",[32208,33507,33509],{"id":33508},"t2-transformacion-de-estilo-pintura-viviente-de-van-gogh","T2: Transformacion de estilo — Pintura viviente de Van Gogh",[11,33511,33512,33514],{},[23,33513,33267],{}," Transforma una escena clasica postimpresionista en un mundo que respira y se mueve, demostrando un control preciso del estilo artistico mediante la ingenieria de prompts.",[56,33516,60,33517],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33518],{"src":24227,"type":65},[136,33520,33522],{"className":326,"code":33521,"language":328,"meta":141,"style":141},"# T2: Transformacion de estilo — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,33523,33524,33529,33537,33549,33571,33579,33589,33595,33600,33609,33617,33626,33631,33636,33641,33650,33659,33664,33669,33674,33683,33692,33697,33702,33711,33716,33721,33725,33735,33743,33747,33751],{"__ignoreMap":141},[145,33525,33526],{"class":147,"line":148},[145,33527,33528],{"class":174},"# T2: Transformacion de estilo — usa la configuracion del primer ejemplo\n",[145,33530,33531,33533,33535],{"class":147,"line":166},[145,33532,6332],{"class":262},[145,33534,266],{"class":258},[145,33536,1219],{"class":262},[145,33538,33539,33541,33543,33545,33547],{"class":147,"line":178},[145,33540,6341],{"class":258},[145,33542,466],{"class":159},[145,33544,571],{"class":155},[145,33546,1232],{"class":159},[145,33548,469],{"class":262},[145,33550,33551,33553,33555,33557,33559,33561,33563,33565,33567,33569],{"class":147,"line":187},[145,33552,6354],{"class":593},[145,33554,266],{"class":258},[145,33556,577],{"class":262},[145,33558,31356],{"class":159},[145,33560,454],{"class":262},[145,33562,457],{"class":258},[145,33564,460],{"class":159},[145,33566,463],{"class":155},[145,33568,466],{"class":159},[145,33570,19393],{"class":262},[145,33572,33573,33575,33577],{"class":147,"line":360},[145,33574,6365],{"class":593},[145,33576,266],{"class":258},[145,33578,1678],{"class":262},[145,33580,33581,33583,33585,33587],{"class":147,"line":366},[145,33582,1078],{"class":159},[145,33584,454],{"class":262},[145,33586,1083],{"class":159},[145,33588,469],{"class":262},[145,33590,33591,33593],{"class":147,"line":378},[145,33592,1095],{"class":159},[145,33594,1098],{"class":262},[145,33596,33597],{"class":147,"line":395},[145,33598,33599],{"class":159},"            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n",[145,33601,33602,33605,33607],{"class":147,"line":400},[145,33603,33604],{"class":159},"            \"swirling brushstrokes, dreamy high-saturation.",[145,33606,1476],{"class":155},[145,33608,5185],{"class":159},[145,33610,33611,33613,33615],{"class":147,"line":415},[145,33612,32463],{"class":159},[145,33614,11918],{"class":155},[145,33616,5185],{"class":159},[145,33618,33619,33622,33624],{"class":147,"line":432},[145,33620,33621],{"class":159},"            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).",[145,33623,1476],{"class":155},[145,33625,5185],{"class":159},[145,33627,33628],{"class":147,"line":437},[145,33629,33630],{"class":159},"            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n",[145,33632,33633],{"class":147,"line":448},[145,33634,33635],{"class":159},"            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n",[145,33637,33638],{"class":147,"line":472},[145,33639,33640],{"class":159},"            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n",[145,33642,33643,33646,33648],{"class":147,"line":483},[145,33644,33645],{"class":159},"            \"and flowing paint. Everything moves — the sky itself breathes.",[145,33647,11918],{"class":155},[145,33649,5185],{"class":159},[145,33651,33652,33655,33657],{"class":147,"line":489},[145,33653,33654],{"class":159},"            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).",[145,33656,1476],{"class":155},[145,33658,5185],{"class":159},[145,33660,33661],{"class":147,"line":494},[145,33662,33663],{"class":159},"            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n",[145,33665,33666],{"class":147,"line":499},[145,33667,33668],{"class":159},"            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n",[145,33670,33671],{"class":147,"line":519},[145,33672,33673],{"class":159},"            \"and flowing hair. The village behind her shifts with painted texture, \"\n",[145,33675,33676,33679,33681],{"class":147,"line":525},[145,33677,33678],{"class":159},"            \"windows glowing with warm yellow-orange light.",[145,33680,11918],{"class":155},[145,33682,5185],{"class":159},[145,33684,33685,33688,33690],{"class":147,"line":536},[145,33686,33687],{"class":159},"            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).",[145,33689,1476],{"class":155},[145,33691,5185],{"class":159},[145,33693,33694],{"class":147,"line":541},[145,33695,33696],{"class":159},"            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n",[145,33698,33699],{"class":147,"line":552},[145,33700,33701],{"class":159},"            \"the woman, through the village streets. Paint texture becomes visible at \"\n",[145,33703,33704,33707,33709],{"class":147,"line":563},[145,33705,33706],{"class":159},"            \"close range. The entire world is alive with flowing brushstrokes.",[145,33708,11918],{"class":155},[145,33710,5185],{"class":159},[145,33712,33713],{"class":147,"line":590},[145,33714,33715],{"class":159},"            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n",[145,33717,33718],{"class":147,"line":602},[145,33719,33720],{"class":159},"            \"oil paint. Blue-yellow-orange palette dominant.\"\n",[145,33722,33723],{"class":147,"line":608},[145,33724,1122],{"class":262},[145,33726,33727,33729,33731,33733],{"class":147,"line":614},[145,33728,1128],{"class":159},[145,33730,454],{"class":262},[145,33732,513],{"class":155},[145,33734,469],{"class":262},[145,33736,33737,33739,33741],{"class":147,"line":625},[145,33738,1145],{"class":159},[145,33740,454],{"class":262},[145,33742,32602],{"class":159},[145,33744,33745],{"class":147,"line":630},[145,33746,1192],{"class":262},[145,33748,33749],{"class":147,"line":647},[145,33750,392],{"class":262},[145,33752,33753],{"class":147,"line":668},[145,33754,33505],{"class":174},[32208,33756,33758],{"id":33757},"t3-expresion-emocional-actuacion-de-personaje-anime","T3: Expresion emocional — Actuacion de personaje anime",[11,33760,33761,33763],{},[23,33762,33267],{}," Un personaje de estilo anime leyendo una carta con cambios detallados de expresion emocional, demostrando como los prompts de solo texto pueden crear una actuacion de personaje con matices.",[56,33765,60,33766],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33767],{"src":33768,"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",[136,33770,33772],{"className":326,"code":33771,"language":328,"meta":141,"style":141},"# T3: Expresion emocional — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,33773,33774,33779,33787,33799,33821,33829,33839,33845,33850,33859,33867,33876,33881,33886,33895,33904,33909,33914,33919,33928,33937,33942,33947,33956,33961,33966,33970,33980,33988,33992,33996],{"__ignoreMap":141},[145,33775,33776],{"class":147,"line":148},[145,33777,33778],{"class":174},"# T3: Expresion emocional — usa la configuracion del primer ejemplo\n",[145,33780,33781,33783,33785],{"class":147,"line":166},[145,33782,6332],{"class":262},[145,33784,266],{"class":258},[145,33786,1219],{"class":262},[145,33788,33789,33791,33793,33795,33797],{"class":147,"line":178},[145,33790,6341],{"class":258},[145,33792,466],{"class":159},[145,33794,571],{"class":155},[145,33796,1232],{"class":159},[145,33798,469],{"class":262},[145,33800,33801,33803,33805,33807,33809,33811,33813,33815,33817,33819],{"class":147,"line":187},[145,33802,6354],{"class":593},[145,33804,266],{"class":258},[145,33806,577],{"class":262},[145,33808,31356],{"class":159},[145,33810,454],{"class":262},[145,33812,457],{"class":258},[145,33814,460],{"class":159},[145,33816,463],{"class":155},[145,33818,466],{"class":159},[145,33820,19393],{"class":262},[145,33822,33823,33825,33827],{"class":147,"line":360},[145,33824,6365],{"class":593},[145,33826,266],{"class":258},[145,33828,1678],{"class":262},[145,33830,33831,33833,33835,33837],{"class":147,"line":366},[145,33832,1078],{"class":159},[145,33834,454],{"class":262},[145,33836,1083],{"class":159},[145,33838,469],{"class":262},[145,33840,33841,33843],{"class":147,"line":378},[145,33842,1095],{"class":159},[145,33844,1098],{"class":262},[145,33846,33847],{"class":147,"line":395},[145,33848,33849],{"class":159},"            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n",[145,33851,33852,33855,33857],{"class":147,"line":400},[145,33853,33854],{"class":159},"            \"detailed facial expressions.",[145,33856,1476],{"class":155},[145,33858,5185],{"class":159},[145,33860,33861,33863,33865],{"class":147,"line":415},[145,33862,33362],{"class":159},[145,33864,11918],{"class":155},[145,33866,5185],{"class":159},[145,33868,33869,33872,33874],{"class":147,"line":432},[145,33870,33871],{"class":159},"            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).",[145,33873,1476],{"class":155},[145,33875,5185],{"class":159},[145,33877,33878],{"class":147,"line":437},[145,33879,33880],{"class":159},"            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n",[145,33882,33883],{"class":147,"line":448},[145,33884,33885],{"class":159},"            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n",[145,33887,33888,33891,33893],{"class":147,"line":472},[145,33889,33890],{"class":159},"            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.",[145,33892,11918],{"class":155},[145,33894,5185],{"class":159},[145,33896,33897,33900,33902],{"class":147,"line":483},[145,33898,33899],{"class":159},"            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).",[145,33901,1476],{"class":155},[145,33903,5185],{"class":159},[145,33905,33906],{"class":147,"line":489},[145,33907,33908],{"class":159},"            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n",[145,33910,33911],{"class":147,"line":494},[145,33912,33913],{"class":159},"            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n",[145,33915,33916],{"class":147,"line":499},[145,33917,33918],{"class":159},"            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n",[145,33920,33921,33924,33926],{"class":147,"line":519},[145,33922,33923],{"class":159},"            \"Every micro-expression is clearly animated.",[145,33925,11918],{"class":155},[145,33927,5185],{"class":159},[145,33929,33930,33933,33935],{"class":147,"line":525},[145,33931,33932],{"class":159},"            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).",[145,33934,1476],{"class":155},[145,33936,5185],{"class":159},[145,33938,33939],{"class":147,"line":536},[145,33940,33941],{"class":159},"            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n",[145,33943,33944],{"class":147,"line":541},[145,33945,33946],{"class":159},"            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n",[145,33948,33949,33952,33954],{"class":147,"line":552},[145,33950,33951],{"class":159},"            \"the window behind her. Camera holds on her peaceful, radiant expression.",[145,33953,11918],{"class":155},[145,33955,5185],{"class":159},[145,33957,33958],{"class":147,"line":563},[145,33959,33960],{"class":159},"            \"Consistent anime character design. Detailed emotional facial animation. \"\n",[145,33962,33963],{"class":147,"line":590},[145,33964,33965],{"class":159},"            \"Natural lighting transitions.\"\n",[145,33967,33968],{"class":147,"line":602},[145,33969,1122],{"class":262},[145,33971,33972,33974,33976,33978],{"class":147,"line":608},[145,33973,1128],{"class":159},[145,33975,454],{"class":262},[145,33977,16205],{"class":155},[145,33979,469],{"class":262},[145,33981,33982,33984,33986],{"class":147,"line":614},[145,33983,1145],{"class":159},[145,33985,454],{"class":262},[145,33987,32602],{"class":159},[145,33989,33990],{"class":147,"line":625},[145,33991,1192],{"class":262},[145,33993,33994],{"class":147,"line":630},[145,33995,392],{"class":262},[145,33997,33998],{"class":147,"line":647},[145,33999,33505],{"class":174},[92,34001,34003],{"id":34002},"plantillas-de-prompts-de-imagen-a-video","Plantillas de prompts de imagen a video",[32208,34005,34007],{"id":34006},"i1-comercial-de-producto-auriculares-premium","I1: Comercial de producto — Auriculares premium",[11,34009,34010,34012,34013,34015,34016,1580],{},[23,34011,33267],{}," Transforma una foto de producto en un comercial premium con exhibicion dinamica de colores e iluminacion de calidad de estudio, usando ",[28,34014,2722],{}," como primer fotograma. Para mas flujos de trabajo de video de producto, incluyendo generacion en lote, consulta nuestro ",[37,34017,34018],{"href":3196},"tutorial de imagen a video",[56,34020,60,34021],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34022],{"src":18233,"type":65},[136,34024,34026],{"className":326,"code":34025,"language":328,"meta":141,"style":141},"# I1: Comercial de producto — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,34027,34028,34033,34041,34053,34075,34083,34093,34104,34110,34119,34128,34137,34142,34147,34156,34161,34166,34175,34180,34185,34194,34199,34208,34213,34218,34222,34232,34240,34244,34248],{"__ignoreMap":141},[145,34029,34030],{"class":147,"line":148},[145,34031,34032],{"class":174},"# I1: Comercial de producto — usa la configuracion del primer ejemplo\n",[145,34034,34035,34037,34039],{"class":147,"line":166},[145,34036,6332],{"class":262},[145,34038,266],{"class":258},[145,34040,1219],{"class":262},[145,34042,34043,34045,34047,34049,34051],{"class":147,"line":178},[145,34044,6341],{"class":258},[145,34046,466],{"class":159},[145,34048,571],{"class":155},[145,34050,1232],{"class":159},[145,34052,469],{"class":262},[145,34054,34055,34057,34059,34061,34063,34065,34067,34069,34071,34073],{"class":147,"line":187},[145,34056,6354],{"class":593},[145,34058,266],{"class":258},[145,34060,577],{"class":262},[145,34062,31356],{"class":159},[145,34064,454],{"class":262},[145,34066,457],{"class":258},[145,34068,460],{"class":159},[145,34070,463],{"class":155},[145,34072,466],{"class":159},[145,34074,19393],{"class":262},[145,34076,34077,34079,34081],{"class":147,"line":360},[145,34078,6365],{"class":593},[145,34080,266],{"class":258},[145,34082,1678],{"class":262},[145,34084,34085,34087,34089,34091],{"class":147,"line":366},[145,34086,1078],{"class":159},[145,34088,454],{"class":262},[145,34090,1083],{"class":159},[145,34092,469],{"class":262},[145,34094,34095,34097,34099,34102],{"class":147,"line":378},[145,34096,2503],{"class":159},[145,34098,10632],{"class":262},[145,34100,34101],{"class":159},"\"https://example.com/premium_headphones.jpg\"",[145,34103,10638],{"class":262},[145,34105,34106,34108],{"class":147,"line":395},[145,34107,1095],{"class":159},[145,34109,1098],{"class":262},[145,34111,34112,34115,34117],{"class":147,"line":400},[145,34113,34114],{"class":159},"            \"@Image1 as first frame.",[145,34116,1476],{"class":155},[145,34118,5185],{"class":159},[145,34120,34121,34124,34126],{"class":147,"line":415},[145,34122,34123],{"class":159},"            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.",[145,34125,1476],{"class":155},[145,34127,5185],{"class":159},[145,34129,34130,34133,34135],{"class":147,"line":432},[145,34131,34132],{"class":159},"            \"【Duration】15 seconds",[145,34134,11918],{"class":155},[145,34136,5185],{"class":159},[145,34138,34139],{"class":147,"line":437},[145,34140,34141],{"class":159},"            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n",[145,34143,34144],{"class":147,"line":448},[145,34145,34146],{"class":159},"            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n",[145,34148,34149,34152,34154],{"class":147,"line":472},[145,34150,34151],{"class":159},"            \"texture and premium finish. Voiceover: 'Sound that moves you.'",[145,34153,11918],{"class":155},[145,34155,5185],{"class":159},[145,34157,34158],{"class":147,"line":483},[145,34159,34160],{"class":159},"            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n",[145,34162,34163],{"class":147,"line":489},[145,34164,34165],{"class":159},"            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n",[145,34167,34168,34171,34173],{"class":147,"line":494},[145,34169,34170],{"class":159},"            \"highlights on the metal surface.",[145,34172,11918],{"class":155},[145,34174,5185],{"class":159},[145,34176,34177],{"class":147,"line":499},[145,34178,34179],{"class":159},"            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n",[145,34181,34182],{"class":147,"line":519},[145,34183,34184],{"class":159},"            \"artist in creative studio, athlete training — each wearing different colored \"\n",[145,34186,34187,34190,34192],{"class":147,"line":525},[145,34188,34189],{"class":159},"            \"headphones that match their aesthetic.",[145,34191,11918],{"class":155},[145,34193,5185],{"class":159},[145,34195,34196],{"class":147,"line":536},[145,34197,34198],{"class":159},"            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n",[145,34200,34201,34204,34206],{"class":147,"line":541},[145,34202,34203],{"class":159},"            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.",[145,34205,11918],{"class":155},[145,34207,5185],{"class":159},[145,34209,34210],{"class":147,"line":552},[145,34211,34212],{"class":159},"            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n",[145,34214,34215],{"class":147,"line":563},[145,34216,34217],{"class":159},"            \"lighting. Clean, premium aesthetic throughout.\"\n",[145,34219,34220],{"class":147,"line":590},[145,34221,1122],{"class":262},[145,34223,34224,34226,34228,34230],{"class":147,"line":602},[145,34225,1128],{"class":159},[145,34227,454],{"class":262},[145,34229,3721],{"class":155},[145,34231,469],{"class":262},[145,34233,34234,34236,34238],{"class":147,"line":608},[145,34235,1145],{"class":159},[145,34237,454],{"class":262},[145,34239,32602],{"class":159},[145,34241,34242],{"class":147,"line":614},[145,34243,1192],{"class":262},[145,34245,34246],{"class":147,"line":625},[145,34247,392],{"class":262},[145,34249,34250],{"class":147,"line":630},[145,34251,33505],{"class":174},[32208,34253,34255],{"id":34254},"i2-animacion-de-personaje-la-aventura-del-cafe-de-la-dama-pintada","I2: Animacion de personaje — La aventura del cafe de la dama pintada",[11,34257,34258,34260,34261,34263],{},[23,34259,33267],{}," Da vida a un personaje pintado en una encantadora escena de robo de cafe, demostrando como ",[28,34262,2722],{}," preserva la apariencia del personaje a traves de momentos narrativos magicos.",[56,34265,60,34266],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34267],{"src":18593,"type":65},[136,34269,34271],{"className":326,"code":34270,"language":328,"meta":141,"style":141},"# I2: Animacion de personaje — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,34272,34273,34278,34286,34298,34320,34328,34338,34349,34355,34364,34373,34381,34390,34395,34400,34405,34414,34423,34428,34433,34442,34451,34456,34461,34470,34479,34484,34489,34498,34503,34508,34512,34522,34530,34534,34538],{"__ignoreMap":141},[145,34274,34275],{"class":147,"line":148},[145,34276,34277],{"class":174},"# I2: Animacion de personaje — usa la configuracion del primer ejemplo\n",[145,34279,34280,34282,34284],{"class":147,"line":166},[145,34281,6332],{"class":262},[145,34283,266],{"class":258},[145,34285,1219],{"class":262},[145,34287,34288,34290,34292,34294,34296],{"class":147,"line":178},[145,34289,6341],{"class":258},[145,34291,466],{"class":159},[145,34293,571],{"class":155},[145,34295,1232],{"class":159},[145,34297,469],{"class":262},[145,34299,34300,34302,34304,34306,34308,34310,34312,34314,34316,34318],{"class":147,"line":187},[145,34301,6354],{"class":593},[145,34303,266],{"class":258},[145,34305,577],{"class":262},[145,34307,31356],{"class":159},[145,34309,454],{"class":262},[145,34311,457],{"class":258},[145,34313,460],{"class":159},[145,34315,463],{"class":155},[145,34317,466],{"class":159},[145,34319,19393],{"class":262},[145,34321,34322,34324,34326],{"class":147,"line":360},[145,34323,6365],{"class":593},[145,34325,266],{"class":258},[145,34327,1678],{"class":262},[145,34329,34330,34332,34334,34336],{"class":147,"line":366},[145,34331,1078],{"class":159},[145,34333,454],{"class":262},[145,34335,1083],{"class":159},[145,34337,469],{"class":262},[145,34339,34340,34342,34344,34347],{"class":147,"line":378},[145,34341,2503],{"class":159},[145,34343,10632],{"class":262},[145,34345,34346],{"class":159},"\"https://example.com/painted_noblewoman.jpg\"",[145,34348,10638],{"class":262},[145,34350,34351,34353],{"class":147,"line":395},[145,34352,1095],{"class":159},[145,34354,1098],{"class":262},[145,34356,34357,34360,34362],{"class":147,"line":400},[145,34358,34359],{"class":159},"            \"@Image1 as character reference.",[145,34361,1476],{"class":155},[145,34363,5185],{"class":159},[145,34365,34366,34369,34371],{"class":147,"line":415},[145,34367,34368],{"class":159},"            \"【Style】Cinematic realism with magical elements, warm practical lighting.",[145,34370,1476],{"class":155},[145,34372,5185],{"class":159},[145,34374,34375,34377,34379],{"class":147,"line":432},[145,34376,34132],{"class":159},[145,34378,11918],{"class":155},[145,34380,5185],{"class":159},[145,34382,34383,34386,34388],{"class":147,"line":437},[145,34384,34385],{"class":159},"            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).",[145,34387,1476],{"class":155},[145,34389,5185],{"class":159},[145,34391,34392],{"class":147,"line":448},[145,34393,34394],{"class":159},"            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n",[145,34396,34397],{"class":147,"line":472},[145,34398,34399],{"class":159},"            \"left and right nervously. Her painted hand animates and pushes forward through \"\n",[145,34401,34402],{"class":147,"line":483},[145,34403,34404],{"class":159},"            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n",[145,34406,34407,34410,34412],{"class":147,"line":489},[145,34408,34409],{"class":159},"            \"cup sitting on the table in front of the frame.",[145,34411,11918],{"class":155},[145,34413,5185],{"class":159},[145,34415,34416,34419,34421],{"class":147,"line":494},[145,34417,34418],{"class":159},"            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).",[145,34420,1476],{"class":155},[145,34422,5185],{"class":159},[145,34424,34425],{"class":147,"line":499},[145,34426,34427],{"class":159},"            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n",[145,34429,34430],{"class":147,"line":519},[145,34431,34432],{"class":159},"            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n",[145,34434,34435,34438,34440],{"class":147,"line":525},[145,34436,34437],{"class":159},"            \"gallery lighting.",[145,34439,11918],{"class":155},[145,34441,5185],{"class":159},[145,34443,34444,34447,34449],{"class":147,"line":536},[145,34445,34446],{"class":159},"            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).",[145,34448,1476],{"class":155},[145,34450,5185],{"class":159},[145,34452,34453],{"class":147,"line":541},[145,34454,34455],{"class":159},"            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n",[145,34457,34458],{"class":147,"line":552},[145,34459,34460],{"class":159},"            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n",[145,34462,34463,34466,34468],{"class":147,"line":563},[145,34464,34465],{"class":159},"            \"The woman freezes back into painting pose.",[145,34467,11918],{"class":155},[145,34469,5185],{"class":159},[145,34471,34472,34475,34477],{"class":147,"line":590},[145,34473,34474],{"class":159},"            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).",[145,34476,1476],{"class":155},[145,34478,5185],{"class":159},[145,34480,34481],{"class":147,"line":602},[145,34482,34483],{"class":159},"            \"Camera pushes forward as the scene fades to a pure black background with a \"\n",[145,34485,34486],{"class":147,"line":608},[145,34487,34488],{"class":159},"            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n",[145,34490,34491,34494,34496],{"class":147,"line":614},[145,34492,34493],{"class":159},"            \"bottom: 'Good coffee is worth the wait.'",[145,34495,11918],{"class":155},[145,34497,5185],{"class":159},[145,34499,34500],{"class":147,"line":625},[145,34501,34502],{"class":159},"            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n",[145,34504,34505],{"class":147,"line":630},[145,34506,34507],{"class":159},"            \"painted and living states. Realistic coffee physics.\"\n",[145,34509,34510],{"class":147,"line":647},[145,34511,1122],{"class":262},[145,34513,34514,34516,34518,34520],{"class":147,"line":668},[145,34515,1128],{"class":159},[145,34517,454],{"class":262},[145,34519,3721],{"class":155},[145,34521,469],{"class":262},[145,34523,34524,34526,34528],{"class":147,"line":688},[145,34525,1145],{"class":159},[145,34527,454],{"class":262},[145,34529,32602],{"class":159},[145,34531,34532],{"class":147,"line":693},[145,34533,1192],{"class":262},[145,34535,34536],{"class":147,"line":738},[145,34537,392],{"class":262},[145,34539,34540],{"class":147,"line":743},[145,34541,33505],{"class":174},[32208,34543,34545],{"id":34544},"i3-transferencia-de-estilo-de-realista-a-pintura-de-tinta-china","I3: Transferencia de estilo — De realista a pintura de tinta china",[11,34547,34548,34550,34551,34553],{},[23,34549,33267],{}," Transforma una fotografia realista de paisaje en una pintura tradicional china de tinta viva (水墨画), demostrando la transferencia de estilo con ",[28,34552,2722],{}," como referencia de composicion de escena.",[56,34555,60,34556],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34557],{"src":24957,"type":65},[136,34559,34561],{"className":326,"code":34560,"language":328,"meta":141,"style":141},"# I3: Transferencia de estilo — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,34562,34563,34568,34576,34588,34610,34618,34628,34639,34645,34654,34663,34671,34680,34685,34690,34699,34708,34713,34718,34727,34736,34741,34746,34755,34760,34765,34769,34779,34787,34791,34795],{"__ignoreMap":141},[145,34564,34565],{"class":147,"line":148},[145,34566,34567],{"class":174},"# I3: Transferencia de estilo — usa la configuracion del primer ejemplo\n",[145,34569,34570,34572,34574],{"class":147,"line":166},[145,34571,6332],{"class":262},[145,34573,266],{"class":258},[145,34575,1219],{"class":262},[145,34577,34578,34580,34582,34584,34586],{"class":147,"line":178},[145,34579,6341],{"class":258},[145,34581,466],{"class":159},[145,34583,571],{"class":155},[145,34585,1232],{"class":159},[145,34587,469],{"class":262},[145,34589,34590,34592,34594,34596,34598,34600,34602,34604,34606,34608],{"class":147,"line":187},[145,34591,6354],{"class":593},[145,34593,266],{"class":258},[145,34595,577],{"class":262},[145,34597,31356],{"class":159},[145,34599,454],{"class":262},[145,34601,457],{"class":258},[145,34603,460],{"class":159},[145,34605,463],{"class":155},[145,34607,466],{"class":159},[145,34609,19393],{"class":262},[145,34611,34612,34614,34616],{"class":147,"line":360},[145,34613,6365],{"class":593},[145,34615,266],{"class":258},[145,34617,1678],{"class":262},[145,34619,34620,34622,34624,34626],{"class":147,"line":366},[145,34621,1078],{"class":159},[145,34623,454],{"class":262},[145,34625,1083],{"class":159},[145,34627,469],{"class":262},[145,34629,34630,34632,34634,34637],{"class":147,"line":378},[145,34631,2503],{"class":159},[145,34633,10632],{"class":262},[145,34635,34636],{"class":159},"\"https://example.com/realistic_landscape.jpg\"",[145,34638,10638],{"class":262},[145,34640,34641,34643],{"class":147,"line":395},[145,34642,1095],{"class":159},[145,34644,1098],{"class":262},[145,34646,34647,34650,34652],{"class":147,"line":400},[145,34648,34649],{"class":159},"            \"@Image1 as scene composition reference.",[145,34651,1476],{"class":155},[145,34653,5185],{"class":159},[145,34655,34656,34659,34661],{"class":147,"line":415},[145,34657,34658],{"class":159},"            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.",[145,34660,1476],{"class":155},[145,34662,5185],{"class":159},[145,34664,34665,34667,34669],{"class":147,"line":432},[145,34666,33362],{"class":159},[145,34668,11918],{"class":155},[145,34670,5185],{"class":159},[145,34672,34673,34676,34678],{"class":147,"line":437},[145,34674,34675],{"class":159},"            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).",[145,34677,1476],{"class":155},[145,34679,5185],{"class":159},[145,34681,34682],{"class":147,"line":448},[145,34683,34684],{"class":159},"            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n",[145,34686,34687],{"class":147,"line":472},[145,34688,34689],{"class":159},"            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n",[145,34691,34692,34695,34697],{"class":147,"line":483},[145,34693,34694],{"class":159},"            \"fade as traditional ink wash aesthetics take over.",[145,34696,11918],{"class":155},[145,34698,5185],{"class":159},[145,34700,34701,34704,34706],{"class":147,"line":489},[145,34702,34703],{"class":159},"            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).",[145,34705,1476],{"class":155},[145,34707,5185],{"class":159},[145,34709,34710],{"class":147,"line":494},[145,34711,34712],{"class":159},"            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n",[145,34714,34715],{"class":147,"line":499},[145,34716,34717],{"class":159},"            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n",[145,34719,34720,34723,34725],{"class":147,"line":519},[145,34721,34722],{"class":159},"            \"trails across the sky. Water effects spread ink at mountain bases.",[145,34724,11918],{"class":155},[145,34726,5185],{"class":159},[145,34728,34729,34732,34734],{"class":147,"line":525},[145,34730,34731],{"class":159},"            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).",[145,34733,1476],{"class":155},[145,34735,5185],{"class":159},[145,34737,34738],{"class":147,"line":536},[145,34739,34740],{"class":159},"            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n",[145,34742,34743],{"class":147,"line":541},[145,34744,34745],{"class":159},"            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n",[145,34747,34748,34751,34753],{"class":147,"line":552},[145,34749,34750],{"class":159},"            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.",[145,34752,11918],{"class":155},[145,34754,5185],{"class":159},[145,34756,34757],{"class":147,"line":563},[145,34758,34759],{"class":159},"            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n",[145,34761,34762],{"class":147,"line":590},[145,34763,34764],{"class":159},"            \"No photorealism. Pure traditional ink wash aesthetic.\"\n",[145,34766,34767],{"class":147,"line":602},[145,34768,1122],{"class":262},[145,34770,34771,34773,34775,34777],{"class":147,"line":608},[145,34772,1128],{"class":159},[145,34774,454],{"class":262},[145,34776,16205],{"class":155},[145,34778,469],{"class":262},[145,34780,34781,34783,34785],{"class":147,"line":614},[145,34782,1145],{"class":159},[145,34784,454],{"class":262},[145,34786,32602],{"class":159},[145,34788,34789],{"class":147,"line":625},[145,34790,1192],{"class":262},[145,34792,34793],{"class":147,"line":630},[145,34794,392],{"class":262},[145,34796,34797],{"class":147,"line":647},[145,34798,33505],{"class":174},[32208,34800,34802],{"id":34801},"i4-narrativa-multi-imagen-en-una-sola-toma-parkour-urbano","I4: Narrativa multi-imagen en una sola toma — Parkour urbano",[11,34804,34805,34807,34808,1580],{},[23,34806,33267],{}," Conecta sin interrupciones multiples imagenes de locaciones en una toma de seguimiento continua de un corredor de parkour, creando un epico viaje urbano usando el formato de guion de tomas para una sincronizacion precisa. Esta tecnica se basa en los patrones de ",[37,34809,34810],{"href":3672},"replicacion de movimiento de camara",[56,34812,60,34813],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34814],{"src":12051,"type":65},[136,34816,34818],{"className":326,"code":34817,"language":328,"meta":141,"style":141},"# I4: Narrativa multi-imagen en una sola toma — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,34819,34820,34825,34833,34845,34867,34875,34885,34891,34898,34905,34912,34919,34924,34928,34934,34939,34944,34949,34954,34963,34972,34980,34989,34994,34999,35008,35017,35022,35027,35036,35045,35050,35055,35064,35073,35078,35087,35096,35101,35106,35115,35120,35125,35129,35139,35147,35151,35155],{"__ignoreMap":141},[145,34821,34822],{"class":147,"line":148},[145,34823,34824],{"class":174},"# I4: Narrativa multi-imagen en una sola toma — usa la configuracion del primer ejemplo\n",[145,34826,34827,34829,34831],{"class":147,"line":166},[145,34828,6332],{"class":262},[145,34830,266],{"class":258},[145,34832,1219],{"class":262},[145,34834,34835,34837,34839,34841,34843],{"class":147,"line":178},[145,34836,6341],{"class":258},[145,34838,466],{"class":159},[145,34840,571],{"class":155},[145,34842,1232],{"class":159},[145,34844,469],{"class":262},[145,34846,34847,34849,34851,34853,34855,34857,34859,34861,34863,34865],{"class":147,"line":187},[145,34848,6354],{"class":593},[145,34850,266],{"class":258},[145,34852,577],{"class":262},[145,34854,31356],{"class":159},[145,34856,454],{"class":262},[145,34858,457],{"class":258},[145,34860,460],{"class":159},[145,34862,463],{"class":155},[145,34864,466],{"class":159},[145,34866,19393],{"class":262},[145,34868,34869,34871,34873],{"class":147,"line":360},[145,34870,6365],{"class":593},[145,34872,266],{"class":258},[145,34874,1678],{"class":262},[145,34876,34877,34879,34881,34883],{"class":147,"line":366},[145,34878,1078],{"class":159},[145,34880,454],{"class":262},[145,34882,1083],{"class":159},[145,34884,469],{"class":262},[145,34886,34887,34889],{"class":147,"line":378},[145,34888,2503],{"class":159},[145,34890,2506],{"class":262},[145,34892,34893,34896],{"class":147,"line":395},[145,34894,34895],{"class":159},"            \"https://example.com/city_street.jpg\"",[145,34897,469],{"class":262},[145,34899,34900,34903],{"class":147,"line":400},[145,34901,34902],{"class":159},"            \"https://example.com/staircase.jpg\"",[145,34904,469],{"class":262},[145,34906,34907,34910],{"class":147,"line":415},[145,34908,34909],{"class":159},"            \"https://example.com/pedestrian_bridge.jpg\"",[145,34911,469],{"class":262},[145,34913,34914,34917],{"class":147,"line":432},[145,34915,34916],{"class":159},"            \"https://example.com/rooftop_building.jpg\"",[145,34918,469],{"class":262},[145,34920,34921],{"class":147,"line":437},[145,34922,34923],{"class":159},"            \"https://example.com/city_skyline.jpg\"\n",[145,34925,34926],{"class":147,"line":448},[145,34927,2516],{"class":262},[145,34929,34930,34932],{"class":147,"line":472},[145,34931,1095],{"class":159},[145,34933,1098],{"class":262},[145,34935,34936],{"class":147,"line":483},[145,34937,34938],{"class":159},"            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n",[145,34940,34941],{"class":147,"line":489},[145,34942,34943],{"class":159},"            \"following a parkour runner sprinting through city streets leaping up staircases \"\n",[145,34945,34946],{"class":147,"line":494},[145,34947,34948],{"class":159},"            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n",[145,34950,34951],{"class":147,"line":499},[145,34952,34953],{"class":159},"            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n",[145,34955,34956,34959,34961],{"class":147,"line":519},[145,34957,34958],{"class":159},"            \"the frame. Dynamic powerful full of freedom and energy.",[145,34960,1476],{"class":155},[145,34962,5185],{"class":159},[145,34964,34965,34968,34970],{"class":147,"line":525},[145,34966,34967],{"class":159},"            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.",[145,34969,1476],{"class":155},[145,34971,5185],{"class":159},[145,34973,34974,34976,34978],{"class":147,"line":536},[145,34975,34132],{"class":159},[145,34977,11918],{"class":155},[145,34979,5185],{"class":159},[145,34981,34982,34985,34987],{"class":147,"line":541},[145,34983,34984],{"class":159},"            \"[00:00-00:03] Urban Sprint (@Image1 as environment).",[145,34986,1476],{"class":155},[145,34988,5185],{"class":159},[145,34990,34991],{"class":147,"line":552},[145,34992,34993],{"class":159},"            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n",[145,34995,34996],{"class":147,"line":563},[145,34997,34998],{"class":159},"            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n",[145,35000,35001,35004,35006],{"class":147,"line":590},[145,35002,35003],{"class":159},"            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.",[145,35005,11918],{"class":155},[145,35007,5185],{"class":159},[145,35009,35010,35013,35015],{"class":147,"line":602},[145,35011,35012],{"class":159},"            \"[00:03-00:06] Staircase Vault (@Image2 as environment).",[145,35014,1476],{"class":155},[145,35016,5185],{"class":159},[145,35018,35019],{"class":147,"line":608},[145,35020,35021],{"class":159},"            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n",[145,35023,35024],{"class":147,"line":614},[145,35025,35026],{"class":159},"            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n",[145,35028,35029,35032,35034],{"class":147,"line":625},[145,35030,35031],{"class":159},"            \"architectural details sharp in focus.",[145,35033,11918],{"class":155},[145,35035,5185],{"class":159},[145,35037,35038,35041,35043],{"class":147,"line":630},[145,35039,35040],{"class":159},"            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).",[145,35042,1476],{"class":155},[145,35044,5185],{"class":159},[145,35046,35047],{"class":147,"line":647},[145,35048,35049],{"class":159},"            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n",[145,35051,35052],{"class":147,"line":668},[145,35053,35054],{"class":159},"            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n",[145,35056,35057,35060,35062],{"class":147,"line":688},[145,35058,35059],{"class":159},"            \"the runner's clothing.",[145,35061,11918],{"class":155},[145,35063,5185],{"class":159},[145,35065,35066,35069,35071],{"class":147,"line":693},[145,35067,35068],{"class":159},"            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).",[145,35070,1476],{"class":155},[145,35072,5185],{"class":159},[145,35074,35075],{"class":147,"line":738},[145,35076,35077],{"class":159},"            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n",[145,35079,35080,35083,35085],{"class":147,"line":743},[145,35081,35082],{"class":159},"            \"to follow the vertical movement. Urban landscape spreads out below.",[145,35084,11918],{"class":155},[145,35086,5185],{"class":159},[145,35088,35089,35092,35094],{"class":147,"line":760},[145,35090,35091],{"class":159},"            \"[00:12-00:15] Victory Moment (@Image5 as environment).",[145,35093,1476],{"class":155},[145,35095,5185],{"class":159},[145,35097,35098],{"class":147,"line":769},[145,35099,35100],{"class":159},"            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n",[145,35102,35103],{"class":147,"line":784},[145,35104,35105],{"class":159},"            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n",[145,35107,35108,35111,35113],{"class":147,"line":810},[145,35109,35110],{"class":159},"            \"reveal the epic scale of the journey completed.",[145,35112,11918],{"class":155},[145,35114,5185],{"class":159},[145,35116,35117],{"class":147,"line":837},[145,35118,35119],{"class":159},"            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n",[145,35121,35122],{"class":147,"line":842},[145,35123,35124],{"class":159},"            \"Realistic parkour physics. Golden hour lighting throughout.\"\n",[145,35126,35127],{"class":147,"line":848},[145,35128,1122],{"class":262},[145,35130,35131,35133,35135,35137],{"class":147,"line":853},[145,35132,1128],{"class":159},[145,35134,454],{"class":262},[145,35136,3721],{"class":155},[145,35138,469],{"class":262},[145,35140,35141,35143,35145],{"class":147,"line":858},[145,35142,1145],{"class":159},[145,35144,454],{"class":262},[145,35146,32602],{"class":159},[145,35148,35149],{"class":147,"line":869},[145,35150,1192],{"class":262},[145,35152,35153],{"class":147,"line":875},[145,35154,392],{"class":262},[145,35156,35157],{"class":147,"line":900},[145,35158,33505],{"class":174},[92,35160,35162],{"id":35161},"plantillas-multimodales-con-tag","Plantillas multimodales con @Tag",[32208,35164,35166],{"id":35165},"m1-replicacion-avanzada-de-movimiento-de-camara-exploracion-de-mazmorra-de-cristal","M1: Replicacion avanzada de movimiento de camara — Exploracion de mazmorra de cristal",[11,35168,35169,35171,35172,1580],{},[23,35170,33267],{}," Replica con precision movimientos de camara complejos de un video de referencia aplicandolos a contenido fantastico completamente nuevo con multiples referencias de imagen. Aprende el flujo de trabajo completo de replicacion de camara en nuestra ",[37,35173,35174],{"href":3672},"guia dedicada de movimiento de camara",[56,35176,60,35177],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35178],{"src":35179,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%B0%B4%E6%99%B6%E6%8E%A2%E9%99%A9.mp4",[136,35181,35183],{"className":326,"code":35182,"language":328,"meta":141,"style":141},"# M1: Replicacion de movimiento de camara — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,35184,35185,35190,35198,35210,35232,35240,35250,35256,35263,35270,35277,35282,35286,35297,35303,35308,35313,35318,35323,35332,35341,35350,35359,35364,35369,35378,35387,35392,35397,35406,35415,35420,35425,35434,35439,35444,35448,35458,35466,35470,35474],{"__ignoreMap":141},[145,35186,35187],{"class":147,"line":148},[145,35188,35189],{"class":174},"# M1: Replicacion de movimiento de camara — usa la configuracion del primer ejemplo\n",[145,35191,35192,35194,35196],{"class":147,"line":166},[145,35193,6332],{"class":262},[145,35195,266],{"class":258},[145,35197,1219],{"class":262},[145,35199,35200,35202,35204,35206,35208],{"class":147,"line":178},[145,35201,6341],{"class":258},[145,35203,466],{"class":159},[145,35205,571],{"class":155},[145,35207,1232],{"class":159},[145,35209,469],{"class":262},[145,35211,35212,35214,35216,35218,35220,35222,35224,35226,35228,35230],{"class":147,"line":187},[145,35213,6354],{"class":593},[145,35215,266],{"class":258},[145,35217,577],{"class":262},[145,35219,31356],{"class":159},[145,35221,454],{"class":262},[145,35223,457],{"class":258},[145,35225,460],{"class":159},[145,35227,463],{"class":155},[145,35229,466],{"class":159},[145,35231,19393],{"class":262},[145,35233,35234,35236,35238],{"class":147,"line":360},[145,35235,6365],{"class":593},[145,35237,266],{"class":258},[145,35239,1678],{"class":262},[145,35241,35242,35244,35246,35248],{"class":147,"line":366},[145,35243,1078],{"class":159},[145,35245,454],{"class":262},[145,35247,1083],{"class":159},[145,35249,469],{"class":262},[145,35251,35252,35254],{"class":147,"line":378},[145,35253,2503],{"class":159},[145,35255,2506],{"class":262},[145,35257,35258,35261],{"class":147,"line":395},[145,35259,35260],{"class":159},"            \"https://example.com/dungeon_entrance.png\"",[145,35262,469],{"class":262},[145,35264,35265,35268],{"class":147,"line":400},[145,35266,35267],{"class":159},"            \"https://example.com/crystal_ceiling.png\"",[145,35269,469],{"class":262},[145,35271,35272,35275],{"class":147,"line":415},[145,35273,35274],{"class":159},"            \"https://example.com/left_passage.png\"",[145,35276,469],{"class":262},[145,35278,35279],{"class":147,"line":432},[145,35280,35281],{"class":159},"            \"https://example.com/right_chamber.png\"\n",[145,35283,35284],{"class":147,"line":437},[145,35285,2516],{"class":262},[145,35287,35288,35290,35292,35295],{"class":147,"line":448},[145,35289,11954],{"class":159},[145,35291,10632],{"class":262},[145,35293,35294],{"class":159},"\"https://example.com/camera_movement_ref.mp4\"",[145,35296,10638],{"class":262},[145,35298,35299,35301],{"class":147,"line":472},[145,35300,1095],{"class":159},[145,35302,1098],{"class":262},[145,35304,35305],{"class":147,"line":483},[145,35306,35307],{"class":159},"            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n",[145,35309,35310],{"class":147,"line":489},[145,35311,35312],{"class":159},"            \"Reference @Video1 camera movement style exactly. The scene above references \"\n",[145,35314,35315],{"class":147,"line":494},[145,35316,35317],{"class":159},"            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n",[145,35319,35320],{"class":147,"line":499},[145,35321,35322],{"class":159},"            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n",[145,35324,35325,35328,35330],{"class":147,"line":519},[145,35326,35327],{"class":159},"            \"flickers across stone walls, casting dancing shadows.",[145,35329,1476],{"class":155},[145,35331,5185],{"class":159},[145,35333,35334,35337,35339],{"class":147,"line":525},[145,35335,35336],{"class":159},"            \"【Style】Fantasy adventure, realistic lighting, atmospheric.",[145,35338,1476],{"class":155},[145,35340,5185],{"class":159},[145,35342,35343,35346,35348],{"class":147,"line":536},[145,35344,35345],{"class":159},"            \"【Duration】9 seconds",[145,35347,11918],{"class":155},[145,35349,5185],{"class":159},[145,35351,35352,35355,35357],{"class":147,"line":541},[145,35353,35354],{"class":159},"            \"[00:00-00:03] Entrance Discovery.",[145,35356,1476],{"class":155},[145,35358,5185],{"class":159},[145,35360,35361],{"class":147,"line":552},[145,35362,35363],{"class":159},"            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n",[145,35365,35366],{"class":147,"line":563},[145,35367,35368],{"class":159},"            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n",[145,35370,35371,35374,35376],{"class":147,"line":590},[145,35372,35373],{"class":159},"            \"motion with subtle tilts to examine details.",[145,35375,11918],{"class":155},[145,35377,5185],{"class":159},[145,35379,35380,35383,35385],{"class":147,"line":602},[145,35381,35382],{"class":159},"            \"[00:03-00:06] Chamber Exploration.",[145,35384,1476],{"class":155},[145,35386,5185],{"class":159},[145,35388,35389],{"class":147,"line":608},[145,35390,35391],{"class":159},"            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n",[145,35393,35394],{"class":147,"line":614},[145,35395,35396],{"class":159},"            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n",[145,35398,35399,35402,35404],{"class":147,"line":625},[145,35400,35401],{"class":159},"            \"light creates dynamic shadows on dungeon walls.",[145,35403,11918],{"class":155},[145,35405,5185],{"class":159},[145,35407,35408,35411,35413],{"class":147,"line":630},[145,35409,35410],{"class":159},"            \"[00:06-00:09] Final Discovery.",[145,35412,1476],{"class":155},[145,35414,5185],{"class":159},[145,35416,35417],{"class":147,"line":647},[145,35418,35419],{"class":159},"            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n",[145,35421,35422],{"class":147,"line":668},[145,35423,35424],{"class":159},"            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n",[145,35426,35427,35430,35432],{"class":147,"line":688},[145,35428,35429],{"class":159},"            \"Golden light from treasures mingles with lantern glow.",[145,35431,11918],{"class":155},[145,35433,5185],{"class":159},[145,35435,35436],{"class":147,"line":693},[145,35437,35438],{"class":159},"            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n",[145,35440,35441],{"class":147,"line":738},[145,35442,35443],{"class":159},"            \"and shadow casting. Atmospheric dungeon ambiance.\"\n",[145,35445,35446],{"class":147,"line":743},[145,35447,1122],{"class":262},[145,35449,35450,35452,35454,35456],{"class":147,"line":760},[145,35451,1128],{"class":159},[145,35453,454],{"class":262},[145,35455,30427],{"class":155},[145,35457,469],{"class":262},[145,35459,35460,35462,35464],{"class":147,"line":769},[145,35461,1145],{"class":159},[145,35463,454],{"class":262},[145,35465,32602],{"class":159},[145,35467,35468],{"class":147,"line":784},[145,35469,1192],{"class":262},[145,35471,35472],{"class":147,"line":810},[145,35473,392],{"class":262},[145,35475,35476],{"class":147,"line":837},[145,35477,33505],{"class":174},[32208,35479,35481],{"id":35480},"m2-sincronizacion-de-personaje-movimiento-de-camara-actuacion-de-danza-en-escenario","M2: Sincronizacion de personaje + movimiento de camara — Actuacion de danza en escenario",[11,35483,35484,35486],{},[23,35485,33267],{}," Combina la referencia de personaje de una imagen con el movimiento de camara y la coreografia de danza de una referencia de video, creando arte de actuacion sincronizada.",[56,35488,60,35489],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35490],{"src":35491,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%A5%B3%E7%94%9F%E8%B7%B3%E8%88%9E.mp4",[136,35493,35495],{"className":326,"code":35494,"language":328,"meta":141,"style":141},"# M2: Sincronizacion de personaje + camara — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,35496,35497,35502,35510,35522,35544,35552,35562,35573,35584,35590,35595,35600,35605,35614,35623,35631,35640,35645,35650,35659,35668,35673,35678,35687,35696,35701,35706,35715,35720,35725,35729,35739,35747,35751,35755],{"__ignoreMap":141},[145,35498,35499],{"class":147,"line":148},[145,35500,35501],{"class":174},"# M2: Sincronizacion de personaje + camara — usa la configuracion del primer ejemplo\n",[145,35503,35504,35506,35508],{"class":147,"line":166},[145,35505,6332],{"class":262},[145,35507,266],{"class":258},[145,35509,1219],{"class":262},[145,35511,35512,35514,35516,35518,35520],{"class":147,"line":178},[145,35513,6341],{"class":258},[145,35515,466],{"class":159},[145,35517,571],{"class":155},[145,35519,1232],{"class":159},[145,35521,469],{"class":262},[145,35523,35524,35526,35528,35530,35532,35534,35536,35538,35540,35542],{"class":147,"line":187},[145,35525,6354],{"class":593},[145,35527,266],{"class":258},[145,35529,577],{"class":262},[145,35531,31356],{"class":159},[145,35533,454],{"class":262},[145,35535,457],{"class":258},[145,35537,460],{"class":159},[145,35539,463],{"class":155},[145,35541,466],{"class":159},[145,35543,19393],{"class":262},[145,35545,35546,35548,35550],{"class":147,"line":360},[145,35547,6365],{"class":593},[145,35549,266],{"class":258},[145,35551,1678],{"class":262},[145,35553,35554,35556,35558,35560],{"class":147,"line":366},[145,35555,1078],{"class":159},[145,35557,454],{"class":262},[145,35559,1083],{"class":159},[145,35561,469],{"class":262},[145,35563,35564,35566,35568,35571],{"class":147,"line":378},[145,35565,2503],{"class":159},[145,35567,10632],{"class":262},[145,35569,35570],{"class":159},"\"https://example.com/stage_dancer.png\"",[145,35572,10638],{"class":262},[145,35574,35575,35577,35579,35582],{"class":147,"line":395},[145,35576,11954],{"class":159},[145,35578,10632],{"class":262},[145,35580,35581],{"class":159},"\"https://example.com/dance_movement_ref.mp4\"",[145,35583,10638],{"class":262},[145,35585,35586,35588],{"class":147,"line":400},[145,35587,1095],{"class":159},[145,35589,1098],{"class":262},[145,35591,35592],{"class":147,"line":415},[145,35593,35594],{"class":159},"            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n",[145,35596,35597],{"class":147,"line":432},[145,35598,35599],{"class":159},"            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n",[145,35601,35602],{"class":147,"line":437},[145,35603,35604],{"class":159},"            \"references @Video1 dance moves. Performing energetically on a colorful \"\n",[145,35606,35607,35610,35612],{"class":147,"line":448},[145,35608,35609],{"class":159},"            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.",[145,35611,1476],{"class":155},[145,35613,5185],{"class":159},[145,35615,35616,35619,35621],{"class":147,"line":472},[145,35617,35618],{"class":159},"            \"【Style】Concert performance, dynamic stage lighting, high energy.",[145,35620,1476],{"class":155},[145,35622,5185],{"class":159},[145,35624,35625,35627,35629],{"class":147,"line":483},[145,35626,33362],{"class":159},[145,35628,11918],{"class":155},[145,35630,5185],{"class":159},[145,35632,35633,35636,35638],{"class":147,"line":489},[145,35634,35635],{"class":159},"            \"[00:00-00:04] Opening Sequence.",[145,35637,1476],{"class":155},[145,35639,5185],{"class":159},[145,35641,35642],{"class":147,"line":494},[145,35643,35644],{"class":159},"            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n",[145,35646,35647],{"class":147,"line":499},[145,35648,35649],{"class":159},"            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n",[145,35651,35652,35655,35657],{"class":147,"line":519},[145,35653,35654],{"class":159},"            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.",[145,35656,11918],{"class":155},[145,35658,5185],{"class":159},[145,35660,35661,35664,35666],{"class":147,"line":525},[145,35662,35663],{"class":159},"            \"[00:04-00:08] Dynamic Performance.",[145,35665,1476],{"class":155},[145,35667,5185],{"class":159},[145,35669,35670],{"class":147,"line":536},[145,35671,35672],{"class":159},"            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n",[145,35674,35675],{"class":147,"line":541},[145,35676,35677],{"class":159},"            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n",[145,35679,35680,35683,35685],{"class":147,"line":552},[145,35681,35682],{"class":159},"            \"colored lighting, creating atmospheric depth.",[145,35684,11918],{"class":155},[145,35686,5185],{"class":159},[145,35688,35689,35692,35694],{"class":147,"line":563},[145,35690,35691],{"class":159},"            \"[00:08-00:12] Finale Moment.",[145,35693,1476],{"class":155},[145,35695,5185],{"class":159},[145,35697,35698],{"class":147,"line":590},[145,35699,35700],{"class":159},"            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n",[145,35702,35703],{"class":147,"line":602},[145,35704,35705],{"class":159},"            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n",[145,35707,35708,35711,35713],{"class":147,"line":608},[145,35709,35710],{"class":159},"            \"Sparkle effects cascade down around the performer.",[145,35712,11918],{"class":155},[145,35714,5185],{"class":159},[145,35716,35717],{"class":147,"line":614},[145,35718,35719],{"class":159},"            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n",[145,35721,35722],{"class":147,"line":625},[145,35723,35724],{"class":159},"            \"choreography timing from @Video1. Professional stage lighting effects.\"\n",[145,35726,35727],{"class":147,"line":630},[145,35728,1122],{"class":262},[145,35730,35731,35733,35735,35737],{"class":147,"line":647},[145,35732,1128],{"class":159},[145,35734,454],{"class":262},[145,35736,16205],{"class":155},[145,35738,469],{"class":262},[145,35740,35741,35743,35745],{"class":147,"line":668},[145,35742,1145],{"class":159},[145,35744,454],{"class":262},[145,35746,32602],{"class":159},[145,35748,35749],{"class":147,"line":688},[145,35750,1192],{"class":262},[145,35752,35753],{"class":147,"line":693},[145,35754,392],{"class":262},[145,35756,35757],{"class":147,"line":738},[145,35758,33505],{"class":174},[32208,35760,35762],{"id":35761},"m3-escena-de-persecucion-figura-misteriosa-con-abrigo-rojo","M3: Escena de persecucion — Figura misteriosa con abrigo rojo",[11,35764,35765,35767],{},[23,35766,33267],{}," Crea una intensa secuencia de persecucion por calles urbanas con una figura misteriosa con abrigo rojo, demostrando cinematografia de thriller y construccion de tension dramatica.",[56,35769,60,35770],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35771],{"src":25799,"type":65},[136,35773,35775],{"className":326,"code":35774,"language":328,"meta":141,"style":141},"# M3: Escena de persecucion — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,35776,35777,35782,35790,35802,35824,35832,35842,35853,35859,35868,35877,35885,35894,35899,35904,35909,35918,35927,35932,35937,35946,35955,35960,35965,35970,35979,35984,35989,35994,35998,36008,36016,36020,36024],{"__ignoreMap":141},[145,35778,35779],{"class":147,"line":148},[145,35780,35781],{"class":174},"# M3: Escena de persecucion — usa la configuracion del primer ejemplo\n",[145,35783,35784,35786,35788],{"class":147,"line":166},[145,35785,6332],{"class":262},[145,35787,266],{"class":258},[145,35789,1219],{"class":262},[145,35791,35792,35794,35796,35798,35800],{"class":147,"line":178},[145,35793,6341],{"class":258},[145,35795,466],{"class":159},[145,35797,571],{"class":155},[145,35799,1232],{"class":159},[145,35801,469],{"class":262},[145,35803,35804,35806,35808,35810,35812,35814,35816,35818,35820,35822],{"class":147,"line":187},[145,35805,6354],{"class":593},[145,35807,266],{"class":258},[145,35809,577],{"class":262},[145,35811,31356],{"class":159},[145,35813,454],{"class":262},[145,35815,457],{"class":258},[145,35817,460],{"class":159},[145,35819,463],{"class":155},[145,35821,466],{"class":159},[145,35823,19393],{"class":262},[145,35825,35826,35828,35830],{"class":147,"line":360},[145,35827,6365],{"class":593},[145,35829,266],{"class":258},[145,35831,1678],{"class":262},[145,35833,35834,35836,35838,35840],{"class":147,"line":366},[145,35835,1078],{"class":159},[145,35837,454],{"class":262},[145,35839,1083],{"class":159},[145,35841,469],{"class":262},[145,35843,35844,35846,35848,35851],{"class":147,"line":378},[145,35845,2503],{"class":159},[145,35847,10632],{"class":262},[145,35849,35850],{"class":159},"\"https://example.com/red_coat_figure.jpg\"",[145,35852,10638],{"class":262},[145,35854,35855,35857],{"class":147,"line":395},[145,35856,1095],{"class":159},[145,35858,1098],{"class":262},[145,35860,35861,35864,35866],{"class":147,"line":400},[145,35862,35863],{"class":159},"            \"@Image1 as character reference — mysterious figure in distinctive red coat.",[145,35865,1476],{"class":155},[145,35867,5185],{"class":159},[145,35869,35870,35873,35875],{"class":147,"line":415},[145,35871,35872],{"class":159},"            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.",[145,35874,1476],{"class":155},[145,35876,5185],{"class":159},[145,35878,35879,35881,35883],{"class":147,"line":432},[145,35880,33362],{"class":159},[145,35882,11918],{"class":155},[145,35884,5185],{"class":159},[145,35886,35887,35890,35892],{"class":147,"line":437},[145,35888,35889],{"class":159},"            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).",[145,35891,1476],{"class":155},[145,35893,5185],{"class":159},[145,35895,35896],{"class":147,"line":448},[145,35897,35898],{"class":159},"            \"The red-coated figure sprints through narrow city alleyways at night. \"\n",[145,35900,35901],{"class":147,"line":472},[145,35902,35903],{"class":159},"            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n",[145,35905,35906],{"class":147,"line":483},[145,35907,35908],{"class":159},"            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n",[145,35910,35911,35914,35916],{"class":147,"line":489},[145,35912,35913],{"class":159},"            \"Tension-building audio undertones.",[145,35915,11918],{"class":155},[145,35917,5185],{"class":159},[145,35919,35920,35923,35925],{"class":147,"line":494},[145,35921,35922],{"class":159},"            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).",[145,35924,1476],{"class":155},[145,35926,5185],{"class":159},[145,35928,35929],{"class":147,"line":499},[145,35930,35931],{"class":159},"            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n",[145,35933,35934],{"class":147,"line":519},[145,35935,35936],{"class":159},"            \"follows from the side, maintaining speed. Red coat stands out against the \"\n",[145,35938,35939,35942,35944],{"class":147,"line":525},[145,35940,35941],{"class":159},"            \"monochrome urban environment. Breathing is audible and labored.",[145,35943,11918],{"class":155},[145,35945,5185],{"class":159},[145,35947,35948,35951,35953],{"class":147,"line":536},[145,35949,35950],{"class":159},"            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).",[145,35952,1476],{"class":155},[145,35954,5185],{"class":159},[145,35956,35957],{"class":147,"line":541},[145,35958,35959],{"class":159},"            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n",[145,35961,35962],{"class":147,"line":552},[145,35963,35964],{"class":159},"            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n",[145,35966,35967],{"class":147,"line":563},[145,35968,35969],{"class":159},"            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n",[145,35971,35972,35975,35977],{"class":147,"line":590},[145,35973,35974],{"class":159},"            \"the figure disappears into the night.",[145,35976,11918],{"class":155},[145,35978,5185],{"class":159},[145,35980,35981],{"class":147,"line":602},[145,35982,35983],{"class":159},"            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n",[145,35985,35986],{"class":147,"line":608},[145,35987,35988],{"class":159},"            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n",[145,35990,35991],{"class":147,"line":614},[145,35992,35993],{"class":159},"            \"preserved throughout.\"\n",[145,35995,35996],{"class":147,"line":625},[145,35997,1122],{"class":262},[145,35999,36000,36002,36004,36006],{"class":147,"line":630},[145,36001,1128],{"class":159},[145,36003,454],{"class":262},[145,36005,16205],{"class":155},[145,36007,469],{"class":262},[145,36009,36010,36012,36014],{"class":147,"line":647},[145,36011,1145],{"class":159},[145,36013,454],{"class":262},[145,36015,32602],{"class":159},[145,36017,36018],{"class":147,"line":668},[145,36019,1192],{"class":262},[145,36021,36022],{"class":147,"line":688},[145,36023,392],{"class":262},[145,36025,36026],{"class":147,"line":693},[145,36027,33505],{"class":174},[32208,36029,36031],{"id":36030},"extra-escena-de-persecucion-multitudinaria-en-la-calle","Extra: Escena de persecucion multitudinaria en la calle",[11,36033,36034,36036],{},[23,36035,33267],{}," Un ejemplo adicional que muestra una escena de multitud corriendo, perfecta para secuencias de accion que requieren multiples personajes y energia urbana.",[56,36038,60,36039],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,36040],{"src":36041,"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",[136,36043,36045],{"className":326,"code":36044,"language":328,"meta":141,"style":141},"# Bonus: Escena de persecucion multitudinaria — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,36046,36047,36052,36060,36072,36094,36102,36112,36123,36129,36138,36147,36156,36165,36170,36175,36184,36193,36198,36203,36212,36221,36226,36231,36240,36245,36250,36254,36264,36272,36276,36280],{"__ignoreMap":141},[145,36048,36049],{"class":147,"line":148},[145,36050,36051],{"class":174},"# Bonus: Escena de persecucion multitudinaria — usa la configuracion del primer ejemplo\n",[145,36053,36054,36056,36058],{"class":147,"line":166},[145,36055,6332],{"class":262},[145,36057,266],{"class":258},[145,36059,1219],{"class":262},[145,36061,36062,36064,36066,36068,36070],{"class":147,"line":178},[145,36063,6341],{"class":258},[145,36065,466],{"class":159},[145,36067,571],{"class":155},[145,36069,1232],{"class":159},[145,36071,469],{"class":262},[145,36073,36074,36076,36078,36080,36082,36084,36086,36088,36090,36092],{"class":147,"line":187},[145,36075,6354],{"class":593},[145,36077,266],{"class":258},[145,36079,577],{"class":262},[145,36081,31356],{"class":159},[145,36083,454],{"class":262},[145,36085,457],{"class":258},[145,36087,460],{"class":159},[145,36089,463],{"class":155},[145,36091,466],{"class":159},[145,36093,19393],{"class":262},[145,36095,36096,36098,36100],{"class":147,"line":360},[145,36097,6365],{"class":593},[145,36099,266],{"class":258},[145,36101,1678],{"class":262},[145,36103,36104,36106,36108,36110],{"class":147,"line":366},[145,36105,1078],{"class":159},[145,36107,454],{"class":262},[145,36109,1083],{"class":159},[145,36111,469],{"class":262},[145,36113,36114,36116,36118,36121],{"class":147,"line":378},[145,36115,2503],{"class":159},[145,36117,10632],{"class":262},[145,36119,36120],{"class":159},"\"https://example.com/street_crowd.jpg\"",[145,36122,10638],{"class":262},[145,36124,36125,36127],{"class":147,"line":395},[145,36126,1095],{"class":159},[145,36128,1098],{"class":262},[145,36130,36131,36134,36136],{"class":147,"line":400},[145,36132,36133],{"class":159},"            \"@Image1 as scene reference for crowd composition and urban environment.",[145,36135,1476],{"class":155},[145,36137,5185],{"class":159},[145,36139,36140,36143,36145],{"class":147,"line":415},[145,36141,36142],{"class":159},"            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.",[145,36144,1476],{"class":155},[145,36146,5185],{"class":159},[145,36148,36149,36152,36154],{"class":147,"line":432},[145,36150,36151],{"class":159},"            \"【Duration】8 seconds",[145,36153,11918],{"class":155},[145,36155,5185],{"class":159},[145,36157,36158,36161,36163],{"class":147,"line":437},[145,36159,36160],{"class":159},"            \"[00:00-00:03] Mass Movement Begins.",[145,36162,1476],{"class":155},[145,36164,5185],{"class":159},[145,36166,36167],{"class":147,"line":448},[145,36168,36169],{"class":159},"            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n",[145,36171,36172],{"class":147,"line":472},[145,36173,36174],{"class":159},"            \"is handheld, in the middle of the action. Multiple individuals in different \"\n",[145,36176,36177,36180,36182],{"class":147,"line":483},[145,36178,36179],{"class":159},"            \"clothing all moving in the same direction with urgent purpose.",[145,36181,11918],{"class":155},[145,36183,5185],{"class":159},[145,36185,36186,36189,36191],{"class":147,"line":489},[145,36187,36188],{"class":159},"            \"[00:03-00:06] Chaos and Urgency.",[145,36190,1476],{"class":155},[145,36192,5185],{"class":159},[145,36194,36195],{"class":147,"line":494},[145,36196,36197],{"class":159},"            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n",[145,36199,36200],{"class":147,"line":499},[145,36201,36202],{"class":159},"            \"flying hair, scattered personal items. People help each other maintain \"\n",[145,36204,36205,36208,36210],{"class":147,"line":519},[145,36206,36207],{"class":159},"            \"pace. Urban storefronts blur past in the background.",[145,36209,11918],{"class":155},[145,36211,5185],{"class":159},[145,36213,36214,36217,36219],{"class":147,"line":525},[145,36215,36216],{"class":159},"            \"[00:06-00:08] Dispersal.",[145,36218,1476],{"class":155},[145,36220,5185],{"class":159},[145,36222,36223],{"class":147,"line":536},[145,36224,36225],{"class":159},"            \"The crowd reaches an intersection and scatters in different directions. \"\n",[145,36227,36228],{"class":147,"line":541},[145,36229,36230],{"class":159},"            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n",[145,36232,36233,36236,36238],{"class":147,"line":552},[145,36234,36235],{"class":159},"            \"as people disappear down various streets.",[145,36237,11918],{"class":155},[145,36239,5185],{"class":159},[145,36241,36242],{"class":147,"line":563},[145,36243,36244],{"class":159},"            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n",[145,36246,36247],{"class":147,"line":590},[145,36248,36249],{"class":159},"            \"for authenticity. Urban street environment based on @Image1.\"\n",[145,36251,36252],{"class":147,"line":602},[145,36253,1122],{"class":262},[145,36255,36256,36258,36260,36262],{"class":147,"line":608},[145,36257,1128],{"class":159},[145,36259,454],{"class":262},[145,36261,3513],{"class":155},[145,36263,469],{"class":262},[145,36265,36266,36268,36270],{"class":147,"line":614},[145,36267,1145],{"class":159},[145,36269,454],{"class":262},[145,36271,32602],{"class":159},[145,36273,36274],{"class":147,"line":625},[145,36275,1192],{"class":262},[145,36277,36278],{"class":147,"line":630},[145,36279,392],{"class":262},[145,36281,36282],{"class":147,"line":647},[145,36283,33505],{"class":174},[92,36285,36287],{"id":36286},"plantillas-de-extension-de-video","Plantillas de extension de video",[32208,36289,36291],{"id":36290},"e1-extension-hacia-adelante-con-final-de-marca","E1: Extension hacia adelante con final de marca",[11,36293,36294,36296],{},[23,36295,33267],{}," Extiende un video existente anadiendo nuevas escenas y una conclusion profesional de marca con logotipo y eslogan.",[136,36298,36300],{"className":326,"code":36299,"language":328,"meta":141,"style":141},"# E1: Extension hacia adelante — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,36301,36302,36307,36315,36327,36349,36357,36367,36378,36384,36393,36402,36411,36416,36421,36426,36431,36436,36440,36450,36458,36462,36466],{"__ignoreMap":141},[145,36303,36304],{"class":147,"line":148},[145,36305,36306],{"class":174},"# E1: Extension hacia adelante — usa la configuracion del primer ejemplo\n",[145,36308,36309,36311,36313],{"class":147,"line":166},[145,36310,6332],{"class":262},[145,36312,266],{"class":258},[145,36314,1219],{"class":262},[145,36316,36317,36319,36321,36323,36325],{"class":147,"line":178},[145,36318,6341],{"class":258},[145,36320,466],{"class":159},[145,36322,571],{"class":155},[145,36324,1232],{"class":159},[145,36326,469],{"class":262},[145,36328,36329,36331,36333,36335,36337,36339,36341,36343,36345,36347],{"class":147,"line":187},[145,36330,6354],{"class":593},[145,36332,266],{"class":258},[145,36334,577],{"class":262},[145,36336,31356],{"class":159},[145,36338,454],{"class":262},[145,36340,457],{"class":258},[145,36342,460],{"class":159},[145,36344,463],{"class":155},[145,36346,466],{"class":159},[145,36348,19393],{"class":262},[145,36350,36351,36353,36355],{"class":147,"line":360},[145,36352,6365],{"class":593},[145,36354,266],{"class":258},[145,36356,1678],{"class":262},[145,36358,36359,36361,36363,36365],{"class":147,"line":366},[145,36360,1078],{"class":159},[145,36362,454],{"class":262},[145,36364,1083],{"class":159},[145,36366,469],{"class":262},[145,36368,36369,36371,36373,36376],{"class":147,"line":378},[145,36370,11954],{"class":159},[145,36372,10632],{"class":262},[145,36374,36375],{"class":159},"\"https://example.com/existing_video.mp4\"",[145,36377,10638],{"class":262},[145,36379,36380,36382],{"class":147,"line":395},[145,36381,1095],{"class":159},[145,36383,1098],{"class":262},[145,36385,36386,36389,36391],{"class":147,"line":400},[145,36387,36388],{"class":159},"            \"Extend @Video1 forward with 8 additional seconds.",[145,36390,1476],{"class":155},[145,36392,5185],{"class":159},[145,36394,36395,36398,36400],{"class":147,"line":415},[145,36396,36397],{"class":159},"            \"【Style】Match @Video1 style exactly.",[145,36399,1476],{"class":155},[145,36401,5185],{"class":159},[145,36403,36404,36407,36409],{"class":147,"line":432},[145,36405,36406],{"class":159},"            \"【Duration】8 seconds extension",[145,36408,11918],{"class":155},[145,36410,5185],{"class":159},[145,36412,36413],{"class":147,"line":437},[145,36414,36415],{"class":159},"            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n",[145,36417,36418],{"class":147,"line":448},[145,36419,36420],{"class":159},"            \"Show the product being used in natural environment with satisfied users. \"\n",[145,36422,36423],{"class":147,"line":472},[145,36424,36425],{"class":159},"            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n",[145,36427,36428],{"class":147,"line":483},[145,36429,36430],{"class":159},"            \"Maintain consistent lighting and color grading throughout. \"\n",[145,36432,36433],{"class":147,"line":489},[145,36434,36435],{"class":159},"            \"Smooth transition from original content to extension.\"\n",[145,36437,36438],{"class":147,"line":494},[145,36439,1122],{"class":262},[145,36441,36442,36444,36446,36448],{"class":147,"line":499},[145,36443,1128],{"class":159},[145,36445,454],{"class":262},[145,36447,3513],{"class":155},[145,36449,469],{"class":262},[145,36451,36452,36454,36456],{"class":147,"line":519},[145,36453,1145],{"class":159},[145,36455,454],{"class":262},[145,36457,32602],{"class":159},[145,36459,36460],{"class":147,"line":525},[145,36461,1192],{"class":262},[145,36463,36464],{"class":147,"line":536},[145,36465,392],{"class":262},[145,36467,36468],{"class":147,"line":541},[145,36469,33505],{"class":174},[32208,36471,36473],{"id":36472},"e2-extension-hacia-atras-con-historia-previa","E2: Extension hacia atras con historia previa",[11,36475,36476,36478],{},[23,36477,33267],{}," Anade contexto y preparacion antes del contenido de video existente, creando una narrativa mas completa.",[136,36480,36482],{"className":326,"code":36481,"language":328,"meta":141,"style":141},"# E2: Extension hacia atras — usa la configuracion del primer ejemplo\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# Sondear con el mismo bucle while del primer ejemplo\n",[28,36483,36484,36489,36497,36509,36531,36539,36549,36560,36566,36575,36584,36593,36598,36603,36608,36613,36618,36622,36632,36640,36644,36648],{"__ignoreMap":141},[145,36485,36486],{"class":147,"line":148},[145,36487,36488],{"class":174},"# E2: Extension hacia atras — usa la configuracion del primer ejemplo\n",[145,36490,36491,36493,36495],{"class":147,"line":166},[145,36492,6332],{"class":262},[145,36494,266],{"class":258},[145,36496,1219],{"class":262},[145,36498,36499,36501,36503,36505,36507],{"class":147,"line":178},[145,36500,6341],{"class":258},[145,36502,466],{"class":159},[145,36504,571],{"class":155},[145,36506,1232],{"class":159},[145,36508,469],{"class":262},[145,36510,36511,36513,36515,36517,36519,36521,36523,36525,36527,36529],{"class":147,"line":187},[145,36512,6354],{"class":593},[145,36514,266],{"class":258},[145,36516,577],{"class":262},[145,36518,31356],{"class":159},[145,36520,454],{"class":262},[145,36522,457],{"class":258},[145,36524,460],{"class":159},[145,36526,463],{"class":155},[145,36528,466],{"class":159},[145,36530,19393],{"class":262},[145,36532,36533,36535,36537],{"class":147,"line":360},[145,36534,6365],{"class":593},[145,36536,266],{"class":258},[145,36538,1678],{"class":262},[145,36540,36541,36543,36545,36547],{"class":147,"line":366},[145,36542,1078],{"class":159},[145,36544,454],{"class":262},[145,36546,1083],{"class":159},[145,36548,469],{"class":262},[145,36550,36551,36553,36555,36558],{"class":147,"line":378},[145,36552,11954],{"class":159},[145,36554,10632],{"class":262},[145,36556,36557],{"class":159},"\"https://example.com/main_video.mp4\"",[145,36559,10638],{"class":262},[145,36561,36562,36564],{"class":147,"line":395},[145,36563,1095],{"class":159},[145,36565,1098],{"class":262},[145,36567,36568,36571,36573],{"class":147,"line":400},[145,36569,36570],{"class":159},"            \"Create 6 seconds of backstory before @Video1 begins.",[145,36572,1476],{"class":155},[145,36574,5185],{"class":159},[145,36576,36577,36580,36582],{"class":147,"line":415},[145,36578,36579],{"class":159},"            \"【Style】Match @Video1 visual style exactly.",[145,36581,1476],{"class":155},[145,36583,5185],{"class":159},[145,36585,36586,36589,36591],{"class":147,"line":432},[145,36587,36588],{"class":159},"            \"【Duration】6 seconds extension",[145,36590,11918],{"class":155},[145,36592,5185],{"class":159},[145,36594,36595],{"class":147,"line":437},[145,36596,36597],{"class":159},"            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n",[145,36599,36600],{"class":147,"line":448},[145,36601,36602],{"class":159},"            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n",[145,36604,36605],{"class":147,"line":472},[145,36606,36607],{"class":159},"            \"Match the visual style, lighting, and character appearances exactly. \"\n",[145,36609,36610],{"class":147,"line":483},[145,36611,36612],{"class":159},"            \"Create narrative tension that builds toward the existing video's opening moment. \"\n",[145,36614,36615],{"class":147,"line":489},[145,36616,36617],{"class":159},"            \"Seamless transition into original content.\"\n",[145,36619,36620],{"class":147,"line":494},[145,36621,1122],{"class":262},[145,36623,36624,36626,36628,36630],{"class":147,"line":499},[145,36625,1128],{"class":159},[145,36627,454],{"class":262},[145,36629,33179],{"class":155},[145,36631,469],{"class":262},[145,36633,36634,36636,36638],{"class":147,"line":519},[145,36635,1145],{"class":159},[145,36637,454],{"class":262},[145,36639,32602],{"class":159},[145,36641,36642],{"class":147,"line":525},[145,36643,1192],{"class":262},[145,36645,36646],{"class":147,"line":536},[145,36647,392],{"class":262},[145,36649,36650],{"class":147,"line":541},[145,36651,33505],{"class":174},[18,36653,36654],{},[11,36655,36656],{},[37,36657,36659],{"href":211,"rel":36658},[41],"Ejecuta estas plantillas avanzadas con tu clave API de EvoLink. Registrate gratis ->",[45,36661],{},[48,36663,36665],{"id":36664},"errores-comunes-en-prompts-de-seedance-y-como-corregirlos","Errores comunes en prompts de Seedance y como corregirlos",[1849,36667,36668,36684],{},[1852,36669,36670],{},[1855,36671,36672,36675,36678,36681],{},[1858,36673,36674],{},"#",[1858,36676,36677],{},"Error",[1858,36679,36680],{},"Por que falla",[1858,36682,36683],{},"Solucion",[1865,36685,36686,36702,36721,36743,36759,36775,36791,36807,36823,36839],{},[1855,36687,36688,36690,36696,36699],{},[1870,36689,5256],{},[1870,36691,36692,36695],{},[23,36693,36694],{},"Demasiado vago"," — \"Un video bonito de un perro\"",[1870,36697,36698],{},"El modelo adivina la raza, la accion, la camara y el estilo",[1870,36700,36701],{},"\"Un golden retriever atrapa un frisbee en el aire, angulo lateral en camara lenta, parque, soleado\"",[1855,36703,36704,36706,36715,36718],{},[1870,36705,5237],{},[1870,36707,36708,36711,36712,36714],{},[23,36709,36710],{},"Numeracion incorrecta de @tag"," — Usar ",[28,36713,2735],{}," cuando solo se subieron 2 imagenes",[1870,36716,36717],{},"La etiqueta hace referencia a un archivo inexistente; la generacion falla o lo ignora",[1870,36719,36720],{},"Verifica el orden de carga; las etiquetas comienzan en 1 e incrementan por tipo",[1855,36722,36723,36725,36731,36734],{},[1870,36724,4874],{},[1870,36726,36727,36730],{},[23,36728,36729],{},"Sin restricciones"," — No se especifica duracion ni resolucion",[1870,36732,36733],{},"Los valores predeterminados del modelo pueden no coincidir con tus necesidades",[1870,36735,36736,36737,2774,36739,36742],{},"Especifica siempre ",[28,36738,1587],{},[28,36740,36741],{},"resolution"," tanto en el texto del prompt como en los parametros de la API",[1855,36744,36745,36747,36753,36756],{},[1870,36746,3814],{},[1870,36748,36749,36752],{},[23,36750,36751],{},"Modalidades en conflicto"," — La imagen muestra el dia, el prompt dice \"escena de noche oscura\"",[1870,36754,36755],{},"El modelo recibe senales contradictorias y produce iluminacion inconsistente",[1870,36757,36758],{},"Alinea las descripciones del prompt con el contenido de referencia",[1855,36760,36761,36763,36769,36772],{},[1870,36762,1133],{},[1870,36764,36765,36768],{},[23,36766,36767],{},"Prompt sobrecargado"," — Mas de 200 palabras describiendo cada micro-detalle",[1870,36770,36771],{},"El modelo prioriza mal; las instrucciones clave se diluyen",[1870,36773,36774],{},"Manten los prompts por debajo de 150 palabras; usa referencias para detalles visuales en vez de texto",[1855,36776,36777,36779,36785,36788],{},[1870,36778,33179],{},[1870,36780,36781,36784],{},[23,36782,36783],{},"Sin direccion de camara"," — El prompt describe la escena pero no como se mueve la camara",[1870,36786,36787],{},"Resultado estatico o con movimiento aleatorio",[1870,36789,36790],{},"Anade instrucciones explicitas de camara: \"dolly-in lento\" o \"plano general estatico\"",[1855,36792,36793,36795,36801,36804],{},[1870,36794,33211],{},[1870,36796,36797,36800],{},[23,36798,36799],{},"Subida de rostros realistas"," — Subir fotos de rostros humanos reales",[1870,36802,36803],{},"Bloqueado por filtros de cumplimiento; solicitud rechazada",[1870,36805,36806],{},"Usa referencias de personajes ilustrados, estilizados o no fotorrealistas",[1855,36808,36809,36811,36817,36820],{},[1870,36810,3513],{},[1870,36812,36813,36816],{},[23,36814,36815],{},"Exceder limites de archivos"," — Subir 10 imagenes",[1870,36818,36819],{},"El maximo es 9 imagenes; solicitud rechazada",[1870,36821,36822],{},"Respeta los limites: \u003C=9 imagenes, \u003C=3 videos, \u003C=3 audio, \u003C=12 en total",[1855,36824,36825,36827,36833,36836],{},[1870,36826,30427],{},[1870,36828,36829,36832],{},[23,36830,36831],{},"Sin ancla de estilo"," — Usar un generico \"cinematico\" en lugar de una referencia especifica",[1870,36834,36835],{},"El resultado luce generico y sin enfoque",[1870,36837,36838],{},"Ancla a un director, pelicula o estilo artistico especifico: \"epica de ciencia ficcion de Denis Villeneuve\" o \"postimpresionismo de Van Gogh\"",[1855,36840,36841,36843,36849,36852],{},[1870,36842,513],{},[1870,36844,36845,36848],{},[23,36846,36847],{},"Sin codigos de tiempo"," — Escribir prosa en lugar de guiones de tomas estructurados",[1870,36850,36851],{},"Las acciones se distribuyen de forma impredecible a lo largo de la duracion",[1870,36853,36854,36855,36857],{},"Usa codigos de tiempo ",[28,36856,32185],{}," para controlar exactamente cuando ocurre cada accion",[11,36859,36860,36861,1580],{},"Para patrones detallados de manejo de errores y logica de reintentos, consulta la ",[37,36862,36863],{"href":14180},"documentacion de la API",[45,36865],{},[48,36867,36869],{"id":36868},"mejores-practicas-de-ingenieria-de-prompts-para-desarrolladores-de-api","Mejores practicas de ingenieria de prompts para desarrolladores de API",[92,36871,36873],{"id":36872},"crear-plantillas-de-prompts-para-generacion-en-lote","Crear plantillas de prompts para generacion en lote",[11,36875,36876],{},"Al generar videos a escala, define plantillas de prompts reutilizables con variables:",[136,36878,36880],{"className":326,"code":36879,"language":328,"meta":141,"style":141},"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,36881,36882,36891,36900,36910,36925,36930,36945,36950,36959,36970,36979,36990,36994,36998,37003,37011,37024,37045,37057,37069,37082,37101,37112,37123,37127,37131,37142,37160],{"__ignoreMap":141},[145,36883,36884,36887,36889],{"class":147,"line":148},[145,36885,36886],{"class":155},"PRODUCT_TEMPLATE",[145,36888,372],{"class":258},[145,36890,19499],{"class":262},[145,36892,36893,36896,36898],{"class":147,"line":166},[145,36894,36895],{"class":159},"    \"@Image1 as first frame.",[145,36897,1476],{"class":155},[145,36899,5185],{"class":159},[145,36901,36902,36905,36908],{"class":147,"line":178},[145,36903,36904],{"class":159},"    \"【Style】",[145,36906,36907],{"class":155},"{style}\\n",[145,36909,5185],{"class":159},[145,36911,36912,36915,36918,36921,36923],{"class":147,"line":187},[145,36913,36914],{"class":159},"    \"【Duration】",[145,36916,36917],{"class":155},"{duration}",[145,36919,36920],{"class":159}," seconds",[145,36922,11918],{"class":155},[145,36924,5185],{"class":159},[145,36926,36927],{"class":147,"line":360},[145,36928,36929],{"class":159},"    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n",[145,36931,36932,36935,36938,36941,36943],{"class":147,"line":366},[145,36933,36934],{"class":159},"    \"",[145,36936,36937],{"class":155},"{lighting_description}",[145,36939,36940],{"class":159},". Every texture detail remains razor-sharp.",[145,36942,11918],{"class":155},[145,36944,5185],{"class":159},[145,36946,36947],{"class":147,"line":378},[145,36948,36949],{"class":159},"    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n",[145,36951,36952,36955,36957],{"class":147,"line":395},[145,36953,36954],{"class":159},"    \"to reveal the product's profile.",[145,36956,11918],{"class":155},[145,36958,5185],{"class":159},[145,36960,36961,36964,36967],{"class":147,"line":400},[145,36962,36963],{"class":159},"    \"[00:06-",[145,36965,36966],{"class":155},"{end_tc}",[145,36968,36969],{"class":159},"] Rotation slows to a stop at the most photogenic angle. \"\n",[145,36971,36972,36975,36977],{"class":147,"line":415},[145,36973,36974],{"class":159},"    \"Clean, minimal, premium.",[145,36976,11918],{"class":155},[145,36978,5185],{"class":159},[145,36980,36981,36984,36987],{"class":147,"line":432},[145,36982,36983],{"class":159},"    \"Maintain exact product proportions from @Image1. ",[145,36985,36986],{"class":155},"{background}",[145,36988,36989],{"class":159},". Commercial-grade lighting.\"\n",[145,36991,36992],{"class":147,"line":437},[145,36993,392],{"class":262},[145,36995,36996],{"class":147,"line":448},[145,36997,357],{"emptyLinePlaceholder":58},[145,36999,37000],{"class":147,"line":472},[145,37001,37002],{"class":174},"# Generate multiple product videos\n",[145,37004,37005,37007,37009],{"class":147,"line":483},[145,37006,28702],{"class":262},[145,37008,266],{"class":258},[145,37010,8637],{"class":262},[145,37012,37013,37015,37017,37019,37022],{"class":147,"line":489},[145,37014,19365],{"class":262},[145,37016,21040],{"class":159},[145,37018,454],{"class":262},[145,37020,37021],{"class":159},"\"Clean white infinity cove, premium commercial\"",[145,37023,469],{"class":262},[145,37025,37026,37029,37031,37033,37035,37038,37040,37043],{"class":147,"line":494},[145,37027,37028],{"class":159},"     \"duration\"",[145,37030,454],{"class":262},[145,37032,3513],{"class":155},[145,37034,290],{"class":262},[145,37036,37037],{"class":159},"\"end_tc\"",[145,37039,454],{"class":262},[145,37041,37042],{"class":159},"\"00:08\"",[145,37044,469],{"class":262},[145,37046,37047,37050,37052,37055],{"class":147,"line":499},[145,37048,37049],{"class":159},"     \"lighting_description\"",[145,37051,454],{"class":262},[145,37053,37054],{"class":159},"\"Soft studio lighting creates a gentle gradient\"",[145,37056,469],{"class":262},[145,37058,37059,37062,37064,37067],{"class":147,"line":519},[145,37060,37061],{"class":159},"     \"background\"",[145,37063,454],{"class":262},[145,37065,37066],{"class":159},"\"White background throughout\"",[145,37068,19393],{"class":262},[145,37070,37071,37073,37075,37077,37080],{"class":147,"line":525},[145,37072,19365],{"class":262},[145,37074,21040],{"class":159},[145,37076,454],{"class":262},[145,37078,37079],{"class":159},"\"Warm wooden surface, artisan craft aesthetic\"",[145,37081,469],{"class":262},[145,37083,37084,37086,37088,37090,37092,37094,37096,37099],{"class":147,"line":536},[145,37085,37028],{"class":159},[145,37087,454],{"class":262},[145,37089,513],{"class":155},[145,37091,290],{"class":262},[145,37093,37037],{"class":159},[145,37095,454],{"class":262},[145,37097,37098],{"class":159},"\"00:10\"",[145,37100,469],{"class":262},[145,37102,37103,37105,37107,37110],{"class":147,"line":541},[145,37104,37049],{"class":159},[145,37106,454],{"class":262},[145,37108,37109],{"class":159},"\"Warm golden spotlight from above\"",[145,37111,469],{"class":262},[145,37113,37114,37116,37118,37121],{"class":147,"line":552},[145,37115,37061],{"class":159},[145,37117,454],{"class":262},[145,37119,37120],{"class":159},"\"Natural wood grain texture visible\"",[145,37122,19393],{"class":262},[145,37124,37125],{"class":147,"line":563},[145,37126,644],{"class":262},[145,37128,37129],{"class":147,"line":590},[145,37130,357],{"emptyLinePlaceholder":58},[145,37132,37133,37135,37138,37140],{"class":147,"line":602},[145,37134,7998],{"class":258},[145,37136,37137],{"class":262}," product ",[145,37139,965],{"class":258},[145,37141,28792],{"class":262},[145,37143,37144,37147,37149,37152,37155,37157],{"class":147,"line":608},[145,37145,37146],{"class":262},"    prompt ",[145,37148,266],{"class":258},[145,37150,37151],{"class":155}," PRODUCT_TEMPLATE",[145,37153,37154],{"class":262},".format(",[145,37156,16595],{"class":258},[145,37158,37159],{"class":262},"product)\n",[145,37161,37162],{"class":147,"line":614},[145,37163,37164],{"class":174},"    # Submit to API using the prompt...\n",[11,37166,37167],{},"Este enfoque mantiene los prompts consistentes y facilita las pruebas A/B.",[92,37169,37171],{"id":37170},"usar-el-formato-de-guion-de-tomas-para-escenas-complejas","Usar el formato de guion de tomas para escenas complejas",[11,37173,37174],{},"Para cualquier video de mas de 5 segundos o que involucre multiples acciones, usa el formato de guion de tomas:",[70,37176,37177,37189,37197,37203,37209],{},[73,37178,37179,37182,37183,2774,37186],{},[23,37180,37181],{},"Declara el estilo y la duracion"," al inicio con ",[28,37184,37185],{},"【Style】",[28,37187,37188],{},"【Duration】",[73,37190,37191,37194,37195],{},[23,37192,37193],{},"Divide en segmentos de 3-5 segundos"," con codigos de tiempo ",[28,37196,32185],{},[73,37198,37199,37202],{},[23,37200,37201],{},"Nombra cada toma"," con su funcion: \"Toma 1: La Revelacion\"",[73,37204,37205,37208],{},[23,37206,37207],{},"Anade detalles de fisica"," — describe lo que ocurre fisicamente (salpicaduras de agua, polvo que se eleva) en lugar de conceptos abstractos",[73,37210,37211,37214],{},[23,37212,37213],{},"Termina con restricciones"," — reglas de consistencia, notas de paleta de colores, requisitos de fisica",[92,37216,37218],{"id":37217},"mantener-la-consistencia-del-personaje-entre-generaciones","Mantener la consistencia del personaje entre generaciones",[11,37220,37221],{},"Para mantener el mismo personaje en multiples videos:",[70,37223,37224,37232,37238],{},[73,37225,37226,37229,37230],{},[23,37227,37228],{},"Usa la misma imagen de referencia"," en cada solicitud mediante ",[28,37231,2835],{},[73,37233,37234,37237],{},[23,37235,37236],{},"Incluye descriptores explicitos de apariencia"," en el prompt — \"misma chaqueta roja, cabello negro corto\" — incluso cuando uses una referencia de imagen",[73,37239,37240,37243],{},[23,37241,37242],{},"Genera secuencialmente"," y usa el ultimo fotograma del video N como imagen de primer fotograma para el video N+1",[11,37245,37246,37247,1580],{},"Cubrimos patrones avanzados de consistencia multi-toma — incluyendo generacion en lote y bloqueo de personaje — en la ",[37,37248,37249],{"href":3196},"guia de imagen a video",[92,37251,37253],{"id":37252},"optimizar-costes","Optimizar costes",[11,37255,37256],{},"Las referencias de video aumentan el coste de generacion en comparacion con los prompts de solo texto o solo imagen. Usa este arbol de decisiones:",[97,37258,37259,37264,37270],{},[73,37260,37261,37263],{},[23,37262,30285],{}," — mas economico; usalo cuando necesites escenas genericas o no tengas material de referencia",[73,37265,37266,37269],{},[23,37267,37268],{},"Referencias de imagen"," — coste moderado; usalo para consistencia de personajes/escenas",[73,37271,37272,37275],{},[23,37273,37274],{},"Referencias de video"," — coste mas alto; usalo solo cuando necesites especificamente replicacion de camara o transferencia de movimiento",[18,37277,37278],{},[11,37279,37280,37281,37285],{},"Los precios exactos varian segun la resolucion y la duracion. Consulta los ",[37,37282,22734],{"href":37283,"rel":37284},"https://evolink.ai/#pricing",[41]," para las tarifas actuales (a partir de febrero de 2026).",[92,37287,37289],{"id":37288},"controlar-versiones-de-tus-prompts","Controlar versiones de tus prompts",[11,37291,37292],{},"Trata los prompts como codigo. Almacenalos en control de versiones con metadatos:",[136,37294,37296],{"className":326,"code":37295,"language":328,"meta":141,"style":141},"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,37297,37298,37307,37314,37326,37337,37347,37357,37384,37394,37398],{"__ignoreMap":141},[145,37299,37300,37303,37305],{"class":147,"line":148},[145,37301,37302],{"class":155},"PROMPT_REGISTRY",[145,37304,372],{"class":258},[145,37306,445],{"class":262},[145,37308,37309,37312],{"class":147,"line":166},[145,37310,37311],{"class":159},"    \"product_hero_v3\"",[145,37313,1756],{"class":262},[145,37315,37316,37319,37321,37324],{"class":147,"line":178},[145,37317,37318],{"class":159},"        \"version\"",[145,37320,454],{"class":262},[145,37322,37323],{"class":159},"\"3.0\"",[145,37325,469],{"class":262},[145,37327,37328,37330,37332,37335],{"class":147,"line":187},[145,37329,1095],{"class":159},[145,37331,454],{"class":262},[145,37333,37334],{"class":159},"\"【Style】Clean white infinity cove...\"",[145,37336,469],{"class":262},[145,37338,37339,37341,37343,37345],{"class":147,"line":360},[145,37340,1078],{"class":159},[145,37342,454],{"class":262},[145,37344,1083],{"class":159},[145,37346,469],{"class":262},[145,37348,37349,37351,37353,37355],{"class":147,"line":366},[145,37350,1128],{"class":159},[145,37352,454],{"class":262},[145,37354,513],{"class":155},[145,37356,469],{"class":262},[145,37358,37359,37362,37364,37367,37369,37372,37374,37377,37379,37382],{"class":147,"line":378},[145,37360,37361],{"class":159},"        \"test_results\"",[145,37363,20285],{"class":262},[145,37365,37366],{"class":159},"\"ctr\"",[145,37368,454],{"class":262},[145,37370,37371],{"class":155},"0.24",[145,37373,290],{"class":262},[145,37375,37376],{"class":159},"\"conversion\"",[145,37378,454],{"class":262},[145,37380,37381],{"class":155},"0.087",[145,37383,19393],{"class":262},[145,37385,37386,37389,37391],{"class":147,"line":395},[145,37387,37388],{"class":159},"        \"created\"",[145,37390,454],{"class":262},[145,37392,37393],{"class":159},"\"2026-02-19\"\n",[145,37395,37396],{"class":147,"line":400},[145,37397,1192],{"class":262},[145,37399,37400],{"class":147,"line":415},[145,37401,486],{"class":262},[11,37403,37404],{},"Esto permite hacer pruebas A/B de prompts y revertir a versiones anteriores si es necesario.",[92,37406,37408],{"id":37407},"manejar-fallos-de-generacion-con-elegancia","Manejar fallos de generacion con elegancia",[11,37410,37411],{},"No todos los prompts tienen exito. Construye logica de reintentos con retroceso exponencial:",[136,37413,37415],{"className":326,"code":37414,"language":328,"meta":141,"style":141},"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,37416,37417,37423,37429,37433,37449,37461,37467,37485,37501,37513,37519,37529,37546,37553,37576],{"__ignoreMap":141},[145,37418,37419,37421],{"class":147,"line":148},[145,37420,335],{"class":258},[145,37422,345],{"class":262},[145,37424,37425,37427],{"class":147,"line":166},[145,37426,335],{"class":258},[145,37428,4855],{"class":262},[145,37430,37431],{"class":147,"line":178},[145,37432,357],{"emptyLinePlaceholder":58},[145,37434,37435,37437,37440,37443,37445,37447],{"class":147,"line":187},[145,37436,502],{"class":258},[145,37438,37439],{"class":151}," generate_with_retry",[145,37441,37442],{"class":262},"(prompt_data, max_retries",[145,37444,266],{"class":258},[145,37446,4874],{"class":155},[145,37448,516],{"class":262},[145,37450,37451,37453,37455,37457,37459],{"class":147,"line":360},[145,37452,4938],{"class":258},[145,37454,4941],{"class":262},[145,37456,965],{"class":258},[145,37458,4946],{"class":155},[145,37460,4949],{"class":262},[145,37462,37463,37465],{"class":147,"line":366},[145,37464,4954],{"class":258},[145,37466,412],{"class":262},[145,37468,37469,37471,37473,37475,37477,37479,37481,37483],{"class":147,"line":378},[145,37470,4961],{"class":262},[145,37472,266],{"class":258},[145,37474,26868],{"class":262},[145,37476,457],{"class":258},[145,37478,466],{"class":159},[145,37480,571],{"class":155},[145,37482,1232],{"class":159},[145,37484,469],{"class":262},[145,37486,37487,37490,37492,37495,37497,37499],{"class":147,"line":395},[145,37488,37489],{"class":593},"                                   json",[145,37491,266],{"class":258},[145,37493,37494],{"class":262},"prompt_data, ",[145,37496,17630],{"class":593},[145,37498,266],{"class":258},[145,37500,17635],{"class":262},[145,37502,37503,37505,37507,37509,37511],{"class":147,"line":400},[145,37504,5031],{"class":258},[145,37506,2323],{"class":262},[145,37508,752],{"class":258},[145,37510,2328],{"class":155},[145,37512,412],{"class":262},[145,37514,37515,37517],{"class":147,"line":415},[145,37516,5044],{"class":258},[145,37518,622],{"class":262},[145,37520,37521,37523,37525,37527],{"class":147,"line":432},[145,37522,5352],{"class":258},[145,37524,816],{"class":155},[145,37526,6870],{"class":258},[145,37528,5462],{"class":262},[145,37530,37531,37533,37535,37537,37540,37542,37544],{"class":147,"line":437},[145,37532,5031],{"class":258},[145,37534,4941],{"class":262},[145,37536,752],{"class":258},[145,37538,37539],{"class":262}," max_retries ",[145,37541,682],{"class":258},[145,37543,21068],{"class":155},[145,37545,412],{"class":262},[145,37547,37548,37550],{"class":147,"line":448},[145,37549,5154],{"class":258},[145,37551,37552],{"class":262}," e\n",[145,37554,37555,37558,37560,37562,37564,37566,37568,37570,37572,37574],{"class":147,"line":472},[145,37556,37557],{"class":262},"            time.sleep(",[145,37559,5237],{"class":155},[145,37561,5240],{"class":258},[145,37563,4941],{"class":262},[145,37565,5246],{"class":258},[145,37567,5249],{"class":262},[145,37569,663],{"class":155},[145,37571,290],{"class":262},[145,37573,5256],{"class":155},[145,37575,8571],{"class":262},[145,37577,37578,37580],{"class":147,"line":483},[145,37579,1512],{"class":258},[145,37581,11741],{"class":155},[11,37583,37584],{},"Modos de fallo comunes:",[97,37586,37587,37593,37599],{},[73,37588,37589,37592],{},[23,37590,37591],{},"Violaciones de la politica de contenido"," — a menudo causadas por rostros humanos realistas",[73,37594,37595,37598],{},[23,37596,37597],{},"Agotamiento de recursos"," — reintenta despues de un retraso mas largo",[73,37600,37601,37604],{},[23,37602,37603],{},"Referencias @tag invalidas"," — verifica el orden de carga de archivos",[45,37606],{},[48,37608,37610],{"id":37609},"tecnicas-avanzadas-para-usuarios-expertos","Tecnicas avanzadas para usuarios expertos",[92,37612,37614],{"id":37613},"encadenar-multiples-generaciones","Encadenar multiples generaciones",[11,37616,37617],{},"Crea narrativas mas largas usando el ultimo fotograma de un video como primer fotograma del siguiente:",[136,37619,37621],{"className":326,"code":37620,"language":328,"meta":141,"style":141},"# 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,37622,37623,37628,37638,37649,37657,37662,37666,37671,37695,37699,37708,37722,37733,37741],{"__ignoreMap":141},[145,37624,37625],{"class":147,"line":148},[145,37626,37627],{"class":174},"# Step 1: Generate opening scene\n",[145,37629,37630,37633,37635],{"class":147,"line":166},[145,37631,37632],{"class":262},"scene1_result ",[145,37634,266],{"class":258},[145,37636,37637],{"class":262}," generate_video({\n",[145,37639,37640,37642,37644,37647],{"class":147,"line":178},[145,37641,3496],{"class":159},[145,37643,454],{"class":262},[145,37645,37646],{"class":159},"\"A detective enters a dark office...\"",[145,37648,469],{"class":262},[145,37650,37651,37653,37655],{"class":147,"line":187},[145,37652,3508],{"class":159},[145,37654,454],{"class":262},[145,37656,25920],{"class":155},[145,37658,37659],{"class":147,"line":360},[145,37660,37661],{"class":262},"})\n",[145,37663,37664],{"class":147,"line":366},[145,37665,357],{"emptyLinePlaceholder":58},[145,37667,37668],{"class":147,"line":378},[145,37669,37670],{"class":174},"# Step 2: Extract last frame and use as first frame for scene 2\n",[145,37672,37673,37676,37678,37681,37683,37685,37688,37691,37693],{"class":147,"line":395},[145,37674,37675],{"class":262},"last_frame ",[145,37677,266],{"class":258},[145,37679,37680],{"class":262}," extract_frame(scene1_result[",[145,37682,14747],{"class":159},[145,37684,10546],{"class":262},[145,37686,37687],{"class":593},"timestamp",[145,37689,37690],{"class":258},"=-",[145,37692,5256],{"class":155},[145,37694,392],{"class":262},[145,37696,37697],{"class":147,"line":400},[145,37698,357],{"emptyLinePlaceholder":58},[145,37700,37701,37704,37706],{"class":147,"line":415},[145,37702,37703],{"class":262},"scene2_result ",[145,37705,266],{"class":258},[145,37707,37637],{"class":262},[145,37709,37710,37713,37716,37719],{"class":147,"line":432},[145,37711,37712],{"class":159},"    \"files\"",[145,37714,37715],{"class":262},": [(",[145,37717,37718],{"class":159},"\"references\"",[145,37720,37721],{"class":262},", last_frame)],\n",[145,37723,37724,37726,37728,37731],{"class":147,"line":437},[145,37725,3496],{"class":159},[145,37727,454],{"class":262},[145,37729,37730],{"class":159},"\"@Image1 as first frame. The detective discovers a clue...\"",[145,37732,469],{"class":262},[145,37734,37735,37737,37739],{"class":147,"line":448},[145,37736,3508],{"class":159},[145,37738,454],{"class":262},[145,37740,25968],{"class":155},[145,37742,37743],{"class":147,"line":472},[145,37744,37661],{"class":262},[92,37746,37748],{"id":37747},"generacion-dinamica-de-prompts","Generacion dinamica de prompts",[11,37750,37751],{},"Usa IA para generar variaciones de prompts exitosos:",[136,37753,37755],{"className":326,"code":37754,"language":328,"meta":141,"style":141},"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,37756,37757,37773,37782,37796,37801,37830,37835,37842,37846,37851,37861,37873,37887],{"__ignoreMap":141},[145,37758,37759,37761,37764,37767,37769,37771],{"class":147,"line":148},[145,37760,502],{"class":258},[145,37762,37763],{"class":151}," generate_prompt_variations",[145,37765,37766],{"class":262},"(base_prompt, num_variations",[145,37768,266],{"class":258},[145,37770,4874],{"class":155},[145,37772,516],{"class":262},[145,37774,37775,37778,37780],{"class":147,"line":166},[145,37776,37777],{"class":262},"    variations ",[145,37779,266],{"class":258},[145,37781,5679],{"class":262},[145,37783,37784,37786,37789,37791,37793],{"class":147,"line":178},[145,37785,4938],{"class":258},[145,37787,37788],{"class":262}," i ",[145,37790,965],{"class":258},[145,37792,4946],{"class":155},[145,37794,37795],{"class":262},"(num_variations):\n",[145,37797,37798],{"class":147,"line":187},[145,37799,37800],{"class":174},"        # Use OpenAI/Claude to generate stylistic variations\n",[145,37802,37803,37806,37808,37811,37813,37815,37817,37820,37822,37824,37826,37828],{"class":147,"line":360},[145,37804,37805],{"class":262},"        variation ",[145,37807,266],{"class":258},[145,37809,37810],{"class":262}," ai_rephrase(base_prompt, ",[145,37812,11008],{"class":593},[145,37814,266],{"class":258},[145,37816,457],{"class":258},[145,37818,37819],{"class":159},"\"variation_",[145,37821,577],{"class":155},[145,37823,6132],{"class":262},[145,37825,583],{"class":155},[145,37827,466],{"class":159},[145,37829,392],{"class":262},[145,37831,37832],{"class":147,"line":366},[145,37833,37834],{"class":262},"        variations.append(variation)\n",[145,37836,37837,37839],{"class":147,"line":378},[145,37838,1512],{"class":258},[145,37840,37841],{"class":262}," variations\n",[145,37843,37844],{"class":147,"line":395},[145,37845,357],{"emptyLinePlaceholder":58},[145,37847,37848],{"class":147,"line":400},[145,37849,37850],{"class":174},"# Test multiple versions for A/B optimization\n",[145,37852,37853,37856,37858],{"class":147,"line":415},[145,37854,37855],{"class":262},"base ",[145,37857,266],{"class":258},[145,37859,37860],{"class":159}," \"【Style】Cinematic product showcase...\"\n",[145,37862,37863,37865,37868,37870],{"class":147,"line":432},[145,37864,7998],{"class":258},[145,37866,37867],{"class":262}," variation ",[145,37869,965],{"class":258},[145,37871,37872],{"class":262}," generate_prompt_variations(base):\n",[145,37874,37875,37877,37879,37882,37884],{"class":147,"line":437},[145,37876,1420],{"class":262},[145,37878,266],{"class":258},[145,37880,37881],{"class":262}," generate_video({",[145,37883,5723],{"class":159},[145,37885,37886],{"class":262},": variation})\n",[145,37888,37889],{"class":147,"line":448},[145,37890,37891],{"class":174},"    # Track performance metrics...\n",[92,37893,37895],{"id":37894},"evaluacion-automatizada-de-calidad","Evaluacion automatizada de calidad",[11,37897,37898],{},"Puntua los videos generados automaticamente antes de la revision manual:",[136,37900,37902],{"className":326,"code":37901,"language":328,"meta":141,"style":141},"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,37903,37904,37914,37923,37927,37932,37947,37951,37956,37970,37974,37979,37993,37997,38004,38008,38013,38022,38046],{"__ignoreMap":141},[145,37905,37906,37908,37911],{"class":147,"line":148},[145,37907,502],{"class":258},[145,37909,37910],{"class":151}," assess_video_quality",[145,37912,37913],{"class":262},"(video_url):\n",[145,37915,37916,37919,37921],{"class":147,"line":166},[145,37917,37918],{"class":262},"    scores ",[145,37920,266],{"class":258},[145,37922,16612],{"class":262},[145,37924,37925],{"class":147,"line":178},[145,37926,357],{"emptyLinePlaceholder":58},[145,37928,37929],{"class":147,"line":187},[145,37930,37931],{"class":174},"    # Motion smoothness (analyze frame-to-frame changes)\n",[145,37933,37934,37937,37940,37942,37944],{"class":147,"line":360},[145,37935,37936],{"class":262},"    scores[",[145,37938,37939],{"class":159},"\"motion\"",[145,37941,14725],{"class":262},[145,37943,266],{"class":258},[145,37945,37946],{"class":262}," calculate_motion_smoothness(video_url)\n",[145,37948,37949],{"class":147,"line":366},[145,37950,357],{"emptyLinePlaceholder":58},[145,37952,37953],{"class":147,"line":378},[145,37954,37955],{"class":174},"    # Visual consistency (check for flickering/artifacts)\n",[145,37957,37958,37960,37963,37965,37967],{"class":147,"line":395},[145,37959,37936],{"class":262},[145,37961,37962],{"class":159},"\"consistency\"",[145,37964,14725],{"class":262},[145,37966,266],{"class":258},[145,37968,37969],{"class":262}," detect_visual_artifacts(video_url)\n",[145,37971,37972],{"class":147,"line":400},[145,37973,357],{"emptyLinePlaceholder":58},[145,37975,37976],{"class":147,"line":415},[145,37977,37978],{"class":174},"    # Prompt adherence (use CLIP to compare with text description)\n",[145,37980,37981,37983,37986,37988,37990],{"class":147,"line":432},[145,37982,37936],{"class":262},[145,37984,37985],{"class":159},"\"adherence\"",[145,37987,14725],{"class":262},[145,37989,266],{"class":258},[145,37991,37992],{"class":262}," measure_prompt_alignment(video_url, prompt)\n",[145,37994,37995],{"class":147,"line":437},[145,37996,357],{"emptyLinePlaceholder":58},[145,37998,37999,38001],{"class":147,"line":448},[145,38000,1512],{"class":258},[145,38002,38003],{"class":262}," scores\n",[145,38005,38006],{"class":147,"line":472},[145,38007,357],{"emptyLinePlaceholder":58},[145,38009,38010],{"class":147,"line":483},[145,38011,38012],{"class":174},"# Only proceed with high-quality generations\n",[145,38014,38015,38017,38019],{"class":147,"line":489},[145,38016,12031],{"class":262},[145,38018,266],{"class":258},[145,38020,38021],{"class":262}," generate_video(prompt_data)\n",[145,38023,38024,38026,38029,38031,38034,38037,38039,38041,38044],{"class":147,"line":494},[145,38025,403],{"class":258},[145,38027,38028],{"class":262}," assess_video_quality(result[",[145,38030,14747],{"class":159},[145,38032,38033],{"class":262},"])[",[145,38035,38036],{"class":159},"\"overall\"",[145,38038,14725],{"class":262},[145,38040,5795],{"class":258},[145,38042,38043],{"class":155}," 0.8",[145,38045,412],{"class":262},[145,38047,38048,38051,38053],{"class":147,"line":499},[145,38049,38050],{"class":262},"    publish_video(result[",[145,38052,14747],{"class":159},[145,38054,1431],{"class":262},[18,38056,38057],{},[11,38058,38059],{},[37,38060,38062],{"href":211,"rel":38061},[41],"Accede a funciones avanzadas de Seedance con los planes Pro de EvoLink",[45,38064],{},[48,38066,13096],{"id":8835},[92,38068,38070],{"id":38069},"cual-es-la-diferencia-entre-seedance-10-y-20","Cual es la diferencia entre Seedance 1.0 y 2.0?",[11,38072,38073],{},"Seedance 2.0 introduce entrada multimodal (referencias @tag), soporte de generacion mas larga (4 a 15 segundos) y una consistencia temporal significativamente mejorada. La estructura del prompt sigue siendo similar, pero la version 2.0 maneja escenas complejas mucho mejor.",[92,38075,38077],{"id":38076},"por-que-mis-referencias-tag-a-veces-se-ignoran","Por que mis referencias @tag a veces se ignoran?",[11,38079,38080],{},"Causas comunes:",[70,38082,38083,38091,38100,38106],{},[73,38084,38085,7696,38088,38090],{},[23,38086,38087],{},"Numeracion incorrecta",[28,38089,2735],{}," cuando solo subiste 2 imagenes",[73,38092,38093,38096,38097,38099],{},[23,38094,38095],{},"Discrepancia de tipo de archivo"," — referenciar ",[28,38098,16332],{}," cuando subiste una imagen",[73,38101,38102,38105],{},[23,38103,38104],{},"Instrucciones contradictorias"," — pedir \"escena de noche oscura\" con una imagen de dia brillante",[73,38107,38108,38111],{},[23,38109,38110],{},"Confusion en el orden de carga"," — las etiquetas se asignan por orden de carga dentro de cada tipo",[92,38113,38115],{"id":38114},"como-mantengo-la-consistencia-del-personaje-en-multiples-videos","Como mantengo la consistencia del personaje en multiples videos?",[70,38117,38118,38121,38124,38127],{},[73,38119,38120],{},"Usa exactamente la misma imagen de referencia en cada generacion",[73,38122,38123],{},"Incluye descriptores explicitos del personaje en el texto (\"misma chaqueta azul, cabello castano hasta los hombros\")",[73,38125,38126],{},"Usa el ultimo fotograma del video N como primer fotograma del video N+1",[73,38128,38129],{},"Manten las descripciones del personaje identicas en todos los prompts",[92,38131,38133],{"id":38132},"puedo-modificar-un-video-existente","Puedo modificar un video existente?",[11,38135,38136],{},"Si! Sube tu video existente a traves de video_urls y usa referencias @Video1 en el prompt para editarlo — reemplazar personajes, modificar escenas, extender la duracion o cambiar la historia.",[11,38138,38139],{},"Tambien puedes:",[97,38141,38142,38145,38148],{},[73,38143,38144],{},"Usar @Video1 para hacer referencia al original y describir tus ediciones en el prompt",[73,38146,38147],{},"Subir imagenes de referencia a traves de image_urls para reemplazar personajes o anadir elementos",[73,38149,38150],{},"Usar prompts de extension para anadir contenido antes o despues del video original",[11,38152,38153,38154,38157],{},"Consulta nuestra ",[37,38155,38156],{"href":22789},"documentacion de referencia multimodal"," para la especificacion completa de parametros de edicion.",[92,38159,38161],{"id":38160},"cual-es-la-duracion-maxima-del-video","Cual es la duracion maxima del video?",[11,38163,38164],{},"Seedance 2.0 soporta de 4 a 15 segundos por generacion. Para contenido mas largo que supere el limite de 15 segundos, considera:",[97,38166,38167,38170,38173],{},[73,38168,38169],{},"Dividir en multiples escenas y encadenarlas",[73,38171,38172],{},"Usar el formato de guion de tomas con codigos de tiempo claros",[73,38174,38175],{},"Concentrarse en conceptos individuales por generacion",[92,38177,38179],{"id":38178},"como-evito-las-violaciones-de-la-politica-de-contenido","Como evito las violaciones de la politica de contenido?",[97,38181,38182,38185,38188,38191],{},[73,38183,38184],{},"No subas fotos de rostros humanos realistas",[73,38186,38187],{},"Evita personajes con derechos de autor o celebridades",[73,38189,38190],{},"Usa referencias de personajes ilustrados/estilizados en lugar de fotos",[73,38192,38193],{},"Enfocate en conceptos originales en lugar de recrear medios existentes",[92,38195,38197],{"id":38196},"por-que-algunos-prompts-cuestan-mas-que-otros","Por que algunos prompts cuestan mas que otros?",[11,38199,38200],{},"Factores de coste de generacion:",[70,38202,38203,38209,38215,38221],{},[73,38204,38205,38208],{},[23,38206,38207],{},"Duracion"," — los videos mas largos cuestan mas",[73,38210,38211,38214],{},[23,38212,38213],{},"Resolucion"," — 1080p cuesta mas que 720p",[73,38216,38217,38220],{},[23,38218,38219],{},"Numero de referencias"," — las referencias de video cuestan mas que las de imagen",[73,38222,38223,38226],{},[23,38224,38225],{},"Complejidad"," — las escenas con multiples personajes pueden usar mas computo",[92,38228,38230],{"id":38229},"como-obtengo-los-mejores-resultados-con-el-formato-de-guion-de-tomas","Como obtengo los mejores resultados con el formato de guion de tomas?",[70,38232,38233,38236,38239,38242,38245],{},[73,38234,38235],{},"Manten cada segmento de toma en un maximo de 3-5 segundos",[73,38237,38238],{},"Usa anclas de estilo especificas (\"thriller de Christopher Nolan\" en vez de \"cinematico\")",[73,38240,38241],{},"Describe acciones fisicas, no conceptos abstractos",[73,38243,38244],{},"Incluye instrucciones de movimiento de camara para cada toma",[73,38246,38247],{},"Termina con restricciones de consistencia y requisitos de fisica",[92,38249,38251],{"id":38250},"puedo-usar-seedance-para-proyectos-comerciales","Puedo usar Seedance para proyectos comerciales?",[11,38253,38254,38255,38258],{},"Si, con la licencia apropiada. Consulta los terminos actuales en ",[37,38256,213],{"href":211,"rel":38257},[41]," ya que las politicas pueden variar segun el nivel de suscripcion.",[92,38260,38262],{"id":38261},"como-soluciono-las-generaciones-fallidas","Como soluciono las generaciones fallidas?",[70,38264,38265,38271,38277,38283,38289],{},[73,38266,38267,38270],{},[23,38268,38269],{},"Verifica los limites de archivos"," — \u003C=9 imagenes, \u003C=3 videos, \u003C=3 audio",[73,38272,38273,38276],{},[23,38274,38275],{},"Verifica la numeracion de @tag"," que coincida con tus archivos subidos",[73,38278,38279,38282],{},[23,38280,38281],{},"Simplifica el prompt"," si supera las 200 palabras",[73,38284,38285,38288],{},[23,38286,38287],{},"Elimina instrucciones contradictorias"," entre texto y referencias",[73,38290,38291,38294],{},[23,38292,38293],{},"Prueba primero solo con texto",", luego anade referencias gradualmente",[92,38296,38298],{"id":38297},"que-hace-que-un-prompt-sea-de-calidad-profesional","Que hace que un prompt sea de \"calidad profesional\"?",[11,38300,38301],{},"Los prompts profesionales tipicamente incluyen:",[97,38303,38304,38307,38310,38313,38316],{},[73,38305,38306],{},"Formato de guion de tomas con codigos de tiempo",[73,38308,38309],{},"Anclas de estilo especificas (nombres de directores, movimientos artisticos)",[73,38311,38312],{},"Descripciones de acciones fisicas en lugar de conceptos abstractos",[73,38314,38315],{},"Restricciones de consistencia y requisitos de fisica",[73,38317,38318],{},"Seleccion apropiada de archivos de referencia y uso de @tag",[45,38320],{},[48,38322,38324],{"id":38323},"conclusion","Conclusion",[11,38326,38327],{},"Dominar los prompts de Seedance 2.0 consiste en entender el equilibrio entre las descripciones de texto y las referencias multimodales. El formato de guion de tomas te da control cinematografico, mientras que las referencias @tag proporcionan consistencia visual.",[11,38329,38330],{},"Comienza con las plantillas de solo texto de esta guia, y luego incorpora gradualmente referencias de imagen y video a medida que te familiarices con la sintaxis. Enfocate en instrucciones claras y especificas en lugar de descripciones excesivamente complejas.",[11,38332,38333],{},"Las plantillas aqui cubren los casos de uso mas comunes — desde comerciales de productos hasta animaciones de personajes y transformaciones de estilo. Adaptalas a tus necesidades especificas cambiando las anclas de estilo, los codigos de tiempo y los archivos de referencia.",[11,38335,38336,38337,38340,38341,38344],{},"Lo mas importante: ",[23,38338,38339],{},"experimenta",". Cada prompt te ensena algo sobre como Seedance 2.0 interpreta las instrucciones. La comunidad en ",[37,38342,32275],{"href":32273,"rel":38343},[41]," comparte patrones de prompts exitosos y tecnicas innovadoras.",[11,38346,38347,14079,38350,38354],{},[23,38348,38349],{},"Listo para empezar a crear?",[37,38351,38353],{"href":211,"rel":38352},[41],"Obtiene tu clave API gratuita de EvoLink"," y ejecuta todas las plantillas de esta guia. El futuro de la creacion de video es multimodal, y esta disponible hoy.",[11,38356,38357,38360,38361,38364,38365,38367,38368,38370],{},[23,38358,38359],{},"A continuacion:"," Domina el sistema de referencia @tag -> ",[37,38362,38363],{"href":2781},"Guia multimodal"," | ",[37,38366,22850],{"href":3196}," | Aprende ",[37,38369,34810],{"href":3672}," con ejemplos completos en Python",[45,38372],{},[11,38374,38375],{},[2434,38376,38377],{},"Ultima actualizacion: 19 de febrero de 2026 | Written by J, Growth Lead at EvoLink",[11008,38379,38380],{},"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":141,"searchDepth":166,"depth":166,"links":38382},[38383,38389,38396,38402,38403,38411,38416,38429],{"id":32045,"depth":166,"text":32046,"children":38384},[38385,38386,38387,38388],{"id":32138,"depth":178,"text":32139},{"id":32164,"depth":178,"text":32165},{"id":32285,"depth":178,"text":32286},{"id":32317,"depth":178,"text":32318},{"id":32833,"depth":166,"text":32834,"children":38390},[38391,38392,38393,38394,38395],{"id":32842,"depth":178,"text":32843},{"id":32907,"depth":178,"text":32908},{"id":32998,"depth":178,"text":32999},{"id":33076,"depth":178,"text":33077},{"id":33138,"depth":178,"text":33139},{"id":33253,"depth":166,"text":33254,"children":38397},[38398,38399,38400,38401],{"id":33257,"depth":178,"text":33258},{"id":34002,"depth":178,"text":34003},{"id":35161,"depth":178,"text":35162},{"id":36286,"depth":178,"text":36287},{"id":36664,"depth":166,"text":36665},{"id":36868,"depth":166,"text":36869,"children":38404},[38405,38406,38407,38408,38409,38410],{"id":36872,"depth":178,"text":36873},{"id":37170,"depth":178,"text":37171},{"id":37217,"depth":178,"text":37218},{"id":37252,"depth":178,"text":37253},{"id":37288,"depth":178,"text":37289},{"id":37407,"depth":178,"text":37408},{"id":37609,"depth":166,"text":37610,"children":38412},[38413,38414,38415],{"id":37613,"depth":178,"text":37614},{"id":37747,"depth":178,"text":37748},{"id":37894,"depth":178,"text":37895},{"id":8835,"depth":166,"text":13096,"children":38417},[38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428],{"id":38069,"depth":178,"text":38070},{"id":38076,"depth":178,"text":38077},{"id":38114,"depth":178,"text":38115},{"id":38132,"depth":178,"text":38133},{"id":38160,"depth":178,"text":38161},{"id":38178,"depth":178,"text":38179},{"id":38196,"depth":178,"text":38197},{"id":38229,"depth":178,"text":38230},{"id":38250,"depth":178,"text":38251},{"id":38261,"depth":178,"text":38262},{"id":38297,"depth":178,"text":38298},{"id":38323,"depth":166,"text":38324},"Domina los prompts de Seedance 2.0 con la sintaxis @tag, referencias multimodales y mas de 15 plantillas listas para usar. Incluye ejemplos de codigo Python para la API.",{"date":38432,"image":38433,"pinned":58},"2026-02-19","/111.png","/es/blog/seedance-2-prompt-guide",{"title":31997,"description":38430},"es/blog/seedance-2-prompt-guide","wE6CHVp1OQ7SJ-EdtE3YOPcmsJGj5tzf5paQlnbGa-8",{"id":38439,"title":38440,"body":38441,"description":41332,"extension":11069,"meta":41333,"navigation":58,"path":41354,"seo":41355,"stem":41356,"__hash__":41357},"content/es/blog/seedance-2-vs-sora-2-api-comparison.md","Seedance 2.0 vs Sora 2: Pruebas reales con prompts idénticos (2026)",{"type":8,"value":38442,"toc":41289},[38443,38446,38449,38466,38479,38483,38486,38506,38512,38518,38521,38527,38594,38597,38600,38604,38608,38613,38616,38621,38682,38688,38691,38697,38700,38705,38755,38760,38763,38768,38772,38778,38784,38787,38792,38855,38858,38862,38866,38871,38874,38879,38933,38938,38944,38947,38950,38953,38958,39012,39018,39021,39027,39031,39037,39040,39047,39052,39111,39114,39117,39121,39125,39130,39133,39138,39192,39197,39200,39203,39206,39211,39261,39267,39270,39274,39280,39283,39288,39348,39351,39354,39360,39364,39367,39536,39541,39559,39563,39566,39570,39573,40152,40158,40291,40297,40301,40502,40505,40511,40517,40523,40529,40540,40544,40547,40551,40612,40623,40634,40638,40644,40647,40717,40724,40730,40734,40780,40784,40787,40791,40831,40835,40861,40865,40868,40871,41100,41103,41107,41110,41114,41118,41121,41125,41136,41140,41143,41147,41153,41157,41164,41168,41175,41177,41181,41258,41261,41274,41286],[22919,38444,38440],{"id":38445},"seedance-20-vs-sora-2-pruebas-reales-con-prompts-idénticos-2026",[11,38447,38448],{},"La mayoría de artículos \"Seedance vs Sora\" comparan especificaciones técnicas. Nosotros ejecutamos ambos modelos con los mismos tres prompts, grabamos los resultados y los evaluamos fotograma a fotograma. Esto es lo que encontramos: evidencia en vídeo, código de API que puedes copiar y un desglose de precios que podría cambiar qué modelo eliges.",[11,38450,38451,38452,38457,38458,38461,38462,38465],{},"Seedance 2.0 (del ",[37,38453,38456],{"href":38454,"rel":38455},"https://seed.bytedance.com/en",[41],"equipo Seed"," de ByteDance) obtuvo ",[23,38459,38460],{},"8.5/10 en general"," frente al ",[23,38463,38464],{},"8.0/10"," de Sora 2 en nuestras pruebas. La diferencia no estaba donde esperábamos.",[38467,38468,38470],"callout",{"type":38469},"info",[11,38471,38472,14079,38475,38478],{},[23,38473,38474],{},"¿Quieres ejecutar estas pruebas tú mismo?",[37,38476,38477],{"href":16271},"Consigue una API key gratuita de EvoLink"," y usa los prompts exactos que aparecen abajo.",[48,38480,38482],{"id":38481},"the-test-setup","The Test Setup",[11,38484,38485],{},"We designed three prompts to stress-test different capabilities:",[70,38487,38488,38494,38500],{},[73,38489,38490,38493],{},[23,38491,38492],{},"Slow-motion physics"," — a porcelain vase shattering (particle dynamics, material rendering)",[73,38495,38496,38499],{},[23,38497,38498],{},"Dynamic human motion"," — rooftop breakdancing at night (anatomy, motion blur, neon lighting)",[73,38501,38502,38505],{},[23,38503,38504],{},"Facial expression & lighting"," — an elderly woman discovering a magical book (micro-expressions, volumetric light)",[11,38507,38508,38511],{},[23,38509,38510],{},"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,38513,38514,38517],{},[23,38515,38516],{},"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,38519,38520],{},"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,38522,38523,38526],{},[23,38524,38525],{},"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.",[1849,38528,38529,38541],{},[1852,38530,38531],{},[1855,38532,38533,38536,38538],{},[1858,38534,38535],{},"Parameter",[1858,38537,17198],{"align":13606},[1858,38539,38540],{"align":13606},"Sora 2",[1865,38542,38543,38554,38565,38574,38584],{},[1855,38544,38545,38548,38551],{},[1870,38546,38547],{},"Resolution",[1870,38549,38550],{"align":13606},"1280×720 (720p)",[1870,38552,38553],{"align":13606},"1792×1024 (~1080p)",[1855,38555,38556,38559,38562],{},[1870,38557,38558],{},"Frame Rate",[1870,38560,38561],{"align":13606},"60fps",[1870,38563,38564],{"align":13606},"30fps",[1855,38566,38567,38570,38572],{},[1870,38568,38569],{},"Duration",[1870,38571,3891],{"align":13606},[1870,38573,3891],{"align":13606},[1855,38575,38576,38579,38582],{},[1870,38577,38578],{},"Codec",[1870,38580,38581],{"align":13606},"H.264",[1870,38583,38581],{"align":13606},[1855,38585,38586,38588,38591],{},[1870,38587,30456],{},[1870,38589,38590],{"align":13606},"AAC 44.1kHz stereo",[1870,38592,38593],{"align":13606},"AAC 96kHz stereo",[11,38595,38596],{},"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,38598,38599],{},"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,38601,38603],{"id":38602},"test-1-slow-motion-physics-porcelain-vase","Test 1 — Slow-Motion Physics (Porcelain Vase)",[11,38605,38606],{},[23,38607,11788],{},[18,38609,38610],{},[11,38611,38612],{},"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,38614,17198],{"id":38615},"seedance-20",[56,38617,60,38618],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38619],{"src":38620,"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",[1849,38622,38623,38636],{},[1852,38624,38625],{},[1855,38626,38627,38630,38633],{},[1858,38628,38629],{},"Dimension",[1858,38631,38632],{"align":13606},"Score",[1858,38634,38635],{},"Notes",[1865,38637,38638,38649,38660,38671],{},[1855,38639,38640,38643,38646],{},[1870,38641,38642],{},"Image Quality",[1870,38644,38645],{"align":13606},"8.5/10",[1870,38647,38648],{},"Near-cinematic. Blue-white porcelain texture crisp, marble grain realistic",[1855,38650,38651,38654,38657],{},[1870,38652,38653],{},"Prompt Adherence",[1870,38655,38656],{"align":13606},"7.5/10",[1870,38658,38659],{},"Vase, marble table, warm light, shallow DoF — all present. Dust particles missing",[1855,38661,38662,38665,38668],{},[1870,38663,38664],{},"Physics Realism",[1870,38666,38667],{"align":13606},"7.0/10",[1870,38669,38670],{},"Fall trajectory reasonable but fragments cluster too tightly. Missing motion blur gives a \"floating\" feel",[1855,38672,38673,38676,38679],{},[1870,38674,38675],{},"Lighting",[1870,38677,38678],{"align":13606},"9.0/10",[1870,38680,38681],{},"Afternoon warmth from window is consistent. Specular highlights on glaze are accurate",[11,38683,38684,38687],{},[23,38685,38686],{},"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,38689,38690],{},"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,38692,38693,38696],{},[23,38694,38695],{},"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,38698,38540],{"id":38699},"sora-2",[56,38701,60,38702],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38703],{"src":38704,"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",[1849,38706,38707,38717],{},[1852,38708,38709],{},[1855,38710,38711,38713,38715],{},[1858,38712,38629],{},[1858,38714,38632],{"align":13606},[1858,38716,38635],{},[1865,38718,38719,38728,38737,38746],{},[1855,38720,38721,38723,38725],{},[1870,38722,38642],{},[1870,38724,38678],{"align":13606},[1870,38726,38727],{},"Higher resolution reveals more detail. Cross-section of broken ceramic (grey body under glaze) is impressive",[1855,38729,38730,38732,38734],{},[1870,38731,38653],{},[1870,38733,38656],{"align":13606},[1870,38735,38736],{},"Main elements present. Also missing dust particles",[1855,38738,38739,38741,38743],{},[1870,38740,38664],{},[1870,38742,38464],{"align":13606},[1870,38744,38745],{},"Fracture mechanics more convincing — uneven thickness, irregular break edges match brittle fracture behavior",[1855,38747,38748,38750,38752],{},[1870,38749,38675],{},[1870,38751,38678],{"align":13606},[1870,38753,38754],{},"Warm light from right. Correct differentiation between glossy ceramic and matte stone surfaces",[11,38756,38757,38759],{},[23,38758,38686],{}," 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,38761,38762],{},"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,38764,38765,38767],{},[23,38766,38695],{}," 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,38769,38771],{"id":38770},"test-1-verdict","Test 1 Verdict",[11,38773,38774,38777],{},[23,38775,38776],{},"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,38779,38780,38783],{},[23,38781,38782],{},"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,38785,38786],{},"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,38788,38789],{},[23,38790,38791],{},"Score summary for Test 1:",[1849,38793,38794,38815],{},[1852,38795,38796],{},[1855,38797,38798,38801,38803,38805,38808,38810],{},[1858,38799,38800],{},"Model",[1858,38802,38642],{"align":13606},[1858,38804,38653],{"align":13606},[1858,38806,38807],{"align":13606},"Physics",[1858,38809,38675],{"align":13606},[1858,38811,38812],{"align":13606},[23,38813,38814],{},"Average",[1865,38816,38817,38838],{},[1855,38818,38819,38821,38824,38827,38830,38833],{},[1870,38820,17198],{},[1870,38822,38823],{"align":13606},"8.5",[1870,38825,38826],{"align":13606},"7.5",[1870,38828,38829],{"align":13606},"7.0",[1870,38831,38832],{"align":13606},"9.0",[1870,38834,38835],{"align":13606},[23,38836,38837],{},"8.0",[1855,38839,38840,38842,38844,38846,38848,38850],{},[1870,38841,38540],{},[1870,38843,38832],{"align":13606},[1870,38845,38826],{"align":13606},[1870,38847,38837],{"align":13606},[1870,38849,38832],{"align":13606},[1870,38851,38852],{"align":13606},[23,38853,38854],{},"8.4",[11,38856,38857],{},"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,38859,38861],{"id":38860},"test-2-dynamic-human-motion-rooftop-breakdance","Test 2 — Dynamic Human Motion (Rooftop Breakdance)",[11,38863,38864],{},[23,38865,11788],{},[18,38867,38868],{},[11,38869,38870],{},"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,38872,17198],{"id":38873},"seedance-20-1",[56,38875,60,38876],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38877],{"src":38878,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[1849,38880,38881,38891],{},[1852,38882,38883],{},[1855,38884,38885,38887,38889],{},[1858,38886,38629],{},[1858,38888,38632],{"align":13606},[1858,38890,38635],{},[1865,38892,38893,38902,38912,38922],{},[1855,38894,38895,38897,38899],{},[1870,38896,38642],{},[1870,38898,38678],{"align":13606},[1870,38900,38901],{},"Stunning night rendering. Neon reflections on wet surfaces are almost photographic",[1855,38903,38904,38907,38909],{},[1870,38905,38906],{},"Anatomy Accuracy",[1870,38908,38645],{"align":13606},[1870,38910,38911],{},"B-boy floor work poses are recognizable. Wrist-forearm-shoulder force lines align correctly",[1855,38913,38914,38917,38919],{},[1870,38915,38916],{},"Motion Dynamics",[1870,38918,38678],{"align":13606},[1870,38920,38921],{},"Motion blur direction matches movement. Low center of gravity fits breakdance mechanics. 60fps keeps fast transitions smooth",[1855,38923,38924,38927,38930],{},[1870,38925,38926],{},"Lighting & Atmosphere",[1870,38928,38929],{"align":13606},"9.5/10",[1870,38931,38932],{},"Near-perfect neon reflections on wet ground. Rim lighting + backlit silhouette creates cinematic drama",[11,38934,38935,38937],{},[23,38936,38686],{}," 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,38939,38940,38943],{},[23,38941,38942],{},"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,38945,38946],{},"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,38948,38949],{},"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,38951,38540],{"id":38952},"sora-2-1",[56,38954,60,38955],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38956],{"src":38957,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[1849,38959,38960,38970],{},[1852,38961,38962],{},[1855,38963,38964,38966,38968],{},[1858,38965,38629],{},[1858,38967,38632],{"align":13606},[1858,38969,38635],{},[1865,38971,38972,38981,38994,39003],{},[1855,38973,38974,38976,38978],{},[1870,38975,38642],{},[1870,38977,38464],{"align":13606},[1870,38979,38980],{},"Strong cyberpunk aesthetic, detailed city background. But has an \"AI sheen\" — everything looks too perfectly graded",[1855,38982,38983,38985,38988],{},[1870,38984,38906],{},[1870,38986,38987],{"align":13606},"6.5/10",[1870,38989,15923,38990,38993],{},[23,38991,38992],{},"Major weakness."," Hand-ground contact is blurry, fingers indistinguishable. Torso narrows unnaturally during handstand. Feet/shoe edges have a \"melting\" quality",[1855,38995,38996,38998,39000],{},[1870,38997,38916],{},[1870,38999,38464],{"align":13606},[1870,39001,39002],{},"Water splash effects are good, rotational momentum is credible. But some water droplets look more like noise than real droplets",[1855,39004,39005,39007,39009],{},[1870,39006,38926],{},[1870,39008,38645],{"align":13606},[1870,39010,39011],{},"Dual-source contrast (warm orange backlight + cool cyan front) handled well. But immersion falls short of Seedance",[11,39013,39014,39017],{},[23,39015,39016],{},"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,39019,39020],{},"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,39022,39023,39026],{},[23,39024,39025],{},"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,39028,39030],{"id":39029},"test-2-verdict","Test 2 Verdict",[11,39032,39033,39036],{},[23,39034,39035],{},"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,39038,39039],{},"The 60fps frame rate compounds this advantage. At 30fps, fast breakdance movements produce noticeable judder. At 60fps, they're smooth.",[11,39041,39042,39043,39046],{},"If you're building a product that generates human-motion content through an ",[37,39044,39045],{"href":14180},"AI video API",", this result should heavily influence your model selection.",[11,39048,39049],{},[23,39050,39051],{},"Score summary for Test 2:",[1849,39053,39054,39074],{},[1852,39055,39056],{},[1855,39057,39058,39060,39062,39065,39068,39070],{},[1858,39059,38800],{},[1858,39061,38642],{"align":13606},[1858,39063,39064],{"align":13606},"Anatomy",[1858,39066,39067],{"align":13606},"Motion",[1858,39069,38675],{"align":13606},[1858,39071,39072],{"align":13606},[23,39073,38814],{},[1865,39075,39076,39093],{},[1855,39077,39078,39080,39082,39084,39086,39089],{},[1870,39079,17198],{},[1870,39081,38832],{"align":13606},[1870,39083,38823],{"align":13606},[1870,39085,38832],{"align":13606},[1870,39087,39088],{"align":13606},"9.5",[1870,39090,39091],{"align":13606},[23,39092,38832],{},[1855,39094,39095,39097,39099,39102,39104,39106],{},[1870,39096,38540],{},[1870,39098,38837],{"align":13606},[1870,39100,39101],{"align":13606},"6.5",[1870,39103,38837],{"align":13606},[1870,39105,38823],{"align":13606},[1870,39107,39108],{"align":13606},[23,39109,39110],{},"7.75",[11,39112,39113],{},"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,39115,39116],{},"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,39118,39120],{"id":39119},"test-3-facial-expression-lighting-elder-bookshop","Test 3 — Facial Expression & Lighting (Elder Bookshop)",[11,39122,39123],{},[23,39124,11788],{},[18,39126,39127],{},[11,39128,39129],{},"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,39131,17198],{"id":39132},"seedance-20-2",[56,39134,60,39135],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39136],{"src":39137,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[1849,39139,39140,39150],{},[1852,39141,39142],{},[1855,39143,39144,39146,39148],{},[1858,39145,38629],{},[1858,39147,38632],{"align":13606},[1858,39149,38635],{},[1865,39151,39152,39162,39172,39182],{},[1855,39153,39154,39157,39159],{},[1870,39155,39156],{},"Facial Quality",[1870,39158,38645],{"align":13606},[1870,39160,39161],{},"Wrinkles, crow's feet, nasolabial folds render naturally. Round spectacles sit correctly on nose bridge with subtle refraction",[1855,39163,39164,39167,39169],{},[1870,39165,39166],{},"Expression Transition",[1870,39168,38645],{"align":13606},[1870,39170,39171],{},"Quiet focus → wonder is conveyed through widening eyes, slightly raised brows, parting lips. Layered micro-expressions",[1855,39173,39174,39177,39179],{},[1870,39175,39176],{},"Environment Detail",[1870,39178,38678],{"align":13606},[1870,39180,39181],{},"⭐ Richest scene of all tests. Floor-to-ceiling leather book spines, rolling library ladder, globe desk lamp, ink bottles, brass instruments",[1855,39183,39184,39187,39189],{},[1870,39185,39186],{},"Golden Light Effect",[1870,39188,38678],{"align":13606},[1870,39190,39191],{},"Volumetric golden light radiates upward from pages. Correctly illuminates chin, cheeks, under-nose. Blends naturally with existing warm tungsten",[11,39193,39194,39196],{},[23,39195,38686],{}," 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,39198,39199],{},"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,39201,39202],{},"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,39204,38540],{"id":39205},"sora-2-2",[56,39207,60,39208],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39209],{"src":39210,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[1849,39212,39213,39223],{},[1852,39214,39215],{},[1855,39216,39217,39219,39221],{},[1858,39218,38629],{},[1858,39220,38632],{"align":13606},[1858,39222,38635],{},[1865,39224,39225,39234,39243,39252],{},[1855,39226,39227,39229,39231],{},[1870,39228,39156],{},[1870,39230,38656],{"align":13606},[1870,39232,39233],{},"Passable but \"waxy.\" Forehead and cheeks are too smooth. Aging inconsistent — some areas look 70+, others 50",[1855,39235,39236,39238,39240],{},[1870,39237,39166],{},[1870,39239,38464],{"align":13606},[1870,39241,39242],{},"Wonder comes through (mouth opens, eyes widen). But eyelid and brow expressiveness is less nuanced than Seedance",[1855,39244,39245,39247,39249],{},[1870,39246,39176],{},[1870,39248,38645],{"align":13606},[1870,39250,39251],{},"Good atmosphere with green banker's lamp. Depth of field handled well. But less layered — missing ladder, floor books, desk props",[1855,39253,39254,39256,39258],{},[1870,39255,39186],{},[1870,39257,38678],{"align":13606},[1870,39259,39260],{},"Upward lighting direction correct. Golden particle effects add magical feel. Good subsurface scattering on skin",[11,39262,39263,39266],{},[23,39264,39265],{},"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,39268,39269],{},"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,39271,39273],{"id":39272},"test-3-verdict","Test 3 Verdict",[11,39275,39276,39279],{},[23,39277,39278],{},"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,39281,39282],{},"Both models nail the golden magical light effect. That's a tie.",[11,39284,39285],{},[23,39286,39287],{},"Score summary for Test 3:",[1849,39289,39290,39312],{},[1852,39291,39292],{},[1855,39293,39294,39296,39299,39302,39305,39308],{},[1858,39295,38800],{},[1858,39297,39298],{"align":13606},"Face Quality",[1858,39300,39301],{"align":13606},"Expression",[1858,39303,39304],{"align":13606},"Environment",[1858,39306,39307],{"align":13606},"Light Effect",[1858,39309,39310],{"align":13606},[23,39311,38814],{},[1865,39313,39314,39331],{},[1855,39315,39316,39318,39320,39322,39324,39326],{},[1870,39317,17198],{},[1870,39319,38823],{"align":13606},[1870,39321,38823],{"align":13606},[1870,39323,38832],{"align":13606},[1870,39325,38832],{"align":13606},[1870,39327,39328],{"align":13606},[23,39329,39330],{},"8.75",[1855,39332,39333,39335,39337,39339,39341,39343],{},[1870,39334,38540],{},[1870,39336,38826],{"align":13606},[1870,39338,38837],{"align":13606},[1870,39340,38823],{"align":13606},[1870,39342,38832],{"align":13606},[1870,39344,39345],{"align":13606},[23,39346,39347],{},"8.25",[11,39349,39350],{},"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,39352,39353],{},"For narrative content, short films, character-driven ads, or any application where emotional authenticity matters, Seedance's facial rendering is a meaningful advantage.",[11,39355,39356,39357,1580],{},"For more on getting the best results from Seedance prompts, see our ",[37,39358,39359],{"href":1578},"prompt engineering guide",[48,39361,39363],{"id":39362},"technical-specs-comparison","Technical Specs Comparison",[11,39365,39366],{},"Here's the full technical breakdown based on our actual output analysis:",[1849,39368,39369,39380],{},[1852,39370,39371],{},[1855,39372,39373,39376,39378],{},[1858,39374,39375],{},"Specification",[1858,39377,17198],{"align":13606},[1858,39379,38540],{"align":13606},[1865,39381,39382,39392,39405,39416,39429,39442,39452,39462,39475,39488,39501,39512,39524],{},[1855,39383,39384,39388,39390],{},[1870,39385,39386],{},[23,39387,38547],{},[1870,39389,38550],{"align":13606},[1870,39391,38553],{"align":13606},[1855,39393,39394,39399,39402],{},[1870,39395,39396],{},[23,39397,39398],{},"Pixels per frame",[1870,39400,39401],{"align":13606},"921,600",[1870,39403,39404],{"align":13606},"1,835,008 (~2×)",[1855,39406,39407,39412,39414],{},[1870,39408,39409],{},[23,39410,39411],{},"Frame rate",[1870,39413,38561],{"align":13606},[1870,39415,38564],{"align":13606},[1855,39417,39418,39423,39426],{},[1870,39419,39420],{},[23,39421,39422],{},"Total frames (15s)",[1870,39424,39425],{"align":13606},"900",[1870,39427,39428],{"align":13606},"450",[1855,39430,39431,39436,39439],{},[1870,39432,39433],{},[23,39434,39435],{},"Duration range",[1870,39437,39438],{"align":13606},"4–15s",[1870,39440,39441],{"align":13606},"Up to 20s",[1855,39443,39444,39448,39450],{},[1870,39445,39446],{},[23,39447,38578],{},[1870,39449,38581],{"align":13606},[1870,39451,38581],{"align":13606},[1855,39453,39454,39458,39460],{},[1870,39455,39456],{},[23,39457,30456],{},[1870,39459,38590],{"align":13606},[1870,39461,38593],{"align":13606},[1855,39463,39464,39469,39472],{},[1870,39465,39466],{},[23,39467,39468],{},"Audio generation",[1870,39470,39471],{"align":13606},"Built-in (voice, SFX, music)",[1870,39473,39474],{"align":13606},"Built-in",[1855,39476,39477,39482,39485],{},[1870,39478,39479],{},[23,39480,39481],{},"Aspect ratios",[1870,39483,39484],{"align":13606},"16:9, 9:16, 1:1, 4:3, 3:4, 21:9",[1870,39486,39487],{"align":13606},"16:9, 9:16, 1:1",[1855,39489,39490,39495,39498],{},[1870,39491,39492],{},[23,39493,39494],{},"Input modes",[1870,39496,39497],{"align":13606},"Text, image, video, audio → video",[1870,39499,39500],{"align":13606},"Text, image → video",[1855,39502,39503,39508,39510],{},[1870,39504,39505],{},[23,39506,39507],{},"Max input images",[1870,39509,30427],{"align":13606},[1870,39511,5256],{"align":13606},[1855,39513,39514,39519,39521],{},[1870,39515,39516],{},[23,39517,39518],{},"Max input videos",[1870,39520,4874],{"align":13606},[1870,39522,39523],{"align":13606},"N/A",[1855,39525,39526,39531,39534],{},[1870,39527,39528],{},[23,39529,39530],{},"@-reference system",[1870,39532,39533],{"align":13606},"✅ (multimodal tags)",[1870,39535,13629],{"align":13606},[11,39537,39538],{},[23,39539,39540],{},"Key takeaways:",[97,39542,39543,39546,39549,39556],{},[73,39544,39545],{},"Seedance's 60fps produces 2× more frames in the same duration, which is why motion looks smoother",[73,39547,39548],{},"Sora's higher resolution is better for content that will be paused or screenshotted",[73,39550,39551,39552,39555],{},"Seedance's ",[37,39553,39554],{"href":2781},"multimodal @-reference system"," allows combining image, video, and audio inputs in a single prompt — a capability Sora 2 doesn't offer",[73,39557,39558],{},"Seedance supports 1080p output as well (see API parameters below), though our tests used the default 720p",[48,39560,39562],{"id":39561},"api-access-code-examples","API Access & Code Examples",[11,39564,39565],{},"Both models are accessible via REST APIs. Here's how to call each one.",[92,39567,39569],{"id":39568},"seedance-20-via-evolink-api","Seedance 2.0 via EvoLink API",[11,39571,39572],{},"EvoLink provides unified API access to Seedance 2.0 with async task processing. Here's a complete Python example:",[136,39574,39576],{"className":326,"code":39575,"language":328,"meta":141,"style":141},"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,39577,39578,39584,39590,39594,39605,39613,39617,39652,39657,39661,39666,39674,39687,39695,39712,39724,39729,39737,39747,39753,39759,39765,39776,39787,39791,39795,39799,39811,39832,39836,39841,39849,39857,39877,39899,39903,39907,39915,39919,39935,39951,39972,39979,39995,40025,40029,40055,40063,40067,40071,40076,40086,40094,40099,40104,40109,40114,40119,40124,40128,40138,40148],{"__ignoreMap":141},[145,39579,39580,39582],{"class":147,"line":148},[145,39581,335],{"class":258},[145,39583,352],{"class":262},[145,39585,39586,39588],{"class":147,"line":166},[145,39587,335],{"class":258},[145,39589,345],{"class":262},[145,39591,39592],{"class":147,"line":178},[145,39593,357],{"emptyLinePlaceholder":58},[145,39595,39596,39598,39600,39602],{"class":147,"line":187},[145,39597,381],{"class":155},[145,39599,372],{"class":258},[145,39601,14473],{"class":159},[145,39603,39604],{"class":174},"  # Get one at evolink.ai/dashboard/keys\n",[145,39606,39607,39609,39611],{"class":147,"line":360},[145,39608,369],{"class":155},[145,39610,372],{"class":258},[145,39612,9077],{"class":159},[145,39614,39615],{"class":147,"line":366},[145,39616,357],{"emptyLinePlaceholder":58},[145,39618,39619,39621,39623,39625,39627,39630,39632,39634,39636,39639,39641,39643,39646,39648,39650],{"class":147,"line":378},[145,39620,502],{"class":258},[145,39622,14531],{"class":151},[145,39624,15634],{"class":262},[145,39626,8443],{"class":155},[145,39628,39629],{"class":262},", duration: ",[145,39631,17556],{"class":155},[145,39633,372],{"class":258},[145,39635,5798],{"class":155},[145,39637,39638],{"class":262},", quality: ",[145,39640,8443],{"class":155},[145,39642,372],{"class":258},[145,39644,39645],{"class":159}," \"720p\"",[145,39647,15639],{"class":262},[145,39649,8443],{"class":155},[145,39651,412],{"class":262},[145,39653,39654],{"class":147,"line":395},[145,39655,39656],{"class":159},"    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n",[145,39658,39659],{"class":147,"line":400},[145,39660,357],{"emptyLinePlaceholder":58},[145,39662,39663],{"class":147,"line":415},[145,39664,39665],{"class":174},"    # Step 1: Submit generation task\n",[145,39667,39668,39670,39672],{"class":147,"line":432},[145,39669,903],{"class":262},[145,39671,266],{"class":258},[145,39673,1219],{"class":262},[145,39675,39676,39678,39680,39682,39685],{"class":147,"line":437},[145,39677,1225],{"class":258},[145,39679,466],{"class":159},[145,39681,571],{"class":155},[145,39683,39684],{"class":159},"/video/generations\"",[145,39686,469],{"class":262},[145,39688,39689,39691,39693],{"class":147,"line":448},[145,39690,1244],{"class":593},[145,39692,266],{"class":258},[145,39694,1678],{"class":262},[145,39696,39697,39700,39702,39704,39706,39708,39710],{"class":147,"line":472},[145,39698,39699],{"class":159},"            \"Authorization\"",[145,39701,454],{"class":262},[145,39703,457],{"class":258},[145,39705,460],{"class":159},[145,39707,463],{"class":155},[145,39709,466],{"class":159},[145,39711,469],{"class":262},[145,39713,39714,39717,39719,39722],{"class":147,"line":483},[145,39715,39716],{"class":159},"            \"Content-Type\"",[145,39718,454],{"class":262},[145,39720,39721],{"class":159},"\"application/json\"",[145,39723,469],{"class":262},[145,39725,39726],{"class":147,"line":489},[145,39727,39728],{"class":262},"        },\n",[145,39730,39731,39733,39735],{"class":147,"line":494},[145,39732,1260],{"class":593},[145,39734,266],{"class":258},[145,39736,1678],{"class":262},[145,39738,39739,39741,39743,39745],{"class":147,"line":499},[145,39740,8247],{"class":159},[145,39742,454],{"class":262},[145,39744,1083],{"class":159},[145,39746,469],{"class":262},[145,39748,39749,39751],{"class":147,"line":519},[145,39750,8258],{"class":159},[145,39752,8261],{"class":262},[145,39754,39755,39757],{"class":147,"line":525},[145,39756,8266],{"class":159},[145,39758,16664],{"class":262},[145,39760,39761,39763],{"class":147,"line":536},[145,39762,8277],{"class":159},[145,39764,16672],{"class":262},[145,39766,39767,39770,39772,39774],{"class":147,"line":541},[145,39768,39769],{"class":159},"            \"aspect_ratio\"",[145,39771,454],{"class":262},[145,39773,1167],{"class":159},[145,39775,469],{"class":262},[145,39777,39778,39781,39783,39785],{"class":147,"line":552},[145,39779,39780],{"class":159},"            \"generate_audio\"",[145,39782,454],{"class":262},[145,39784,916],{"class":155},[145,39786,469],{"class":262},[145,39788,39789],{"class":147,"line":563},[145,39790,39728],{"class":262},[145,39792,39793],{"class":147,"line":590},[145,39794,1274],{"class":262},[145,39796,39797],{"class":147,"line":602},[145,39798,924],{"class":262},[145,39800,39801,39803,39805,39807,39809],{"class":147,"line":608},[145,39802,7023],{"class":262},[145,39804,266],{"class":258},[145,39806,12001],{"class":262},[145,39808,7476],{"class":159},[145,39810,644],{"class":262},[145,39812,39813,39815,39817,39819,39822,39824,39826,39828,39830],{"class":147,"line":614},[145,39814,878],{"class":155},[145,39816,424],{"class":262},[145,39818,457],{"class":258},[145,39820,39821],{"class":159},"\"Task submitted: ",[145,39823,577],{"class":155},[145,39825,580],{"class":262},[145,39827,583],{"class":155},[145,39829,466],{"class":159},[145,39831,392],{"class":262},[145,39833,39834],{"class":147,"line":625},[145,39835,357],{"emptyLinePlaceholder":58},[145,39837,39838],{"class":147,"line":630},[145,39839,39840],{"class":174},"    # Step 2: Poll for completion\n",[145,39842,39843,39845,39847],{"class":147,"line":647},[145,39844,544],{"class":258},[145,39846,547],{"class":155},[145,39848,412],{"class":262},[145,39850,39851,39853,39855],{"class":147,"line":668},[145,39852,14660],{"class":262},[145,39854,266],{"class":258},[145,39856,560],{"class":262},[145,39858,39859,39861,39863,39865,39867,39869,39871,39873,39875],{"class":147,"line":688},[145,39860,566],{"class":258},[145,39862,466],{"class":159},[145,39864,571],{"class":155},[145,39866,574],{"class":159},[145,39868,577],{"class":155},[145,39870,580],{"class":262},[145,39872,583],{"class":155},[145,39874,466],{"class":159},[145,39876,469],{"class":262},[145,39878,39879,39881,39883,39885,39887,39889,39891,39893,39895,39897],{"class":147,"line":693},[145,39880,594],{"class":593},[145,39882,266],{"class":258},[145,39884,577],{"class":262},[145,39886,31356],{"class":159},[145,39888,454],{"class":262},[145,39890,457],{"class":258},[145,39892,460],{"class":159},[145,39894,463],{"class":155},[145,39896,466],{"class":159},[145,39898,19393],{"class":262},[145,39900,39901],{"class":147,"line":738},[145,39902,605],{"class":262},[145,39904,39905],{"class":147,"line":743},[145,39906,14701],{"class":262},[145,39908,39909,39911,39913],{"class":147,"line":760},[145,39910,617],{"class":262},[145,39912,266],{"class":258},[145,39914,14710],{"class":262},[145,39916,39917],{"class":147,"line":769},[145,39918,357],{"emptyLinePlaceholder":58},[145,39920,39921,39923,39925,39927,39929,39931,39933],{"class":147,"line":784},[145,39922,746],{"class":258},[145,39924,638],{"class":262},[145,39926,641],{"class":159},[145,39928,14725],{"class":262},[145,39930,752],{"class":258},[145,39932,755],{"class":159},[145,39934,412],{"class":262},[145,39936,39937,39939,39941,39943,39945,39947,39949],{"class":147,"line":810},[145,39938,7209],{"class":262},[145,39940,266],{"class":258},[145,39942,638],{"class":262},[145,39944,21346],{"class":159},[145,39946,1359],{"class":262},[145,39948,14747],{"class":159},[145,39950,644],{"class":262},[145,39952,39953,39955,39957,39959,39962,39964,39966,39968,39970],{"class":147,"line":837},[145,39954,5392],{"class":155},[145,39956,424],{"class":262},[145,39958,457],{"class":258},[145,39960,39961],{"class":159},"\"Done! Video URL (valid 24h): ",[145,39963,577],{"class":155},[145,39965,1484],{"class":262},[145,39967,583],{"class":155},[145,39969,466],{"class":159},[145,39971,392],{"class":262},[145,39973,39974,39976],{"class":147,"line":842},[145,39975,763],{"class":258},[145,39977,39978],{"class":262}," video_url\n",[145,39980,39981,39983,39985,39987,39989,39991,39993],{"class":147,"line":848},[145,39982,772],{"class":258},[145,39984,638],{"class":262},[145,39986,641],{"class":159},[145,39988,14725],{"class":262},[145,39990,752],{"class":258},[145,39992,779],{"class":159},[145,39994,412],{"class":262},[145,39996,39997,39999,40001,40003,40005,40007,40009,40011,40013,40015,40017,40019,40021,40023],{"class":147,"line":853},[145,39998,813],{"class":258},[145,40000,5569],{"class":155},[145,40002,424],{"class":262},[145,40004,457],{"class":258},[145,40006,14805],{"class":159},[145,40008,577],{"class":155},[145,40010,17740],{"class":262},[145,40012,11657],{"class":159},[145,40014,290],{"class":262},[145,40016,17747],{"class":159},[145,40018,108],{"class":262},[145,40020,583],{"class":155},[145,40022,466],{"class":159},[145,40024,392],{"class":262},[145,40026,40027],{"class":147,"line":858},[145,40028,357],{"emptyLinePlaceholder":58},[145,40030,40031,40033,40035,40037,40039,40041,40043,40046,40048,40050,40053],{"class":147,"line":869},[145,40032,696],{"class":155},[145,40034,424],{"class":262},[145,40036,457],{"class":258},[145,40038,11686],{"class":159},[145,40040,577],{"class":155},[145,40042,1325],{"class":262},[145,40044,40045],{"class":159},"'status'",[145,40047,1331],{"class":262},[145,40049,583],{"class":155},[145,40051,40052],{"class":159},"... waiting 5s\"",[145,40054,392],{"class":262},[145,40056,40057,40059,40061],{"class":147,"line":875},[145,40058,14863],{"class":262},[145,40060,1133],{"class":155},[145,40062,392],{"class":262},[145,40064,40065],{"class":147,"line":900},[145,40066,357],{"emptyLinePlaceholder":58},[145,40068,40069],{"class":147,"line":921},[145,40070,357],{"emptyLinePlaceholder":58},[145,40072,40073],{"class":147,"line":927},[145,40074,40075],{"class":174},"# Run the porcelain vase test\n",[145,40077,40078,40081,40083],{"class":147,"line":932},[145,40079,40080],{"class":262},"video ",[145,40082,266],{"class":258},[145,40084,40085],{"class":262}," generate_video(\n",[145,40087,40088,40090,40092],{"class":147,"line":956},[145,40089,16837],{"class":593},[145,40091,266],{"class":258},[145,40093,5159],{"class":262},[145,40095,40096],{"class":147,"line":981},[145,40097,40098],{"class":159},"        \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40100,40101],{"class":147,"line":987},[145,40102,40103],{"class":159},"        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40105,40106],{"class":147,"line":992},[145,40107,40108],{"class":159},"        \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40110,40111],{"class":147,"line":1009},[145,40112,40113],{"class":159},"        \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40115,40116],{"class":147,"line":1044},[145,40117,40118],{"class":159},"        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40120,40121],{"class":147,"line":1049},[145,40122,40123],{"class":159},"        \"Shallow depth of field, 24fps cinematic look\"\n",[145,40125,40126],{"class":147,"line":1054},[145,40127,3620],{"class":262},[145,40129,40130,40132,40134,40136],{"class":147,"line":1065},[145,40131,16864],{"class":593},[145,40133,266],{"class":258},[145,40135,3721],{"class":155},[145,40137,469],{"class":262},[145,40139,40140,40142,40144,40146],{"class":147,"line":1075},[145,40141,16875],{"class":593},[145,40143,266],{"class":258},[145,40145,1150],{"class":159},[145,40147,469],{"class":262},[145,40149,40150],{"class":147,"line":1092},[145,40151,392],{"class":262},[11,40153,40154,40157],{},[23,40155,40156],{},"Multimodal input example"," — using an image as the first frame:",[136,40159,40161],{"className":326,"code":40160,"language":328,"meta":141,"style":141},"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,40162,40163,40171,40183,40191,40208,40219,40223,40231,40241,40252,40263,40273,40283,40287],{"__ignoreMap":141},[145,40164,40165,40167,40169],{"class":147,"line":148},[145,40166,6332],{"class":262},[145,40168,266],{"class":258},[145,40170,1219],{"class":262},[145,40172,40173,40175,40177,40179,40181],{"class":147,"line":166},[145,40174,6341],{"class":258},[145,40176,466],{"class":159},[145,40178,571],{"class":155},[145,40180,39684],{"class":159},[145,40182,469],{"class":262},[145,40184,40185,40187,40189],{"class":147,"line":178},[145,40186,6354],{"class":593},[145,40188,266],{"class":258},[145,40190,1678],{"class":262},[145,40192,40193,40196,40198,40200,40202,40204,40206],{"class":147,"line":187},[145,40194,40195],{"class":159},"        \"Authorization\"",[145,40197,454],{"class":262},[145,40199,457],{"class":258},[145,40201,460],{"class":159},[145,40203,463],{"class":155},[145,40205,466],{"class":159},[145,40207,469],{"class":262},[145,40209,40210,40213,40215,40217],{"class":147,"line":360},[145,40211,40212],{"class":159},"        \"Content-Type\"",[145,40214,454],{"class":262},[145,40216,39721],{"class":159},[145,40218,469],{"class":262},[145,40220,40221],{"class":147,"line":366},[145,40222,22010],{"class":262},[145,40224,40225,40227,40229],{"class":147,"line":378},[145,40226,6365],{"class":593},[145,40228,266],{"class":258},[145,40230,1678],{"class":262},[145,40232,40233,40235,40237,40239],{"class":147,"line":395},[145,40234,1078],{"class":159},[145,40236,454],{"class":262},[145,40238,1083],{"class":159},[145,40240,469],{"class":262},[145,40242,40243,40245,40247,40250],{"class":147,"line":400},[145,40244,1095],{"class":159},[145,40246,454],{"class":262},[145,40248,40249],{"class":159},"\"@Image1 as first frame, the vase begins to wobble and fall\"",[145,40251,469],{"class":262},[145,40253,40254,40256,40258,40261],{"class":147,"line":415},[145,40255,2503],{"class":159},[145,40257,10632],{"class":262},[145,40259,40260],{"class":159},"\"https://example.com/porcelain-vase.jpg\"",[145,40262,10638],{"class":262},[145,40264,40265,40267,40269,40271],{"class":147,"line":432},[145,40266,1128],{"class":159},[145,40268,454],{"class":262},[145,40270,513],{"class":155},[145,40272,469],{"class":262},[145,40274,40275,40277,40279,40281],{"class":147,"line":437},[145,40276,1145],{"class":159},[145,40278,454],{"class":262},[145,40280,3525],{"class":159},[145,40282,469],{"class":262},[145,40284,40285],{"class":147,"line":448},[145,40286,22010],{"class":262},[145,40288,40289],{"class":147,"line":472},[145,40290,392],{"class":262},[11,40292,40293,40294,1580],{},"For advanced multimodal workflows with @Image, @Video, and @Audio references, see our ",[37,40295,40296],{"href":2781},"@Tags guide",[92,40298,40300],{"id":40299},"sora-2-via-openai-api","Sora 2 via OpenAI API",[136,40302,40304],{"className":326,"code":40303,"language":328,"meta":141,"style":141},"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,40305,40306,40318,40322,40335,40339,40344,40353,40365,40375,40387,40394,40399,40404,40409,40414,40419,40424,40428,40433,40444,40454,40458,40462,40467,40481],{"__ignoreMap":141},[145,40307,40308,40310,40313,40315],{"class":147,"line":148},[145,40309,6531],{"class":258},[145,40311,40312],{"class":262}," openai ",[145,40314,335],{"class":258},[145,40316,40317],{"class":262}," OpenAI\n",[145,40319,40320],{"class":147,"line":166},[145,40321,357],{"emptyLinePlaceholder":58},[145,40323,40324,40327,40329,40332],{"class":147,"line":178},[145,40325,40326],{"class":262},"client ",[145,40328,266],{"class":258},[145,40330,40331],{"class":262}," OpenAI()  ",[145,40333,40334],{"class":174},"# Uses OPENAI_API_KEY env var\n",[145,40336,40337],{"class":147,"line":187},[145,40338,357],{"emptyLinePlaceholder":58},[145,40340,40341],{"class":147,"line":360},[145,40342,40343],{"class":174},"# Submit video generation\n",[145,40345,40346,40348,40350],{"class":147,"line":366},[145,40347,6332],{"class":262},[145,40349,266],{"class":258},[145,40351,40352],{"class":262}," client.responses.create(\n",[145,40354,40355,40358,40360,40363],{"class":147,"line":378},[145,40356,40357],{"class":593},"    model",[145,40359,266],{"class":258},[145,40361,40362],{"class":159},"\"sora\"",[145,40364,469],{"class":262},[145,40366,40367,40370,40372],{"class":147,"line":395},[145,40368,40369],{"class":593},"    input",[145,40371,266],{"class":258},[145,40373,40374],{"class":262},"[{\n",[145,40376,40377,40380,40382,40385],{"class":147,"line":400},[145,40378,40379],{"class":159},"        \"type\"",[145,40381,454],{"class":262},[145,40383,40384],{"class":159},"\"text\"",[145,40386,469],{"class":262},[145,40388,40389,40392],{"class":147,"line":415},[145,40390,40391],{"class":159},"        \"text\"",[145,40393,1098],{"class":262},[145,40395,40396],{"class":147,"line":432},[145,40397,40398],{"class":159},"            \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40400,40401],{"class":147,"line":437},[145,40402,40403],{"class":159},"            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40405,40406],{"class":147,"line":448},[145,40407,40408],{"class":159},"            \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40410,40411],{"class":147,"line":472},[145,40412,40413],{"class":159},"            \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40415,40416],{"class":147,"line":483},[145,40417,40418],{"class":159},"            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40420,40421],{"class":147,"line":489},[145,40422,40423],{"class":159},"            \"Shallow depth of field, 24fps cinematic look\"\n",[145,40425,40426],{"class":147,"line":494},[145,40427,1122],{"class":262},[145,40429,40430],{"class":147,"line":499},[145,40431,40432],{"class":262},"    }],\n",[145,40434,40435,40438,40440,40442],{"class":147,"line":519},[145,40436,40437],{"class":593},"    resolution",[145,40439,266],{"class":258},[145,40441,3525],{"class":159},[145,40443,469],{"class":262},[145,40445,40446,40448,40450,40452],{"class":147,"line":525},[145,40447,16864],{"class":593},[145,40449,266],{"class":258},[145,40451,3721],{"class":155},[145,40453,469],{"class":262},[145,40455,40456],{"class":147,"line":536},[145,40457,392],{"class":262},[145,40459,40460],{"class":147,"line":541},[145,40461,357],{"emptyLinePlaceholder":58},[145,40463,40464],{"class":147,"line":552},[145,40465,40466],{"class":174},"# Get the video URL from the response\n",[145,40468,40469,40471,40473,40476,40478],{"class":147,"line":563},[145,40470,29675],{"class":262},[145,40472,266],{"class":258},[145,40474,40475],{"class":262}," response.output[",[145,40477,663],{"class":155},[145,40479,40480],{"class":262},"].url\n",[145,40482,40483,40485,40487,40489,40492,40494,40496,40498,40500],{"class":147,"line":590},[145,40484,6387],{"class":155},[145,40486,424],{"class":262},[145,40488,457],{"class":258},[145,40490,40491],{"class":159},"\"Video URL: ",[145,40493,577],{"class":155},[145,40495,1484],{"class":262},[145,40497,583],{"class":155},[145,40499,466],{"class":159},[145,40501,392],{"class":262},[11,40503,40504],{},"Both APIs follow a similar pattern: submit a prompt, get back a video. But the differences go beyond just the endpoint.",[11,40506,40507,40510],{},[23,40508,40509],{},"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,40512,40513,40516],{},[23,40514,40515],{},"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,40518,40519,40522],{},[23,40520,40521],{},"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,40524,40525,40528],{},[23,40526,40527],{},"Video URL expiry:"," EvoLink video URLs expire after 24 hours — download or cache them immediately. Plan your pipeline accordingly.",[38467,40530,40531],{"type":21670},[11,40532,40533,14079,40536,40539],{},[23,40534,40535],{},"Run this comparison yourself.",[37,40537,40538],{"href":16271},"Get your EvoLink API key"," and test with your own prompts. The code above works out of the box.",[48,40541,40543],{"id":40542},"pricing-breakdown","Pricing Breakdown",[11,40545,40546],{},"Cost per 15-second video at default settings, as of February 2026:",[92,40548,40550],{"id":40549},"sora-2-via-openai-evolink","Sora 2 (via OpenAI / EvoLink)",[1849,40552,40553,40564],{},[1852,40554,40555],{},[1855,40556,40557,40559,40561],{},[1858,40558,38547],{},[1858,40560,38569],{"align":13606},[1858,40562,40563],{"align":13606},"Price per video",[1865,40565,40566,40577,40588,40600],{},[1855,40567,40568,40570,40572],{},[1870,40569,1599],{},[1870,40571,3885],{"align":13606},[1870,40573,40574],{"align":13606},[23,40575,40576],{},"$0.50",[1855,40578,40579,40581,40583],{},[1870,40580,1599],{},[1870,40582,3888],{"align":13606},[1870,40584,40585],{"align":13606},[23,40586,40587],{},"$1.00",[1855,40589,40590,40592,40595],{},[1870,40591,1599],{},[1870,40593,40594],{"align":13606},"12s",[1870,40596,40597],{"align":13606},[23,40598,40599],{},"$1.20",[1855,40601,40602,40604,40607],{},[1870,40603,1599],{},[1870,40605,40606],{"align":13606},"20s",[1870,40608,40609],{"align":13606},[23,40610,40611],{},"$2.00",[11,40613,40614,40615,40618,40619,40622],{},"That works out to ",[23,40616,40617],{},"$0.10/second"," at 720p standard tier. Our 15-second test videos cost approximately ",[23,40620,40621],{},"$1.50 each"," on Sora 2.",[11,40624,40625],{},[2434,40626,40627,40628,40633],{},"Source: ",[37,40629,40632],{"href":40630,"rel":40631},"https://seedance2api.app/pricing",[41],"seedance2api.app/pricing",", as of Feb 2026",[92,40635,40637],{"id":40636},"seedance-20-via-evolink","Seedance 2.0 (via EvoLink)",[11,40639,40640,40643],{},[23,40641,40642],{},"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,40645,40646],{},"For context, here's how it stacks up against other models in the market:",[1849,40648,40649,40664],{},[1852,40650,40651],{},[1855,40652,40653,40655,40658,40661],{},[1858,40654,38800],{},[1858,40656,40657],{"align":13606},"Cost per second",[1858,40659,40660],{"align":13606},"Est. cost per video",[1858,40662,40663],{"align":13606},"Max resolution",[1865,40665,40666,40677,40690,40704],{},[1855,40667,40668,40670,40673,40675],{},[1870,40669,17198],{},[1870,40671,40672],{"align":13606},"Coming soon",[1870,40674,40672],{"align":13606},[1870,40676,1607],{"align":13606},[1855,40678,40679,40681,40684,40687],{},[1870,40680,38540],{},[1870,40682,40683],{"align":13606},"$0.10 (720p)",[1870,40685,40686],{"align":13606},"$1.20 / 12s",[1870,40688,40689],{"align":13606},"720p (Std) / 1080p (Pro)",[1855,40691,40692,40695,40698,40701],{},[1870,40693,40694],{},"Kling 3.0",[1870,40696,40697],{"align":13606},"$0.112 (1080p)",[1870,40699,40700],{"align":13606},"$1.12 / 10s",[1870,40702,40703],{"align":13606},"4K",[1855,40705,40706,40709,40712,40715],{},[1870,40707,40708],{},"Veo 3.1",[1870,40710,40711],{"align":13606},"$0.40 (1080p)",[1870,40713,40714],{"align":13606},"$3.20 / 8s",[1870,40716,40703],{"align":13606},[11,40718,40719],{},[2434,40720,40627,40721],{},[37,40722,40632],{"href":40630,"rel":40723},[41],[11,40725,40726,40729],{},[37,40727,40728],{"href":16271},"Get early access"," to lock in launch pricing when it's announced.",[92,40731,40733],{"id":40732},"cost-considerations","Cost Considerations",[97,40735,40736,40742,40748,40754,40764,40770],{},[73,40737,40738,40741],{},[23,40739,40740],{},"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,40743,40744,40747],{},[23,40745,40746],{},"Audio bundling:"," Both models can generate synchronized audio. Factor this into your per-video cost if you'd otherwise need separate audio generation.",[73,40749,40750,40753],{},[23,40751,40752],{},"Volume matters:"," For production workloads generating hundreds of videos, even small per-second differences compound. Test both with your actual prompts before committing.",[73,40755,40756,40759,40760,40763],{},[23,40757,40758],{},"Intellectual property:"," Seedance 2.0 outputs include ",[37,40761,40762],{"href":8973},"commercial usage rights"," — verify the latest terms for your use case.",[73,40765,40766,40769],{},[23,40767,40768],{},"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,40771,40772,40775,40776,40779],{},[23,40773,40774],{},"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,40777,40778],{"href":16271},"free API key"," to get started with Seedance testing.",[48,40781,40783],{"id":40782},"when-to-choose-which","When to Choose Which",[11,40785,40786],{},"Picking a model isn't about \"which is better\" — it's about matching capabilities to your specific use case.",[92,40788,40790],{"id":40789},"choose-seedance-20-when","Choose Seedance 2.0 when:",[97,40792,40793,40799,40805,40811,40819,40825],{},[73,40794,40795,40798],{},[23,40796,40797],{},"Dynamic human content"," — dance, sports, action, fitness. The anatomy accuracy gap (8.5 vs 6.5 in our test) is significant.",[73,40800,40801,40804],{},[23,40802,40803],{},"Slow-motion or high-motion content"," — 60fps makes a visible difference in ads, product demos, and cinematic sequences.",[73,40806,40807,40810],{},[23,40808,40809],{},"Character close-ups"," — facial detail and micro-expression rendering are more convincing, especially for elderly or highly detailed faces.",[73,40812,40813,40816,40817,1580],{},[23,40814,40815],{},"Multimodal workflows"," — you need to combine reference images, videos, and audio in a single generation using the ",[37,40818,39530],{"href":2781},[73,40820,40821,40824],{},[23,40822,40823],{},"Rich environment scenes"," — Seedance builds more detailed, \"lived-in\" environments with more props and depth layers.",[73,40826,40827,40830],{},[23,40828,40829],{},"Flexible aspect ratios"," — 21:9 ultrawide and 4:3 formats aren't available on Sora.",[92,40832,40834],{"id":40833},"choose-sora-2-when","Choose Sora 2 when:",[97,40836,40837,40843,40849,40855],{},[73,40838,40839,40842],{},[23,40840,40841],{},"Maximum resolution matters"," — if your output will be displayed at 1080p+ or screenshotted/paused frequently, Sora's higher pixel count wins.",[73,40844,40845,40848],{},[23,40846,40847],{},"Object destruction physics"," — fracture detail on breaking objects is more convincing (uneven thickness, visible internal material layers).",[73,40850,40851,40854],{},[23,40852,40853],{},"Static or slow-moving scenes"," — when the 60fps advantage doesn't apply, Sora's resolution advantage is uncontested.",[73,40856,40857,40860],{},[23,40858,40859],{},"Existing OpenAI integration"," — if your stack already uses the OpenAI SDK, adding Sora requires minimal new infrastructure.",[92,40862,40864],{"id":40863},"the-hybrid-approach","The hybrid approach",[11,40866,40867],{},"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,40869,40870],{},"A simple routing heuristic based on our test results:",[136,40872,40874],{"className":326,"code":40873,"language":328,"meta":141,"style":141},"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,40875,40876,40904,40909,40953,40992,40997,41005,41009,41034,41044,41065,41074,41081,41091],{"__ignoreMap":141},[145,40877,40878,40880,40883,40885,40887,40890,40893,40895,40898,40900,40902],{"class":147,"line":148},[145,40879,502],{"class":258},[145,40881,40882],{"class":151}," choose_model",[145,40884,15634],{"class":262},[145,40886,8443],{"class":155},[145,40888,40889],{"class":262},", needs_pause_quality: ",[145,40891,40892],{"class":155},"bool",[145,40894,372],{"class":258},[145,40896,40897],{"class":155}," False",[145,40899,15639],{"class":262},[145,40901,8443],{"class":155},[145,40903,412],{"class":262},[145,40905,40906],{"class":147,"line":166},[145,40907,40908],{"class":159},"    \"\"\"Route to the better model based on content type.\"\"\"\n",[145,40910,40911,40914,40916,40918,40921,40923,40926,40928,40931,40933,40936,40938,40941,40943,40946,40948,40951],{"class":147,"line":178},[145,40912,40913],{"class":262},"    motion_keywords ",[145,40915,266],{"class":258},[145,40917,7961],{"class":262},[145,40919,40920],{"class":159},"\"dance\"",[145,40922,290],{"class":262},[145,40924,40925],{"class":159},"\"run\"",[145,40927,290],{"class":262},[145,40929,40930],{"class":159},"\"fight\"",[145,40932,290],{"class":262},[145,40934,40935],{"class":159},"\"sport\"",[145,40937,290],{"class":262},[145,40939,40940],{"class":159},"\"action\"",[145,40942,290],{"class":262},[145,40944,40945],{"class":159},"\"slow motion\"",[145,40947,290],{"class":262},[145,40949,40950],{"class":159},"\"jump\"",[145,40952,644],{"class":262},[145,40954,40955,40958,40960,40962,40965,40967,40970,40972,40975,40977,40980,40982,40985,40987,40990],{"class":147,"line":187},[145,40956,40957],{"class":262},"    face_keywords ",[145,40959,266],{"class":258},[145,40961,7961],{"class":262},[145,40963,40964],{"class":159},"\"close-up\"",[145,40966,290],{"class":262},[145,40968,40969],{"class":159},"\"expression\"",[145,40971,290],{"class":262},[145,40973,40974],{"class":159},"\"portrait\"",[145,40976,290],{"class":262},[145,40978,40979],{"class":159},"\"face\"",[145,40981,290],{"class":262},[145,40983,40984],{"class":159},"\"emotion\"",[145,40986,290],{"class":262},[145,40988,40989],{"class":159},"\"elderly\"",[145,40991,644],{"class":262},[145,40993,40994],{"class":147,"line":360},[145,40995,40996],{"class":262},"    \n",[145,40998,40999,41001,41003],{"class":147,"line":366},[145,41000,15653],{"class":262},[145,41002,266],{"class":258},[145,41004,15658],{"class":262},[145,41006,41007],{"class":147,"line":378},[145,41008,40996],{"class":262},[145,41010,41011,41013,41016,41019,41021,41024,41026,41029,41031],{"class":147,"line":395},[145,41012,2320],{"class":258},[145,41014,41015],{"class":155}," any",[145,41017,41018],{"class":262},"(kw ",[145,41020,965],{"class":258},[145,41022,41023],{"class":262}," prompt_lower ",[145,41025,7998],{"class":258},[145,41027,41028],{"class":262}," kw ",[145,41030,965],{"class":258},[145,41032,41033],{"class":262}," motion_keywords):\n",[145,41035,41036,41038,41041],{"class":147,"line":400},[145,41037,6998],{"class":258},[145,41039,41040],{"class":159}," \"seedance-2.0\"",[145,41042,41043],{"class":174},"  # Better anatomy + 60fps\n",[145,41045,41046,41048,41050,41052,41054,41056,41058,41060,41062],{"class":147,"line":415},[145,41047,2320],{"class":258},[145,41049,41015],{"class":155},[145,41051,41018],{"class":262},[145,41053,965],{"class":258},[145,41055,41023],{"class":262},[145,41057,7998],{"class":258},[145,41059,41028],{"class":262},[145,41061,965],{"class":258},[145,41063,41064],{"class":262}," face_keywords):\n",[145,41066,41067,41069,41071],{"class":147,"line":432},[145,41068,6998],{"class":258},[145,41070,41040],{"class":159},[145,41072,41073],{"class":174},"  # Better facial detail\n",[145,41075,41076,41078],{"class":147,"line":437},[145,41077,2320],{"class":258},[145,41079,41080],{"class":262}," needs_pause_quality:\n",[145,41082,41083,41085,41088],{"class":147,"line":448},[145,41084,6998],{"class":258},[145,41086,41087],{"class":159}," \"sora\"",[145,41089,41090],{"class":174},"          # Higher resolution for screenshots\n",[145,41092,41093,41095,41097],{"class":147,"line":472},[145,41094,1512],{"class":258},[145,41096,41040],{"class":159},[145,41098,41099],{"class":174},"      # Default to higher overall score\n",[11,41101,41102],{},"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,41104,41106],{"id":41105},"what-about-other-models","What about other models?",[11,41108,41109],{},"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,41111,41113],{"id":41112},"faq","FAQ",[92,41115,41117],{"id":41116},"is-seedance-20-better-than-sora-2","Is Seedance 2.0 better than Sora 2?",[11,41119,41120],{},"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,41122,41124],{"id":41123},"can-i-access-seedance-20-through-an-api","Can I access Seedance 2.0 through an API?",[11,41126,41127,41128,41132,41133,1580],{},"Yes. Seedance 2.0 is available through the ",[37,41129,41131],{"href":15951,"rel":41130},[41],"EvoLink API"," with standard REST endpoints. It supports text-to-video, image-to-video, and video-to-video generation. ",[37,41134,41135],{"href":16271},"Get an API key here",[92,41137,41139],{"id":41138},"whats-the-actual-output-quality-difference-at-720p","What's the actual output quality difference at 720p?",[11,41141,41142],{},"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,41144,41146],{"id":41145},"do-both-models-generate-audio","Do both models generate audio?",[11,41148,41149,41150,41152],{},"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,41151,1635],{}," parameter and can align output to reference audio tracks via the @Audio tag.",[92,41154,41156],{"id":41155},"which-model-is-more-cost-effective-for-production-use","Which model is more cost-effective for production use?",[11,41158,41159,41160,41163],{},"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,41161,40632],{"href":40630,"rel":41162},[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,41165,41167],{"id":41166},"can-i-use-seedance-20-outputs-commercially","Can I use Seedance 2.0 outputs commercially?",[11,41169,41170,41171,41174],{},"Seedance 2.0 outputs through the EvoLink API include commercial usage rights, but terms vary. Read our ",[37,41172,41173],{"href":8973},"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,41176],{},[48,41178,41180],{"id":41179},"final-scores","Final Scores",[1849,41182,41183,41193],{},[1852,41184,41185],{},[1855,41186,41187,41189,41191],{},[1858,41188,38629],{},[1858,41190,17198],{"align":13606},[1858,41192,38540],{"align":13606},[1865,41194,41195,41205,41214,41224,41234,41243],{},[1855,41196,41197,41199,41202],{},[1870,41198,38642],{},[1870,41200,41201],{"align":13606},"8.7",[1870,41203,41204],{"align":13606},"8.3",[1855,41206,41207,41209,41211],{},[1870,41208,38653],{},[1870,41210,41204],{"align":13606},[1870,41212,41213],{"align":13606},"7.8",[1855,41215,41216,41219,41221],{},[1870,41217,41218],{},"Physics/Anatomy Realism",[1870,41220,38837],{"align":13606},[1870,41222,41223],{"align":13606},"7.3",[1855,41225,41226,41228,41231],{},[1870,41227,38675],{},[1870,41229,41230],{"align":13606},"9.2",[1870,41232,41233],{"align":13606},"8.8",[1855,41235,41236,41239,41241],{},[1870,41237,41238],{},"Motion Fluidity",[1870,41240,38823],{"align":13606},[1870,41242,41213],{"align":13606},[1855,41244,41245,41250,41254],{},[1870,41246,41247],{},[23,41248,41249],{},"Overall",[1870,41251,41252],{"align":13606},[23,41253,38823],{},[1870,41255,41256],{"align":13606},[23,41257,38837],{},[11,41259,41260],{},"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,41262,41263,41264,41268,41269,1580],{},"For the latest on Seedance model capabilities, see the official ",[37,41265,41267],{"href":38454,"rel":41266},[41],"ByteDance Seed research page",". For Sora documentation and updates, refer to ",[37,41270,41273],{"href":41271,"rel":41272},"https://platform.openai.com/docs",[41],"OpenAI's official platform docs",[38467,41275,41277],{"type":41276},"primary",[11,41278,41279,14079,41282,41285],{},[23,41280,41281],{},"Start building with Seedance 2.0.",[37,41283,41284],{"href":16271},"Get your free EvoLink API key"," and generate your first video in under a minute.",[11008,41287,41288],{},"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":141,"searchDepth":166,"depth":166,"links":41290},[41291,41292,41297,41302,41307,41308,41312,41317,41323,41331],{"id":38481,"depth":166,"text":38482},{"id":38602,"depth":166,"text":38603,"children":41293},[41294,41295,41296],{"id":38615,"depth":178,"text":17198},{"id":38699,"depth":178,"text":38540},{"id":38770,"depth":178,"text":38771},{"id":38860,"depth":166,"text":38861,"children":41298},[41299,41300,41301],{"id":38873,"depth":178,"text":17198},{"id":38952,"depth":178,"text":38540},{"id":39029,"depth":178,"text":39030},{"id":39119,"depth":166,"text":39120,"children":41303},[41304,41305,41306],{"id":39132,"depth":178,"text":17198},{"id":39205,"depth":178,"text":38540},{"id":39272,"depth":178,"text":39273},{"id":39362,"depth":166,"text":39363},{"id":39561,"depth":166,"text":39562,"children":41309},[41310,41311],{"id":39568,"depth":178,"text":39569},{"id":40299,"depth":178,"text":40300},{"id":40542,"depth":166,"text":40543,"children":41313},[41314,41315,41316],{"id":40549,"depth":178,"text":40550},{"id":40636,"depth":178,"text":40637},{"id":40732,"depth":178,"text":40733},{"id":40782,"depth":166,"text":40783,"children":41318},[41319,41320,41321,41322],{"id":40789,"depth":178,"text":40790},{"id":40833,"depth":178,"text":40834},{"id":40863,"depth":178,"text":40864},{"id":41105,"depth":178,"text":41106},{"id":41112,"depth":166,"text":41113,"children":41324},[41325,41326,41327,41328,41329,41330],{"id":41116,"depth":178,"text":41117},{"id":41123,"depth":178,"text":41124},{"id":41138,"depth":178,"text":41139},{"id":41145,"depth":178,"text":41146},{"id":41155,"depth":178,"text":41156},{"id":41166,"depth":178,"text":41167},{"id":41179,"depth":166,"text":41180},"Probamos Seedance 2.0 y Sora 2 con prompts idénticos. Comparativas de resultados reales, análisis fotograma a fotograma, código de API y desglose de precios.",{"head":41334,"slug":41341,"date":41342,"image":41343,"tags":41344,"keywords":41350},{"meta":41335},[41336,41339],{"name":41337,"content":41338},"og:title","Seedance 2.0 vs Sora 2 API: Pruebas en paralelo | 2026",{"name":41340,"content":41332},"og:description","seedance-2-vs-sora-2-api-comparison","2026-02-24","/seedance2-vs-sora2-hero.png",[41345,41346,41347,41348,41349],"seedance 2.0","sora 2","api de video ia","comparativa de api","generación de vídeo",[41351,41352,41353],"seedance 2.0 vs sora 2","seedance vs sora api","comparativa api video ia","/es/blog/seedance-2-vs-sora-2-api-comparison",{"title":38440,"description":41332},"es/blog/seedance-2-vs-sora-2-api-comparison","7Qm5irg4EHSOvhML-e5xhc7HCHbvA4FCjwWTrrj3UR8",1775067560273]