النماذجالأسعارالمؤسسة
أكثر من 500 واجهة برمجة تطبيقات لنماذج الذكاء الاصطناعي، الكل في واجهة واحدة. فقط في CometAPI
واجهة برمجة التطبيقات للنماذج
مطور
البدء السريعالتوثيقلوحة تحكم API
الشركة
من نحنالمؤسسة
الموارد
نماذج الذكاء الاصطناعيمدونةالسجل التاريخي للتغييراتالدعم
شروط الخدمةسياسة الخصوصية
© 2026 CometAPI · All rights reserved
Home/Models/Doubao/Doubao-Seedance-2-0
D

Doubao-Seedance-2-0

في الثانية:$0.08
Seedance 2.0 هو نموذج تأسيسي للفيديو متعدد الوسائط من الجيل التالي تابع لـ ByteDance، يركّز على توليد فيديو سردي سينمائي متعدد اللقطات. وعلى خلاف عروض تحويل النص إلى فيديو أحادية اللقطة، يؤكّد Seedance 2.0 على التحكم القائم على المراجع (صور، مقاطع قصيرة، صوت)، واتساق الشخصيات والأسلوب عبر اللقطات، ومزامنة أصلية للصوت والفيديو — بهدف جعل الفيديو القائم على الذكاء الاصطناعي مفيدًا لسير العمل الإبداعي الاحترافي وعمليات المعاينة المسبقة.
جديد
الاستخدام التجاري
نظرة عامة
الميزات
التسعير
API
الإصدارات

المواصفات التقنية لـ Doubao Seedance 2.0

العنصرالتفاصيل
عائلة المنتجعائلة توليد الفيديو Seedance من ByteDance
المُعرِّف (slug) في CometAPIdoubao-seedance-2-0
المزوّدByteDance / BytePlus ModelArk
نوع النموذجنموذج توليد الفيديو
طرائق الإدخالنص، صورة، صوت، فيديو
سعة المراجعحتى 9 صور، و3 مقاطع فيديو، و3 مقاطع صوتية ضمن طلب متعدد الوسائط واحد
نوع الإخراجفيديو MP4
دقة الإخراج480p, 720p, 1080p
نسب الأبعاد21:9, 16:9, 4:3, 1:1, 3:4, 9:16
مدة الإخراجمن 4 إلى 15 ثانية
أسلوب APIتوليد فيديو قائم على المهام وبشكل غير متزامن

ما هو Doubao Seedance 2.0؟

Doubao Seedance 2.0 هو النموذج الرائد لتوليد الفيديو متعدد الوسائط من ByteDance (أُطلق في فبراير 2026). يستخدم هندسة توليد موحّدة للصوت والفيديو بشكل مشترك، ما يتيح تحكماً دقيقاً على مستوى المخرج عبر الاستناد إلى عدة صور ومقاطع فيديو وملفات صوتية في وقت واحد. يتفوّق في إنتاج فيديوهات سينمائية مستقرة الحركة مع مزامنة صوتية أصلية — مثالي للمبدعين المحترفين الذين يحتاجون إلى فيزياء واقعية، واتساق في الشخصيات، وتركيب مشاهد معقّد.

الميزات الرئيسية لـ Seedance 2.0 على CometAPI

  • توليد متعدد الوسائط موحّد: يقبل إدخالات النص والصورة والصوت والفيديو ضمن سير عمل واحد، مما يتيح للمستخدمين توجيه المشهد بمراجع أغنى من المولّد القائم على النص فقط.
  • تحكّم بأسلوب المخرج: تم تصميم النموذج لاتباع التعليمات المتعلقة بالأداء والإضاءة والظلّ وحركة الكاميرا وإيقاع الحركة وخصائص الصوت.
  • تحرير الفيديو والتمديد: لا يقتصر Seedance 2.0 على التوليد الأولي؛ بل يدعم تحرير لقطات وشخصيات وأفعال وخطوط سرد محدّدة، إضافةً إلى التمديد للأمام/للخلف.
  • مزامنة سمعية-بصرية قوية: تشير ByteDance إلى إخراج ستيريو ثنائي القناة ومزامنة الموسيقى الخلفية والصوت المحيطي وأداء التعليق الصوتي لتحقيق نتائج أكثر غمراً.
  • قابلية تحكّم عالية للمشاهد المعقّدة: يبرز تحسين التعامل مع التفاعلات المعقّدة ومشاهد الحركة ومعقولية الفيزياء مقارنةً بـ Seedance 1.5.
  • مخرجات موجهة للإنتاج: تدعم الـ API إعدادات قابلة للضبط لنسبة الأبعاد والمدة والعلامة المائية، ما يجعل النموذج عملياً لسير عمل محتوى قابل للتكرار.

أداء القياس المرجعي

تقول ByteDance إن Seedance 2.0 يستخدم تقييم SeedVideoBench-2.0 الداخلي ويتصدّر عبر أبعاد مهام النص-إلى-فيديو، والصورة-إلى-فيديو، ومتعدد الوسائط. يحسّن النموذج جودة التوليد، والدقة الفيزيائية، والواقعية، وقابلية التحكّم مقارنةً بـ Seedance 1.5، خصوصاً في مشاهد التفاعل والحركة المعقّدة.

أوضاع Seedance 2.0 API و Seedance 2.0 Fast API على CometAPI

النموذجاسم النموذج في CometAPIالأفضل لـالاختلاف الرئيسي
Seedance 2.0doubao-seedance-2-0إنشاء فيديو متعدد الوسائط بأعلى جودةأوسع مجموعة مراجع وأقوى قابلية تحكّم ضمن عائلة Seedance 2.0.
Seedance 2.0 fastdoubao-seedance-2-0-fastإنتاج أسرع عندما يمكن التنازل قليلاً عن الجودةتقول ByteDance إنه يحتفظ بقدرات النموذج نفسها مثل Seedance 2.0، لكنه يولّد أسرع.
Seedance 1.5 Prodoubao-seedance-1-5-proإنشاء صوت-فيديو من جيل أقدميتموضع Seedance 1.5 Pro كنموذج مشترك للصوت والفيديو أصيل، بينما يوسّع Seedance 2.0 مجموعة المراجع والتحرير متعددة الوسائط.

نقاط القوة مقارنةً بالمنافسين:

  • مقابل Kling 3.0: تحكّم أفضل في المراجع متعددة الوسائط وصوت أصيل.
  • مقابل Sora 2: دقة مرجعية أعلى وقدرة على تعدد اللقطات؛ مدة قصوى أقل قليلاً.
  • مقابل Veo 3.1: أقوى في اتساق الشخصيات والالتزام بالتعليمات في سير العمل المعتمد على مراجع كثيفة؛ تتفوّق Veo في المعالجة السينمائية الخام والمقاطع الأطول.

يتفوّق في الفيديوهات المتمحورة حول الإنسان والمرتكزة على الأداء.

جرّب مولّد الفيديو بالذكاء الاصطناعي Seedance 2.0 على CometAPI

الخطوة 1: الخطوة 1: التسجيل للحصول على مفتاح API

ابدأ مباشرةً في CometAPI Playground لتجربة Doubao Seedance 2.0 دون أي إعداد أو ترميز. ما عليك سوى تسجيل الدخول إلى حساب CometAPI الخاص بك، والانتقال إلى صفحة النموذج لـ doubao-seedance-2-0، وتحميل صورك المرجعية أو مقاطع الفيديو القصيرة أو الملفات الصوتية، وإضافة وصف نصي، وتوليد فيديوهات معاينة فوراً. هذه أسرع طريقة لفهم كيفية تعاطي Seedance 2.0 مع اتساق الحركة، ومظهر الشخصيات، وحركات الكاميرا، ومزامنة الصوت الأصلية.

الخطوة 2: الحصول على وصول API لـ Seedance 2.0 على CometAPI

أنشئ مفتاح CometAPI جديداً أو استخدم مفتاحك الحالي لتمكين الوصول الكامل إلى Doubao Seedance 2.0. بعد تسجيل الدخول، انتقل إلى قسم API Token في وحدة التحكم، أنشئ مفتاحاً جديداً، وانسخه. ثم زر صفحة تفاصيل نموذج Seedance 2.0 ووثائق API على CometAPI لمراجعة المعلمات المدعومة لدمجها في مشاريعك.

الخطوة 3: أرسل طلبك الأول باستخدام Seedance 2.0 API

استخدم نقطة نهاية CometAPI لتقديم أول طلب لتوليد الفيديو مع تعليمات نصية واضحة وملفات مرجعية اختيارية (صور أو فيديو أو صوت). سيعالج النظام المهمة بشكل غير متزامن، ويعيد معرّف مهمة، ويوفّر فيديو MP4 قابل للتنزيل عند الاكتمال. بعد ذلك يمكنك تحسين التعليمات، وضبط الإعدادات، والتوسّع لإنتاج فيديوهات تسويقية، ومحتوى الشبكات الاجتماعية، وخطوط أنابيب فيديو مؤتمتة، أو تطبيقات إبداعية تعمل بـ Seedance 2.0.

يوفّر هذا سير العمل تجربة سريعة في الـ Playground وانتقالاً سلساً إلى الاستخدام الإنتاجي عبر CometAPI.

أهم الأسباب لاختيار Seedance 2.0 على CometAPI

لماذا تستخدم CometAPI لـ Seedance 2.0

  • وصول مباشر عبر API أو Playground
  • تحكّم سهل في المعلمات (المدة، الدقة، التنسيق)
  • يدعم سيرَي عمل النص-إلى-فيديو والصورة-إلى-فيديو
  • معالجة مهام مدمجة لتوليد الفيديو غير المتزامن

API موحّد وصديق للمطورين

تقدّم CometAPI نقطة نهاية نظيفة وموحّدة تعمل بسلاسة مع صيغ على نمط OpenAI أو نقاط نهاية مهام الفيديو المخصّصة. ستحصل على إنشاء مهام مباشر، واستقصاء (polling)، وتنزيلات MP4 دون التعامل مع مصادقة Volcengine المعقّدة أو القيود الإقليمية.

تسعير فعّال من حيث التكلفة

تقدّم CometAPI عادةً أسعاراً تنافسية لكل ثانية مقارنةً بالمزوّدين المباشرين، ما يتيح لك توليد فيديوهات عالية الجودة على نطاق واسع للتسويق، والشبكات الاجتماعية، أو خطوط الأنابيب المؤتمتة دون إثقال الميزانية.

اختبار سريع عبر Playground

جرّب فوراً في CometAPI Playground. حمّل صوراً ومقاطع فيديو وملفات صوتية مرجعية، عدّل التعليمات، وشاهد معاينات النتائج خلال دقائق — مثالي للتكرار على الأسلوب والحركة ومزامنة الصوت قبل الانتقال إلى الإنتاج.

باختصار، إذا أردت قوة Seedance 2.0 الإبداعية — أفضل تحكّم بالمراجع في فئته، حركة طبيعية، وصوت أصيل — دون عناء الوصول المباشر إلى ByteDance، فإن CometAPI هي حالياً واحدة من أفضل المنصّات لاستخدامه.

الأسئلة الشائعة

What kinds of inputs does Seedance 2.0 support for video generation?

يدعم Seedance 2.0 مدخلات متعددة الوسائط تشمل المطالبات النصية، حتى 9 صور، حتى 3 مقاطع فيديو قصيرة، وحتى 3 ملفات صوتية، ويمكن دمجها بحرية لإنتاج غني وقابل للتحكم.

Can Seedance 2.0 maintain character and style consistency across multiple video shots?

نعم — تم تصميم Seedance 2.0 لسرد قصصي متعدد اللقطات مترابط مع اتساق في الشخصيات والأسلوب البصري والأجواء عبر المشاهد، مما يقلل من مشكلات الانحراف الشائعة في مقاطع الفيديو المُولَّدة بالذكاء الاصطناعي.

What outputs and quality levels can I expect from Seedance 2.0 videos?

يمكن لـ Seedance 2.0 إنشاء مقاطع فيديو بدرجة سينمائية (بدقة تصل إلى 2K) مع صوت أصلي، وحوار متزامن، وتوليف حركة طبيعي، وعادةً على شكل مقاطع تتراوح بين 5–60 ثانية.

How does Seedance 2.0 handle audio and lip synchronization?

يُولد النموذج الصوت والفيديو بشكل مشترك، ويوفر تزامناً أصلياً بين الصوت والصورة مع مزامنة حركات الشفاه على مستوى الفونيمات في أكثر من 8 لغات لخطاب طبيعي ومؤثرات صوتية.

Is Seedance 2.0 suitable for professional creative projects like marketing or narrative shorts?

نعم — تجعل عناصر التحكم متعددة الوسائط، واستمرارية اللقطات المتعددة، والمخرجات عالية الجودة في Seedance 2.0 منه مناسباً لمقاطع التسويق، والأفلام القصيرة السردية، والإعلانات، وغيرها من التطبيقات المهنية.

How do referencing assets (images, video clips) work in Seedance 2.0 prompts?

يمكن للمستخدمين رفع الأصول المرجعية ثم وصف، بلغة طبيعية، كيفية تأثير كل منها في الحركة، أو حركة الكاميرا، أو العناصر الأسلوبية، ما يوفّر تحكماً دقيقاً في المحتوى المُولَّد.

Does Seedance 2.0 allow editing and extension of existing videos?

نعم — يدعم النموذج تمديد الفيديو والتحرير الموجّه مثل إضافة مشاهد، واستبدال شخصيات، أو تعديل مقاطع محددة مع الحفاظ على الأجزاء غير المحررة.

What are known limitations or typical generation lengths with Seedance 2.0?

تتراوح أطوال المخرجات النموذجية بين 5 و60 ثانية لكل فيديو، وقد يؤدي جمع الكثير من الأصول أو إعدادات الدقة العالية إلى زيادة زمن التوليد.

الميزات لـ Doubao-Seedance-2-0

استكشف الميزات الرئيسية لـ Doubao-Seedance-2-0، المصممة لتعزيز الأداء وسهولة الاستخدام. اكتشف كيف يمكن لهذه القدرات أن تفيد مشاريعك وتحسن تجربة المستخدم.

التسعير لـ Doubao-Seedance-2-0

استكشف الأسعار التنافسية لـ Doubao-Seedance-2-0، المصمم ليناسب الميزانيات المختلفة واحتياجات الاستخدام المتنوعة. تضمن خططنا المرنة أن تدفع فقط مقابل ما تستخدمه، مما يجعل من السهل التوسع مع نمو متطلباتك. اكتشف كيف يمكن لـ Doubao-Seedance-2-0 تحسين مشاريعك مع الحفاظ على التكاليف قابلة للإدارة.

doubao-seedance Video Generation Pricing

Parameters

ParameterDescription
Duration (seconds)4–15 seconds, default 5 seconds
Aspect Ratio (size)21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16, default 16:9
Resolution480p / 720p / 1080p*, default 720p

*1080p only available for doubao-seedance-1-5-pro and doubao-seedance-1-0-pro

Pricing (Per Second)

Model480p720p1080p
doubao-seedance-2-0$0.08$0.24—
doubao-seedance-2-0-fast$0.064$0.192—
doubao-seedance-1-5-pro$0.018$0.04147$0.09331
doubao-seedance-1-0-pro$0.01875$0.0432$0.0972

💡 Billed per second. Total cost = price per second × video duration (seconds). Duration range: 4–15 seconds.

نموذج الكود وواجهة برمجة التطبيقات لـ Doubao-Seedance-2-0

احصل على أكواد نماذجية شاملة وموارد API لـ Doubao-Seedance-2-0 لتبسيط عملية التكامل الخاصة بك. توفر وثائقنا التفصيلية إرشادات خطوة بخطوة، مما يساعدك على الاستفادة من الإمكانات الكاملة لـ Doubao-Seedance-2-0 في مشاريعك.
POST
/v1/videos
Python
JavaScript
Curl
import json
import os
import time

import requests

# Get your CometAPI key from https://www.cometapi.com/console/token, and paste it here
COMETAPI_KEY = os.environ.get("COMETAPI_KEY") or "<YOUR_COMETAPI_KEY>"
BASE_URL = "https://api.cometapi.com"
OUTPUT_DIR = "./output"
POLL_INTERVAL_SECONDS = 10
RETRY_DELAY_SECONDS = 5
MAX_CREATE_ATTEMPTS = 5
MAX_QUERY_ATTEMPTS = 3
TERMINAL_STATUSES = {"success", "completed", "failed", "error"}
SUCCESS_STATUSES = {"success", "completed"}

def is_progress_complete(progress):
    if isinstance(progress, int):
        return progress >= 100
    if isinstance(progress, float):
        return progress >= 100
    if isinstance(progress, str):
        try:
            return float(progress.rstrip("%")) >= 100
        except ValueError:
            return False
    return False

def is_transient_status(status_code):
    return status_code == 429 or 500 <= status_code < 600

def create_task(files):
    for attempt in range(1, MAX_CREATE_ATTEMPTS + 1):
        response = requests.post(
            f"{BASE_URL}/v1/videos",
            headers=headers,
            files=files,
            timeout=30,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_CREATE_ATTEMPTS:
            response.raise_for_status()
        print(f"Create request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to create task.")

def get_task(task_id):
    for attempt in range(1, MAX_QUERY_ATTEMPTS + 1):
        response = requests.get(
            f"{BASE_URL}/v1/videos/{task_id}",
            headers=headers,
            timeout=15,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_QUERY_ATTEMPTS:
            response.raise_for_status()
        print(f"Status request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to query task.")

if COMETAPI_KEY == "<YOUR_COMETAPI_KEY>":
    print("Set COMETAPI_KEY before running this example.")
    raise SystemExit(0)

headers = {"Authorization": f"Bearer {COMETAPI_KEY}"}

create_response = create_task(
    {
        "prompt": (None, "A slow cinematic camera push across a coastal landscape at sunrise."),
        "model": (None, "doubao-seedance-2-0"),
        "seconds": (None, "5"),
        "size": (None, "16:9"),
        "resolution": (None, "720p"),
    }
)
create_response.raise_for_status()
create_result = create_response.json()

task_id = create_result.get("id") or create_result.get("task_id")
if not task_id:
    print(json.dumps(create_result, indent=2))
    raise SystemExit("No task id returned.")

print(f"Task created: {task_id}")
print(f"Initial status: {create_result.get('status')}")

while True:
    task_response = get_task(task_id)
    task_response.raise_for_status()
    task = task_response.json()
    status = str(task.get("status") or "unknown")
    normalized_status = status.lower()
    progress = task.get("progress")
    should_try_download = normalized_status in SUCCESS_STATUSES or (
        normalized_status == "unknown" and is_progress_complete(progress)
    )

    print(f"Status: {status}, progress: {progress}")

    if should_try_download or normalized_status in TERMINAL_STATUSES:
        if should_try_download:
            video_url = task.get("video_url") or ""
            content_url = f"{BASE_URL}/v1/videos/{task_id}/content"
            output_path = os.path.join(OUTPUT_DIR, f"{task_id}.mp4")

            os.makedirs(OUTPUT_DIR, exist_ok=True)
            with requests.get(
                content_url,
                headers=headers,
                timeout=120,
                stream=True,
            ) as video_response:
                video_response.raise_for_status()
                with open(output_path, "wb") as output_file:
                    for chunk in video_response.iter_content(chunk_size=8192):
                        if chunk:
                            output_file.write(chunk)

            print(f"Video URL: {video_url}")
            print(f"Content endpoint: {content_url}")
            print(f"Saved to {output_path}")
            print(f"File size: {os.path.getsize(output_path)} bytes")
        else:
            print(json.dumps(task, indent=2))
            raise SystemExit(1)
        break

    time.sleep(POLL_INTERVAL_SECONDS)

Python Code Example

import json
import os
import time

import requests

# Get your CometAPI key from https://www.cometapi.com/console/token, and paste it here
COMETAPI_KEY = os.environ.get("COMETAPI_KEY") or "<YOUR_COMETAPI_KEY>"
BASE_URL = "https://api.cometapi.com"
OUTPUT_DIR = "./output"
POLL_INTERVAL_SECONDS = 10
RETRY_DELAY_SECONDS = 5
MAX_CREATE_ATTEMPTS = 5
MAX_QUERY_ATTEMPTS = 3
TERMINAL_STATUSES = {"success", "completed", "failed", "error"}
SUCCESS_STATUSES = {"success", "completed"}


def is_progress_complete(progress):
    if isinstance(progress, int):
        return progress >= 100
    if isinstance(progress, float):
        return progress >= 100
    if isinstance(progress, str):
        try:
            return float(progress.rstrip("%")) >= 100
        except ValueError:
            return False
    return False


def is_transient_status(status_code):
    return status_code == 429 or 500 <= status_code < 600


def create_task(files):
    for attempt in range(1, MAX_CREATE_ATTEMPTS + 1):
        response = requests.post(
            f"{BASE_URL}/v1/videos",
            headers=headers,
            files=files,
            timeout=30,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_CREATE_ATTEMPTS:
            response.raise_for_status()
        print(f"Create request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to create task.")


def get_task(task_id):
    for attempt in range(1, MAX_QUERY_ATTEMPTS + 1):
        response = requests.get(
            f"{BASE_URL}/v1/videos/{task_id}",
            headers=headers,
            timeout=15,
        )
        if response.ok:
            return response
        if not is_transient_status(response.status_code) or attempt == MAX_QUERY_ATTEMPTS:
            response.raise_for_status()
        print(f"Status request returned {response.status_code}, retrying...")
        time.sleep(RETRY_DELAY_SECONDS)

    raise SystemExit("Failed to query task.")

if COMETAPI_KEY == "<YOUR_COMETAPI_KEY>":
    print("Set COMETAPI_KEY before running this example.")
    raise SystemExit(0)

headers = {"Authorization": f"Bearer {COMETAPI_KEY}"}

create_response = create_task(
    {
        "prompt": (None, "A slow cinematic camera push across a coastal landscape at sunrise."),
        "model": (None, "doubao-seedance-2-0"),
        "seconds": (None, "5"),
        "size": (None, "16:9"),
        "resolution": (None, "720p"),
    }
)
create_response.raise_for_status()
create_result = create_response.json()

task_id = create_result.get("id") or create_result.get("task_id")
if not task_id:
    print(json.dumps(create_result, indent=2))
    raise SystemExit("No task id returned.")

print(f"Task created: {task_id}")
print(f"Initial status: {create_result.get('status')}")

while True:
    task_response = get_task(task_id)
    task_response.raise_for_status()
    task = task_response.json()
    status = str(task.get("status") or "unknown")
    normalized_status = status.lower()
    progress = task.get("progress")
    should_try_download = normalized_status in SUCCESS_STATUSES or (
        normalized_status == "unknown" and is_progress_complete(progress)
    )

    print(f"Status: {status}, progress: {progress}")

    if should_try_download or normalized_status in TERMINAL_STATUSES:
        if should_try_download:
            video_url = task.get("video_url") or ""
            content_url = f"{BASE_URL}/v1/videos/{task_id}/content"
            output_path = os.path.join(OUTPUT_DIR, f"{task_id}.mp4")

            os.makedirs(OUTPUT_DIR, exist_ok=True)
            with requests.get(
                content_url,
                headers=headers,
                timeout=120,
                stream=True,
            ) as video_response:
                video_response.raise_for_status()
                with open(output_path, "wb") as output_file:
                    for chunk in video_response.iter_content(chunk_size=8192):
                        if chunk:
                            output_file.write(chunk)

            print(f"Video URL: {video_url}")
            print(f"Content endpoint: {content_url}")
            print(f"Saved to {output_path}")
            print(f"File size: {os.path.getsize(output_path)} bytes")
        else:
            print(json.dumps(task, indent=2))
            raise SystemExit(1)
        break

    time.sleep(POLL_INTERVAL_SECONDS)

JavaScript Code Example

import fs from "fs";
import path from "path";

// Get your CometAPI key from https://www.cometapi.com/console/token, and paste it here
const api_key = process.env.COMETAPI_KEY || "<YOUR_COMETAPI_KEY>";
const base_url = "https://api.cometapi.com";
const output_dir = "./output";
const poll_interval_ms = 10_000;
const retry_delay_ms = 5_000;
const max_create_attempts = 5;
const max_query_attempts = 3;
const terminal_statuses = new Set(["success", "completed", "failed", "error"]);
const success_statuses = new Set(["success", "completed"]);

function is_progress_complete(progress) {
  if (typeof progress === "number") {
    return progress >= 100;
  }

  if (typeof progress === "string") {
    const numeric = Number(progress.replace(/%$/, ""));
    return Number.isFinite(numeric) && numeric >= 100;
  }

  return false;
}

function is_transient_status(status) {
  return status === 429 || status >= 500;
}

async function fetch_with_retry(url, options, attempts, label) {
  for (let attempt = 1; attempt <= attempts; attempt += 1) {
    const response = await fetch(url, options);
    if (response.ok) {
      return response;
    }

    if (!is_transient_status(response.status) || attempt === attempts) {
      return response;
    }

    console.log(`${label} returned ${response.status}, retrying...`);
    await new Promise((resolve) => setTimeout(resolve, retry_delay_ms));
  }

  throw new Error(`${label} failed`);
}

if (api_key === "<YOUR_COMETAPI_KEY>") {
  console.log("Set COMETAPI_KEY before running this example.");
  process.exit(0);
}

const headers = {
  Authorization: `Bearer ${api_key}`,
};

const form = new FormData();
form.set("prompt", "A slow cinematic camera push across a coastal landscape at sunrise.");
form.set("model", "doubao-seedance-2-0");
form.set("seconds", "5");
form.set("size", "16:9");
form.set("resolution", "720p");

const create_response = await fetch_with_retry(`${base_url}/v1/videos`, {
  method: "POST",
  headers,
  body: form,
}, max_create_attempts, "Create request");

if (!create_response.ok) {
  console.log(await create_response.text());
  process.exit(1);
}

const create_result = await create_response.json();
const task_id = create_result.id || create_result.task_id;

if (!task_id) {
  console.log(JSON.stringify(create_result, null, 2));
  process.exit(1);
}

console.log(`Task created: ${task_id}`);
console.log(`Initial status: ${create_result.status}`);

while (true) {
  const task_response = await fetch_with_retry(`${base_url}/v1/videos/${task_id}`, {
    headers,
  }, max_query_attempts, "Status request");

  if (!task_response.ok) {
    console.log(await task_response.text());
    process.exit(1);
  }

  const task = await task_response.json();
  const status = String(task.status || "unknown");
  const normalized_status = status.toLowerCase();
  const progress = task.progress;
  const should_try_download = success_statuses.has(normalized_status) || (
    normalized_status === "unknown" && is_progress_complete(progress)
  );

  console.log(`Status: ${status}, progress: ${progress}`);

  if (should_try_download || terminal_statuses.has(normalized_status)) {
    if (should_try_download) {
      const video_url = task.video_url || "";
      const content_url = `${base_url}/v1/videos/${task_id}/content`;
      const output_path = path.join(output_dir, `${task_id}.mp4`);

      if (!fs.existsSync(output_dir)) {
        fs.mkdirSync(output_dir, { recursive: true });
      }

      const video_response = await fetch(content_url, { headers });
      if (!video_response.ok) {
        console.log(await video_response.text());
        process.exit(1);
      }

      const video_buffer = Buffer.from(await video_response.arrayBuffer());
      fs.writeFileSync(output_path, video_buffer);

      console.log(`Video URL: ${video_url}`);
      console.log(`Content endpoint: ${content_url}`);
      console.log(`Saved to ${output_path}`);
      console.log(`File size: ${fs.statSync(output_path).size} bytes`);
    } else {
      console.log(JSON.stringify(task, null, 2));
      process.exit(1);
    }
    break;
  }

  await new Promise((resolve) => setTimeout(resolve, poll_interval_ms));
}

Curl Code Example

#!/bin/bash

set -euo pipefail

# Get your CometAPI key from https://www.cometapi.com/console/token
# Export it as: export COMETAPI_KEY="your-key-here"

if [[ -z "${COMETAPI_KEY:-}" ]]; then
  echo "Set COMETAPI_KEY before running this example."
  exit 0
fi

BASE_URL="https://api.cometapi.com"
OUTPUT_DIR="./output"
POLL_INTERVAL_SECONDS=10
RETRY_DELAY_SECONDS=5
MAX_CREATE_ATTEMPTS=5
MAX_QUERY_ATTEMPTS=3

is_progress_complete() {
  local progress="$1"
  local normalized="${progress%%%}"

  if [[ -z "$normalized" ]]; then
    return 1
  fi

  [[ "$normalized" =~ ^[0-9]+([.][0-9]+)?$ ]] || return 1
  awk -v value="$normalized" 'BEGIN { exit !(value >= 100) }'
}

create_task() {
  local attempt=1
  while (( attempt <= MAX_CREATE_ATTEMPTS )); do
    local response
    local status_code
    response=$(curl -sS -w $'\n%{http_code}' "${BASE_URL}/v1/videos" \
      -H "Authorization: Bearer $COMETAPI_KEY" \
      -F 'prompt="A slow cinematic camera push across a coastal landscape at sunrise."' \
      -F 'model="doubao-seedance-2-0"' \
      -F 'seconds="5"' \
      -F 'size="16:9"' \
      -F 'resolution="720p"')

    status_code=$(echo "$response" | tail -n 1)
    CREATE_RESPONSE=$(echo "$response" | sed '$d')

    if [[ "$status_code" =~ ^2 ]]; then
      return 0
    fi

    if [[ "$status_code" == "429" || "$status_code" =~ ^5 ]] && (( attempt < MAX_CREATE_ATTEMPTS )); then
      echo "Create request returned ${status_code}, retrying..."
      sleep "$RETRY_DELAY_SECONDS"
      (( attempt += 1 ))
      continue
    fi

    echo "$CREATE_RESPONSE"
    return 1
  done
}

get_task() {
  local task_id="$1"
  local attempt=1
  while (( attempt <= MAX_QUERY_ATTEMPTS )); do
    local response
    local status_code
    response=$(curl -sS -w $'\n%{http_code}' "${BASE_URL}/v1/videos/${task_id}" \
      -H "Authorization: Bearer $COMETAPI_KEY")

    status_code=$(echo "$response" | tail -n 1)
    TASK_RESPONSE=$(echo "$response" | sed '$d')

    if [[ "$status_code" =~ ^2 ]]; then
      return 0
    fi

    if [[ "$status_code" == "429" || "$status_code" =~ ^5 ]] && (( attempt < MAX_QUERY_ATTEMPTS )); then
      echo "Status request returned ${status_code}, retrying..."
      sleep "$RETRY_DELAY_SECONDS"
      (( attempt += 1 ))
      continue
    fi

    echo "$TASK_RESPONSE"
    return 1
  done
}

create_task

TASK_ID=$(echo "$CREATE_RESPONSE" | jq -r '.id // .task_id // empty')

if [[ -z "$TASK_ID" ]]; then
  echo "$CREATE_RESPONSE" | jq .
  echo "No task id returned."
  exit 1
fi

echo "Task created: $TASK_ID"
echo "Initial status: $(echo "$CREATE_RESPONSE" | jq -r '.status // empty')"

while true; do
  get_task "$TASK_ID"

  STATUS=$(echo "$TASK_RESPONSE" | jq -r '.status // empty')
  NORMALIZED_STATUS=$(echo "$STATUS" | tr '[:upper:]' '[:lower:]')
  PROGRESS=$(echo "$TASK_RESPONSE" | jq -r '.progress // empty')
  SHOULD_TRY_DOWNLOAD=0

  if [[ "$NORMALIZED_STATUS" == "success" || "$NORMALIZED_STATUS" == "completed" ]]; then
    SHOULD_TRY_DOWNLOAD=1
  elif [[ "$NORMALIZED_STATUS" == "unknown" ]] && is_progress_complete "$PROGRESS"; then
    SHOULD_TRY_DOWNLOAD=1
  fi

  echo "Status: ${STATUS}, progress: ${PROGRESS}"

  if [[ "$SHOULD_TRY_DOWNLOAD" == "1" || "$NORMALIZED_STATUS" == "failed" || "$NORMALIZED_STATUS" == "error" ]]; then
    if [[ "$SHOULD_TRY_DOWNLOAD" == "1" ]]; then
      VIDEO_URL=$(echo "$TASK_RESPONSE" | jq -r '.video_url // empty')
      CONTENT_URL="${BASE_URL}/v1/videos/${TASK_ID}/content"
      OUTPUT_PATH="${OUTPUT_DIR}/${TASK_ID}.mp4"

      mkdir -p "$OUTPUT_DIR"
      curl -fsS "$CONTENT_URL" \
        -H "Authorization: Bearer $COMETAPI_KEY" \
        -o "$OUTPUT_PATH"

      if [[ ! -s "$OUTPUT_PATH" ]]; then
        echo "Failed to download video"
        exit 1
      fi

      echo "Video URL: ${VIDEO_URL}"
      echo "Content endpoint: ${CONTENT_URL}"
      echo "Saved to ${OUTPUT_PATH}"
      echo "File size: $(wc -c < "$OUTPUT_PATH" | tr -d ' ') bytes"
    else
      echo "$TASK_RESPONSE" | jq .
      exit 1
    fi
    break
  fi

  sleep "$POLL_INTERVAL_SECONDS"
done

إصدارات Doubao-Seedance-2-0

قد تشمل الأسباب وراء احتواء Doubao-Seedance-2-0 على لقطات متعددة عوامل محتملة مثل اختلاف المخرجات بعد التحديثات التي تتطلب اللقطات القديمة لضمان الاتساق، وتوفير فترة انتقالية للمطورين للتكيف والهجرة، وارتباط اللقطات المختلفة بنقاط النهاية العالمية أو الإقليمية لتحسين تجربة المستخدم. للاطلاع على الاختلافات التفصيلية بين الإصدارات، يرجى الرجوع إلى الوثائق الرسمية.
version
doubao-seedance-2-0
doubao-seedance-2-0-fast

المزيد من النماذج

O

Sora 2 Pro

في الثانية:$0.24
Sora 2 Pro هو نموذج توليد الوسائط الأكثر تقدمًا وقوة لدينا، وقادر على توليد مقاطع فيديو بصوت متزامن. يمكنه إنشاء مقاطع فيديو مفصلة وديناميكية بالاعتماد على اللغة الطبيعية أو الصور.
O

Sora 2

في الثانية:$0.08
نموذج توليد فيديو فائق القوة، مع مؤثرات صوتية، ويدعم نمط المحادثة.
M

mj_fast_video

لكل طلب:$0.6
Midjourney video generation
X

Grok Imagine Video

في الثانية:$0.04
أنشئ مقاطع فيديو من موجهات نصية، حرّك الصور الثابتة، أو عدّل مقاطع الفيديو الموجودة باستخدام اللغة الطبيعية. تدعم واجهة برمجة التطبيقات (API) ضبط المدة ونسبة العرض إلى الارتفاع والدقة لمقاطع الفيديو المولدة — مع تولّي حزمة تطوير البرمجيات (SDK) الاستقصاء الدوري غير المتزامن تلقائيًا.
G

Veo 3.1 Pro

في الثانية:$0.25
يشير Veo 3.1-Pro إلى وصول/تكوين عالي الإمكانات لعائلة Veo 3.1 من Google — وهو جيل من نماذج الفيديو القصيرة المزوّدة بدعم صوتي، والتي تضيف صوتًا أصليًا أكثر ثراءً، وعناصر تحكم سردية/تحريرية محسّنة، وأدوات لتوسيع المشاهد.
G

Veo 3.1

في الثانية:$0.05
Veo 3.1 هو تحديث تدريجي لكنه مهم من Google لعائلة Veo للنص والصورة→فيديو، ويضيف صوتًا أصليًا أكثر ثراءً، ومخرجات فيديو أطول وأكثر قابلية للتحكم، وتحريرًا أدق وضوابط على مستوى المشهد.

مدونات ذات صلة

كيفية استخدام Seedance 2.0 API
Apr 17, 2026

كيفية استخدام Seedance 2.0 API

Seedance 2.0 API هو أحدث نموذج متعدد الوسائط لتوليد الفيديو بالذكاء الاصطناعي من ByteDance (أُطلق في 9 أبريل 2026). يقبل النصوص والصور ومقاطع الفيديو والصوت في طلب واحد لإنتاج مقاطع فيديو MP4 سينمائية مدتها 4–15 ثانية مع مزامنة صوتية أصلية، وتحكم بالكاميرا على مستوى المخرج، واتساق استثنائي للحركة. لاستخدامه: سجّل على CometAPI.com، واحصل على مفتاح API، وقدّم مهمة غير متزامنة عبر REST، واستعلم دوريًا عن الاكتمال، ونزّل عنوان URL للفيديو.
ما هو HappyHorse-1.0؟ كيفية مقارنة Seedance 2.0؟
Apr 11, 2026
seedance-2-0

ما هو HappyHorse-1.0؟ كيفية مقارنة Seedance 2.0؟

تعرّف على ماهية HappyHorse-1.0، ولماذا تصدّر لوحة صدارة الفيديو لدى Artificial Analysis، وكيف يقارن بـ Seedance 2.0، وماذا تعني أحدث التصنيفات لتوليد الفيديو بالذكاء الاصطناعي.
ما هو Seedance 2.0؟ تحليل شامل
Mar 24, 2026
seedance-2-0

ما هو Seedance 2.0؟ تحليل شامل

Seedance 2.0 هو نموذج من الجيل التالي لتوليد الفيديو متعدد الوسائط بالذكاء الاصطناعي طورته ByteDance، ويمكنه توليد مقاطع فيديو سينمائية عالية الجودة انطلاقًا من النصوص والصور والصوت ومقاطع الفيديو المرجعية. يتميز بالتوليد المشترك للصوت والفيديو، واستقرار الحركة، والتحرير القائم على المرجع، وقد صعد بسرعة في المعايير المرجعية العالمية مثل لوحة صدارة Artificial Analysis، ما يضعه ضمن أفضل نماذج الفيديو بالذكاء الاصطناعي في عام 2026.