דילוג לתוכן
תיעוד Nodaro
תיעודמדריך הרכיביםמודליםתבניותסוכני AI (MCP)מפתחיםאירוח עצמימחקרהשוואות
REST API

ה-API של Nodaro Motion

Nodaro Motion מחליף את האנשים, חיות המחמד, המוצרים או המיקום בסרטון של 4–30 שניות בתמונות שלכם, ב-REST API, ב-SDK או ב-MCP, ושומר על התנועה.

זמין ב-Nodaro Cloud

ה-API של Nodaro Motion מחליף את האנשים, חיות המחמד, המוצרים או המיקום בסרטון קצר בתמונות הייחוס שלכם. הסרטון שומר על התנועה, המסגור, התזמון והסאונד שלו: האודיו של הקליפ נשמר, והתוצאה ארוכה כמו הקליפ. מקבלים אומדן מחיר להרצה בחינם, מתחילים אותה ובודקים את מצב המשימה שלה כמו בכל משימה אחרת.

בעבר Nodaro Motion נקרא Cast Swap. הנתיבים שלו נשארו תחת /v1/cast-swap. כלי ה-MCP עדיין נקרא cast_swap, ומרחב השמות ב-SDK הוא עדיין client.castSwap.

Nodaro Motion רץ רק ב-Nodaro Cloud. בהתקנה באירוח עצמי, כל נתיב של Nodaro Motion מחזיר 404. הנתיבים מקבלים אסימון Bearer. ראו את דף ה-API אימות.

נקודות קצה

שיטהנתיבמה היא עושהעלות
POST/v1/cast-swap/estimateאומדן מחיר להרצה. שום דבר לא נוצר ולא משוריין.חינם
POST/v1/cast-swapהתחלת הרצה. מחזירה 202 { jobId }. בדקו את מצב המשימה עם GET /v1/jobs/:id.מחיר ההרצה לפי האומדן
POST/v1/cast-swap/:jobId/full-quality/estimateאומדן מחיר לגרסת האיכות המלאה של הרצת טיוטה, או של הרצה של Nodaro Motion Pulse ב-720p. שום דבר לא נוצר ולא משוריין.חינם
POST/v1/cast-swap/:jobId/full-qualityהשלמת הרצה ב-1080p, כמשימה חדשה. ראו את הסעיף איכות מלאה.מחיר ההרצה לפי האומדן
GET/v1/cast-swap/style-choiceמציינת לכל מנוע אם אתם בוחרים את ה-style של הרצה או ש-Nodaro קיבע אותו, אם המנוע מקבל הרצות של סגנון בלבד, ואם הרצה בסגנון המדויק מקבלת סגנון אמנותי. ציבורית: לא צריך להתחבר. ראו את הסעיף סגנון.חינם
GET/v1/cast-swap/advancedמציינת אם הדף של Nodaro Motion מציג את האפשרויות המתקדמות שלו. ציבורית: לא צריך להתחבר. ראו את הסעיף סגנון.חינם

גוף הבקשה

שני הנתיבים מקבלים את אותו גוף בקשה.

שדהמה הוא עושה
videoUrlנדרש. קליפ המקור, באורך 4–30 שניות.
rolesנדרש. עד 6 תפקידים של אנשים, תפקיד אחד של מיקום, 3 תפקידים של חיות מחמד ו-3 תפקידים של מוצרים. פרטים בהמשך.
referencesאופציונלי. עד 5 ייחוסים קבועים: דברים שהסרטון צריך להראות ושאף תפקיד לא מחליף. ראו את הסעיף ייחוסים קבועים.
prePromptאופציונלי. טקסט משלכם שמוצב בתחילת הפרומפט, לפני ההוראות של התפקידים. חלים עליו אותה מגבלה ואותם אזכורי {role:N} כמו על postPrompt.
postPromptאופציונלי. טקסט משלכם למודל, עד 4,000 תווים. כדי להזכיר תפקיד, כתבו {role:N}, כש-N נספר מ-1 לפי הסדר ב-roles, כולל תפקידים ריקים.
previewאופציונלי. הערך true מרנדר 4 שניות מהקליפ, החל מ-previewStart.
previewStartאופציונלי. הנקודה שבה התצוגה המקדימה מתחילה, בשניות. ברירת המחדל היא 0.
engineאופציונלי. המנוע: "motion-prism" (Nodaro Motion Prism), ברירת המחדל, או "motion-pulse" (Nodaro Motion Pulse). ראו את הסעיף מנועים.
styleאופציונלי. איך ההרצה עוקבת אחרי הקליפ: "precise", ברירת המחדל, או "motion". ראו את הסעיף סגנון.
directionאופציונלי, ב-Nodaro Motion Prism בלבד. סגנון אמנותי, { style: "<id>" }, כשהמזהה הוא אחד המזהים בקטלוג של הבורר סגנון. ראו את הסעיף סגנונות אמנותיים.
motionLengthאופציונלי, ב-Nodaro Motion Pulse בלבד. איפה הקליפ נחתך לשניות שלמות: "cut-end", ברירת המחדל, או "cut-start".
resolutionאופציונלי. "480p", ברירת המחדל, "720p" או "1080p". ב-Nodaro Motion Pulse: "720p", ברירת המחדל שלו, או "1080p".
draftאופציונלי. מרנדר טיוטה. מופעל כברירת מחדל ב-480p וכבוי מעל זה. הערך true מעל 480p נדחה. ל-Nodaro Motion Pulse אין טיוטה.
prepareReferencesאופציונלי. ברירת המחדל היא true. ראו את הסעיף הכנת הייחוסים.
qualityמיושן. הערך "draft" עדיין עובד, ופירושו טיוטה ב-480p. השתמשו במקומו ב-resolution וב-draft.
sessionId, originאופציונלי. הסשן שבו התוצאה תישמר, ותווית המקור של האפליקציה שלכם.

תפקיד מציין מישהו, משהו או את המקום שבסרטון, ומקבל 0–3 תמונות של נושא אחד או של מקום אחד. בקשה מקבלת לכל היותר 30 תמונות בסך הכול.

  • אדם: { kind: "person", name?, images, body?, outfit?, hair? }. השדה name מציין מי בסרטון, למשל "the woman dancing" (האישה שרוקדת).
  • חיית מחמד: { kind: "pet", name?, images, body?, coat? }.
  • מוצר: { kind: "product", name?, images, shape?, finish? }.
  • המיקום: { kind: "location", name?, images }. שם ברירת המחדל הוא "the setting" (מקום ההתרחשות).

תפקיד של אדם, חיית מחמד או מוצר יכול להשמיט את name או לשלוח אותו ריק. התפקיד מקבל אז שם לפי התמונה הראשונה שלו, ומותאם לנושא בסרטון שמתאים לו ביותר. תפקיד כזה צריך לפחות תמונה אחת. השדה name מוגבל ל-200 תווים. לתפקידים של הרצת טרנד יש תמיד שם.

הערך של כל תכונה (body, outfit, hair, coat, shape, finish) הוא "new", ברירת המחדל, שלוקח את התכונה מהתמונות שלכם, או "original", ששומר עליה כמו בסרטון.

תפקיד בלי תמונות (מערך ריק או null) שומר על הנושא או על המקום כמו בסרטון. נדרש לפחות אחד מאלה: תפקיד עם תמונות, ייחוס, prePrompt או postPrompt, או סגנון אמנותי. סגנון אמנותי נחשב רק בהרצה של סגנון בלבד (ראו את הסעיף סגנונות אמנותיים).

כל תפקיד יכול לקבל גם שתי הגדרות שחלות רק על תצוגה מקדימה. הרצה מלאה מתעלמת משתיהן.

  • השדה previewName הוא השם שמשמש במקום name בתצוגה מקדימה.
  • הערך inPreview: false משאיר את התפקיד מחוץ לתצוגה המקדימה. התמונות שלו לא נשלחות ולא עוברות הכנה, ולא משלמים עליהן. אזכור {role:N} שומר על המספר שלו ומקבל את הערך של previewName של התפקיד, או, אם אין כזה, את name שלו.
{
  "videoUrl": "https://example.com/clip.mp4",
  "roles": [
    { "kind": "person", "name": "the woman dancing", "images": ["https://example.com/me.jpg"], "outfit": "original" }
  ],
  "preview": true
}

מנועים

השדה engine בוחר את המנוע שמפיק את התוצאה. השמיטו אותו כדי להישאר עם Nodaro Motion Prism.

מנוערזולוציותטיוטהאיכות מלאה
"motion-prism", Nodaro Motion Prism (ברירת המחדל)480p (ברירת המחדל), 720p, 1080pכן, ב-480pמרנדר מחדש ב-1080p את הטייק של הטיוטה עצמה
"motion-pulse", Nodaro Motion Pulse720p (ברירת המחדל), 1080pלאיוצר טייק חדש ב-1080p מהקלטים של הרצה ב-720p
  • Nodaro Motion Pulse יוצר טייק חדש לפי הקליפ והתמונות שלכם.
  • ב-Nodaro Motion Pulse, הערך draft: true נדחה עם draft_unsupported, והערך "480p" נדחה עם resolution_unsupported.
  • Nodaro Motion Pulse מרנדר שניות שלמות, ולכן הקליפ נחתך לשניות שלמות. השדה motionLength קובע איפה: הערך "cut-end" משמיט את שבר השנייה שבסוף, והערך "cut-start" משמיט אותו בהתחלה. Nodaro Motion Prism מתעלם מ-motionLength.
  • בשני המנועים, תצוגה מקדימה היא 4 שניות החל מ-previewStart.
  • Nodaro Motion Pulse מקבל לכל היותר 10 תמונות להרצה, בכל התפקידים והייחוסים הקבועים יחד. בקשה עם יותר תמונות נדחית עם too_many_images. Nodaro Motion Prism מקבל עד 30.
  • המשימה רושמת את המנוע שלה ב-input_data.engine, והפלט של משימה שהושלמה מציין אותו ב-engine.
  • מזהי המנועים שלקוחות ישנים שלחו עדיין מתקבלים בגוף הבקשה, ונחשבים ל-Nodaro Motion Prism ול-Nodaro Motion Pulse. בינתיים, הרשומה של משימה והאומדן של הנתיב הזה עדיין יכולים לציין את המנוע לפי המזהה הקודם שלו. נתיבי הטרנדים משתמשים תמיד במזהים שלמעלה.

סגנון

השדה style קובע איך ההרצה עוקבת אחרי הקליפ. השמיטו אותו כדי להישאר בסגנון המדויק.

  • הערך "precise", ברירת המחדל, עוקב אחרי הקליפ בדיוק.
  • הערך "motion" עוקב אחרי התנועה שבקליפ ולוקח את המראה של האנשים, חיות המחמד והמוצרים מהתמונות שלכם. סגנון התנועה עוקב אחרי הקליפ בחופשיות רבה יותר מהסגנון המדויק.

שני הסגנונות שומרים על הסאונד ועל האורך של הקליפ. המחיר של סגנון התנועה יכול להיות שונה מהמחיר של הסגנון המדויק. שלחו את אותו style ל-POST /v1/cast-swap/estimate כדי לראות את המחיר המדויק.

המשימה רושמת את ה-style ששלחתם ב-input_data.style. כשהשמטתם את style, השדה לא קיים, ופירוש הדבר הוא הסגנון המדויק. הרצת טרנד מתעלמת מ-style, כי הטרנד קובע אותו.

Nodaro יכול לקבע את הסגנון של מנוע לכולם: תמיד הסגנון המדויק או תמיד סגנון התנועה. כל הרצה וכל אומדן במנוע הזה משתמשים אז בסגנון הזה, בלי קשר לערך של style. הנתיב GET /v1/cast-swap/style-choice מציין לכל מנוע מה המצב, ולא דורש התחברות:

{ "engines": { "motion-prism": "user", "motion-pulse": "precise" } }

כל ערך הוא "user" (אתם בוחרים, כמו שמתואר למעלה), "precise" או "flex" (סגנון התנועה, כלומר style: "motion"). הציגו באפליקציה שלכם בחירת סגנון רק למנוע שהתשובה עבורו היא "user".

באותה תשובה יש עוד שלוש מפות, כל אחת בצורה { "motion-prism": boolean, "motion-pulse": boolean }:

  • השדה styleOnly מציין אם המנוע מקבל הרצות של סגנון בלבד. ראו את הסעיף סגנונות אמנותיים.
  • השדה preciseArtStyle מציין אם הרצה בסגנון המדויק מקבלת סגנון אמנותי במנוע הזה.
  • השדה preciseArtStyleAlone מציין אם במנוע הזה סגנון אמנותי לבדו יכול להיות השינוי של הרצה בסגנון המדויק, בלי תפקיד, ייחוס או פרומפט. הערך שלו הוא false עד שהמנוע יקבל הרצות כאלה. Nodaro עשוי להריץ בקשה כזו כהרצה בסגנון התנועה, והמפה הזו לא מציינת זאת. ראו את הסעיף סגנון אמנותי בהרצה בסגנון המדויק.

שלוש המפות תלויות רק במנוע, ולכן בדקו אותן יחד עם engines. ב-Nodaro Motion Pulse הערך תמיד false בשלושתן. שרת מגרסה שקדמה להן משמיט אותן: התייחסו לכך כאל false לכל מנוע. במנוע שהתשובה עבורו היא "precise", בקשה שאין בה שום דבר אחר לשנות נדחית עם 400 validation_error. כשיש בה משהו אחר לשנות, כגון תפקיד עם תמונות, ייחוס קבוע, prePrompt או postPrompt, היא רצה ומתומחרת כהרצה בסגנון המדויק. היא שומרת על הסגנון האמנותי כש-preciseArtStyle הוא true. Nodaro עשוי ליצור הרצה בסגנון המדויק עם סגנון אמנותי באותה דרך שבה נוצרת הרצה בסגנון התנועה. כל עוד הוא עושה זאת, בקשה ששומרת על סגנון אמנותי במנוע כזה נוצרת ומתומחרת כהרצה בסגנון התנועה, והמשימה שלה רושמת את הסגנון ששלחתם. בקשה עם style: "motion" לא נדרסת אז בכלל, ולכן אין בתשובה styleForced. אז גם בקשה שאין בה שום דבר אחר לשנות מתקבלת.

התשובה עשויה לפגר בדקה לכל היותר. הטרנדים לא מושפעים.

האפשרויות המתקדמות בדף של Nodaro Motion. הדף של Nodaro Motion מציע שני שדות של גוף הבקשה, prepareReferences ו-prePrompt, רק תחת האפשרויות המתקדמות שלו. האפשרויות האלה מוסתרות, אלא אם Nodaro מפעיל אותן, בהגדרה אחת לכל הדף ולכל המנועים. הנתיב GET /v1/cast-swap/advanced לא דורש התחברות ומחזיר { show: boolean }, כך שאפליקציה שבנויה על ה-API הזה יכולה להציג או להסתיר את אותן אפשרויות. התשובה מתארת רק את הדף: כל הרצה וכל אומדן מקבלים את prepareReferences ואת prePrompt, בלי קשר למה שהיא אומרת. התשובה עשויה לפגר בדקה לכל היותר. ל-SDK עדיין אין מתודה בשבילה, ולכן קראו לנתיב עם client.request().

כל עוד האופן שבו Nodaro מכין הרצות בסגנון התנועה במנוע מגביל את הקליפ, הרצה מלאה בסגנון התנועה נדחית עם clip_too_long_for_style כשהקליפ ארוך מ-27.9 שניות. ב-Nodaro Motion Pulse, האורך נמדד אחרי שהקליפ נחתך לשניות שלמות. תצוגה מקדימה לא מוגבלת.

סגנונות אמנותיים

השדה direction: { style: "<id>" } מצייר את הסרטון בסגנון אמנותי, כגון pop-art. המזהה הוא אחד המזהים בקטלוג של הבורר סגנון. רק Nodaro Motion Prism מקבל סגנון אמנותי. Nodaro Motion Pulse דוחה סגנון אמנותי עם 400 art_style_needs_prism.

עיצוב מחדש של קליפ שלם (סגנון בלבד). הרצה בסגנון התנועה (style: "motion") יכולה לקבל סגנון אמנותי בלי שום דבר להחלפה: בלי תפקיד עם תמונות ובלי ייחוס קבוע. ההרצה עדיין מתקבלת, כי הסגנון האמנותי הוא השינוי שלה. הטקסט ב-prePrompt או ב-postPrompt עדיין מתווסף. ההרצה מעצבת מחדש את הקליפ כולו ושומרת על האנשים, המקומות, התנועה והסאונד.

  • ההרצה מחויבת לפי מה שהיא מריצה: התשלום הבסיסי והסרטון, בלי החלק privacy. החלק referenceAudio מופיע רק כשההגדרה של Nodaro למנוע מריצה את השלב הזה, והחלק prompt רק כשההגדרה נותנת למודל שפה לכתוב את הפרומפט. שלחו את אותו גוף בקשה ל-POST /v1/cast-swap/estimate כדי לראות את המחיר.
  • כברירת מחדל, סגנון אמנותי בשחור־לבן יוצא מונוכרומטי. Nodaro עשוי במקום זאת להריץ הרצות כאלה כמו שהוא מריץ הרצות אחרות עם סגנון אמנותי, באותו מחיר שלהן ובלי להפוך אותן למונוכרומטיות.
  • תצוגה מקדימה עוברת באותו מסלול כמו ההרצה המלאה שלה. תצוגה מקדימה שמשאירה בחוץ את כל התפקידים עם תמונות (inPreview: false) עוברת במסלול של ההרצה המלאה שלה, והסגנון האמנותי נחשב לשינוי של התצוגה המקדימה.
  • הציעו את האפשרות הזו רק כש-GET /v1/cast-swap/style-choice מחזיר styleOnly: true למנוע. כל עוד התשובה עבור Nodaro Motion Prism היא false, סגנון אמנותי בלי שום דבר אחר לשנות נדחה עם 400 validation_error. סגנון אמנותי עם prePrompt או postPrompt מתקבל, אבל רץ כמו כל הרצה אחרת עם סגנון אמנותי.
  • ההרצה עדיין חייבת להיות בסגנון התנועה. במנוע שהתשובה עבורו היא "precise", הבקשה נדחית עם 400 validation_error, או רצה בסגנון המדויק כשיש בה משהו אחר לשנות.

סגנון אמנותי בהרצה בסגנון המדויק. כש-GET /v1/cast-swap/style-choice מחזיר preciseArtStyle: true למנוע, גם הרצה בסגנון המדויק מקבלת סגנון אמנותי. Nodaro עשוי ליצור אותה באותה דרך שבה נוצרת הרצה בסגנון התנועה, שבה הסגנון האמנותי נשמר על פני התמונה כולה באופן אמין הרבה יותר. במקרה כזה:

  • המשימה עדיין רושמת את הסגנון ששלחתם: השדה input_data.style לא קיים, או שהערך שלו הוא "precise". מי שמקבל את המשימה שוב, או שולח שוב את אותו גוף בקשה, מבקש את אותה הרצה.
  • האומדן שלה (כשהוא נשלח עם אותו גוף בקשה), המחיר שלה, האיכות המלאה שלה וההתנהגות שלה כהרצה של סגנון בלבד הם של הרצה בסגנון התנועה.
  • כשאין בה שום דבר אחר לשנות, היא מתקבלת כהרצה של סגנון בלבד.
  • הנתיב style-choice לא מציג איזה מהמקרים חל. בדקו את האומדן כדי לדעת כמה הרצה עולה.
  • משימות שנוצרו כך לפני שהסגנון נשמר רושמות input_data.style: "motion".

אחרת, ההרצה נוצרת כהרצה בסגנון המדויק: הקליפ נערך והאנשים מוחלפים כמו בסגנון המדויק, וכל הסרטון מצויר בסגנון האמנותי. במקרה הזה:

  • הסגנון האמנותי לבדו לא נחשב כאן לשינוי. הרצה בסגנון המדויק בלי תפקיד עם תמונות, בלי ייחוס קבוע, בלי prePrompt ובלי postPrompt עדיין נדחית עם 400 validation_error. כדי רק לעצב מחדש קליפ שלם, השתמשו בהרצה בסגנון התנועה (סגנון בלבד, למעלה).
  • המחיר משתנה רק כשההגדרה של Nodaro להרצות האלה מציירת קודם מחדש את התמונות של התפקידים בסגנון האמנותי. האומדן, כשהוא נשלח עם אותו גוף בקשה, מציג זאת.
  • המשימה רושמת את הסגנון האמנותי ב-input_data.direction.
  • כש-preciseArtStyle הוא false, או כששרת מגרסה שקדמה לו משמיט אותו, הרצה בסגנון המדויק עם סגנון אמנותי נדחית עם 400 art_style_needs_flex.

מזהה שלא נמצא בקטלוג נדחה עם 400 unknown_art_style, ומודבורד שמור נדחה עם 400 art_style_not_supported. הקוד 400 art_style_needs_flex מוחזר גם לסגנון אמנותי בהרצת טרנד, ובהרצה בסגנון התנועה שההגדרה של Nodaro כותבת לה פרומפט של הסגנון המדויק. ההגדרה הזו היא לא הסגנון המקובע, והנתיב style-choice לא מציג אותה.

ייחוסים קבועים

ב-references יש עד 5 דברים שהסרטון צריך להראות ושאף תפקיד לא מחליף. כל אחד מהם בצורה { images, line }:

  • ב-images יש 1–3 תמונות של דבר אחד.
  • השדה line מתאר מה הדבר הזה, בין 1 ל-500 תווים, למשל "the glass she drinks from" (הכוס שממנה היא שותה).
  • המשתנה {image} בשורה מייצג את התמונה הראשונה של הייחוס הזה, למשל "Use {image} for the sky" (השתמש ב-{image} לשמיים). בשורה בלי {image}, Nodaro מוסיף אותו בסוף.

הייחוסים נשלחים כמו שהם, ואף פעם לא עוברים הכנה. התמונות שלהם נספרות במגבלה של 30. ייחוס לבדו מספיק להרצה: אף תפקיד לא צריך תמונות. שורה לא יכולה להזכיר תפקיד עם {role:N}, כי שורה מתארת את הדבר עצמו.

הכנת הייחוסים

אלא אם prepareReferences הוא false, מודל תמונה הופך קודם את התמונות של כל תפקיד של אדם, חיית מחמד או מוצר לתמונת ייחוס נקייה אחת. הסרטון נוצר אז מהתמונות האלה.

  • ההכנה עולה קרדיטים נוספים, שמוצגים באומדן כ-breakdown.references. הקרדיטים האלה נגבים כשההכנה רצה, גם אם הסרטון נכשל אחר כך.
  • ההכנה מוסיפה כדקה.
  • אם אי אפשר ליצור את התמונה של תפקיד, התפקיד הזה משתמש בתמונות שלכם.
  • מיקומים לא עוברים הכנה.

שלחו prepareReferences: false כדי להשתמש בתמונות שלכם כמו שהן.

הכנת הקליפ

Nodaro קובע לכל מנוע איך קליפ המקור מוכן למודל הווידאו. למשל, הוא מחליט אם הפנים מוסתרות קודם, ואם לנסות שוב פעם אחת קליפ שהמודל דוחה. הרצה לא יכולה לשנות את זה. שדה faceMasking שלקוח ישן שולח מתקבל, אבל לא נלקח בחשבון.

בפלט של משימה שהושלמה יש privacy: { applied, reason }. השדה applied מציין אם הסרטון נוצר מהקליפ המוכן, והשדה reason מציין למה.

אומדן המחיר

הנתיב POST /v1/cast-swap/estimate מחזיר { engine, totalCredits, expectedCredits, breakdown, privacyCredits?, settlesLower }. באומדן יש שני סכומים כוללים.

  • השדה totalCredits הוא הסכום שמשוריין כשההרצה מתחילה.
  • השדה expectedCredits הוא החיוב הצפוי על ההרצה. הוא אף פעם לא גבוה מ-totalCredits. ההרצה מחויבת לפי העלות בפועל.
  • ב-Nodaro Motion Prism, המודל בוחר את אורך הסרטון, ולכן הקרדיטים לסרטון משוריינים לפי הפלט הארוך ביותר האפשרי. החיוב הצפוי הוא בערך לפי אורך הקליפ בקלט, ועוד אותו אורך בפלט. הערך settlesLower: true מציין זאת: החיוב הסופי צפוי להיות נמוך מ-totalCredits, בערך expectedCredits.
  • ב-Nodaro Motion Pulse, שני הסכומים שווים ו-settlesLower הוא false. Nodaro Motion Pulse מרנדר בדיוק את האורך שהתבקש.
  • השדה engine הוא המנוע שהאומדן מתייחס אליו.

השדה breakdown מפרט את החלקים של האומדן, לתצוגה בלבד:

חלקמה הוא
baseההרצה עצמה.
referencesהכנת הייחוסים. הערך הוא 0 כשההכנה כבויה או כשאין מה להכין.
motionהסכום שמשוריין לסרטון. ב-Nodaro Motion Pulse, מה שהסרטון עולה.
motionExpectedהחיוב הצפוי על הסרטון, אף פעם לא גבוה מ-motion. ב-Nodaro Motion Prism בלבד.
privacyהכנת הקליפ, כשההגדרה של המנוע עושה זאת. החלק הזה נכלל בשני הסכומים כשהוא רץ תמיד, ולא נכלל באף אחד מהם כשמדובר בניסיון החוזר שמתואר למטה.
promptהפרומפט שמודל שפה כותב להרצה, כשההגדרה של המנוע מבקשת פרומפט כזה.
referenceAudioהכנת הסאונד של הקליפ למודל הווידאו, כשההגדרה של המנוע מריצה את השלב הזה.

השדות motion ו-motionExpected הם חלופות, ולכן בדקו את הסכומים הכוללים, ואף פעם לא את סכום החלקים בפירוט.

כשההגדרה של המנוע מנסה שוב קליפ שנדחה, השדה privacyCredits הוא החיוב הנוסף, שנגבה רק אם הניסיון החוזר הזה רץ. הוא לא נכלל באף אחד מהסכומים הכוללים. כדי להתחיל את ההרצה צריך קרדיטים גם לשריון וגם ל-privacyCredits.

בקשות חוזרות

כשאתם שולחים שוב בקשה להרצה, שלחו את אותה כותרת Idempotency-Key, באורך 8–200 תווים. התגובה לבקשה חוזרת בתוך כ-10 שניות היא 200 { jobId, deduped: true }, עם הכותרת X-Dedup-Hit: 1. התגובה לבקשה חוזרת מאוחרת יותר היא 202 { jobId }, עם המשימה של ההרצה הראשונה. בשני המקרים לא מתחילה הרצה חדשה ולא נגבים קרדיטים. בלי מפתח, כל בקשה היא הרצה חדשה.

איכות מלאה

אפשר להשלים הרצה שהסתיימה באיכות מלאה: ב-1080p, מותאמת לקליפ ועם האודיו המקורי של הקליפ. התוצאה היא משימה חדשה, שמקושרת להרצה. אפשר להשלים שני סוגים של הרצות:

  • הרצת טיוטה של Nodaro Motion Prism, כלומר הרצה של Nodaro Motion שנעשתה כטיוטה, או הרצת טרנד שברירת המחדל שלה היא טיוטה. האיכות המלאה מרנדרת מחדש את אותו טייק ב-1080p.
  • הרצה של Nodaro Motion Pulse ב-720p. האיכות המלאה יוצרת טייק חדש ב-1080p מהקלטים של ההרצה עצמה. הרצת טרנד נוצרת מחדש מגרסת הטרנד שעליה היא רצה. Nodaro Motion Pulse לא יכול לחדד את אותו טייק, ולכן הטייק החדש לא תואם להרצה ב-720p פריים אחר פריים.

בשני המקרים ההרצה עצמה נשארת. השדה kind באומדן מציין באיזה מקרה מדובר, עם הערך "same-take" או "new-take". שרת ישן יותר משמיט את kind, ופירוש הדבר הוא אותו טייק. איכות מלאה זמינה במשך 7 ימים אחרי שההרצה הושלמה.

שיטהנתיבמה היא עושה
POST/v1/cast-swap/:jobId/full-quality/estimateאומדן מחיר, בחינם: שום דבר לא נוצר ולא משוריין. מחזירה { kind, totalCredits, breakdown, availableUntil }.
POST/v1/cast-swap/:jobId/full-qualityהתחלת האיכות המלאה. מחזירה 202 { jobId }. כשהאיכות המלאה של ההרצה הזו כבר רצה או הסתיימה, היא מחזירה 200 { jobId, existing: true }, ולא מתחילה הרצה חדשה ולא נגבים קרדיטים. מקבלת גוף בקשה אופציונלי { sessionId }.

הפרמטר :jobId הוא מזהה המשימה של הטיוטה, או של ההרצה של Nodaro Motion Pulse ב-720p. באומדן, totalCredits הוא breakdown.base, השלבים של משימת האיכות המלאה עצמה, ועוד הרינדור. באותו טייק, הרינדור הוא breakdown.motionHd, הרינדור ב-1080p של הטייק של הטיוטה. בטייק חדש, הרינדור הוא breakdown.motion, הטייק החדש של Nodaro Motion Pulse. השדה motionHd הוא 0 כשניסיון קודם שנכשל להשלים את הטיוטה הזו כבר סיים את הרינדור הזה: משתמשים שוב ברינדור, ומשלמים רק על ההשלמה. השדה availableUntil הוא המועד שבו 7 הימים נגמרים. המחיר נקבע לפי הטיוטה, ולכן קבלו קודם אומדן מחיר.

לכל טיוטה יש גרסת איכות מלאה אחת. המשימה מזוהה לפי הטיוטה, ולכן בקשה חוזרת או בקשה מקבילה מקבלות את אותה משימה, ואין שימוש ב-Idempotency-Key. אחרי ניסיון שנכשל או שבוטל, אפשר לבקש שוב כמה פעמים. המשימה החדשה שומרת על ה-origin של הטיוטה, והשדה sessionId משייך אותה לאחד הסשנים שלכם.

כל דחייה מגיעה לפני שנגבים קרדיטים. גוף התגובה הוא { error: { code, message } }.

סטטוסcodeמתי
401unauthorizedאין משתמש מאומת.
402insufficient_creditsאין לכם מספיק קרדיטים. רק בנתיב ההתחלה. בסביבת עבודה, במקום הקוד הזה יכול לחזור קוד המגבלה שדחתה את הבקשה: budget_exceeded, member_cap_exceeded או user_allowance_exceeded.
404not_foundהמשימה לא שלכם, או שהיא לא הרצה של Nodaro Motion. וגם sessionId שאין לכם הרשאה להשתמש בו, רק בנתיב ההתחלה.
409not_completedההרצה עוד לא הסתיימה.
409not_a_draftההרצה היא לא טיוטה של Nodaro Motion Prism וגם לא הרצה של Nodaro Motion Pulse ב-720p.
409full_quality_pendingלא סופי, ולכן נסו שוב מאוחר יותר. בגוף התגובה יש retryable: true. הרינדור ב-1080p של הטיוטה הזו מניסיון קודם נמצא בבדיקה, או שעוד לא התחיל.
409full_quality_unavailableסופי. אי אפשר להשלים את ההרצה באיכות מלאה: שום דבר לא נשמר לרינדור מחדש, אי אפשר לקרוא את מועד הסיום שלה, או שההשלמה ב-1080p דוחה את הטיוטה הזו. רק בנתיב ההתחלה, גם כשכל הניסיונות נכשלו, או כשאי אפשר להתחיל אף ניסיון להרצה הזו.
410draft_expiredעברו יותר מ-7 ימים מאז שהטיוטה הושלמה, או שכבר אי אפשר להשלים את הטיוטה באיכות מלאה.
422job_blockedמדיניות המשימות של הפריסה חסמה את הבקשה. רק בנתיב ההתחלה.
503job_read_failedכרגע אי אפשר היה לקרוא את הטיוטה. בגוף התגובה יש retryable: true. נסו שוב.
503estimate_unavailableכרגע אי אפשר לתת אומדן מחיר לרינדור ב-1080p. נסו שוב בעוד רגע.
503host_too_oldגרסת הפלטפורמה הזו לא יכולה להריץ איכות מלאה.

הבחינו בין full_quality_pending ל-full_quality_unavailable לפי הקוד, לא לפי ההודעה.

שגיאות

כל דחייה מגיעה לפני שנגבים קרדיטים. גוף התגובה הוא { error: { code, message } }.

סטטוסcodeמתי
400validation_errorגוף הבקשה לא תקין: אין בו תפקיד עם תמונות, ייחוס, prePrompt, postPrompt או סגנון אמנותי (סגנון אמנותי נחשב רק כש-styleOnly הוא true); או שיש בו יותר מ-5 ייחוסים, ייחוס בלי תמונה או עם יותר מ-3, יותר תפקידים מסוג מסוים ממה שמותר, יותר מ-3 תמונות בתפקיד, יותר מ-30 תמונות בסך הכול, draft: true ב-720p או ב-1080p, prePrompt או postPrompt של יותר מ-4,000 תווים, origin לא תקין או ערך style שהוא לא "precise" וגם לא "motion".
400draft_unsupporteddraft: true עם engine: "motion-pulse", שאין לו טיוטה.
400resolution_unsupportedresolution: "480p" עם engine: "motion-pulse".
400output_format_unsupportedבקשה לפלט MOV מ-engine: "motion-pulse". רק הרצה של Nodaro Motion Prism יכולה להחזיר פלט כזה.
400too_many_imagesיותר מ-10 תמונות בהרצה של Nodaro Motion Pulse, בכל התפקידים והייחוסים הקבועים יחד.
400raw_reference_tokenב-name או ב-previewName של תפקיד, ב-line של ייחוס, ב-prePrompt או ב-postPrompt יש סימון ייחוס גולמי: {image:, {video: או {audio:, בלי הבדל בין אותיות גדולות לקטנות.
400invalid_role_mentionהטקסט ב-prePrompt או ב-postPrompt מזכיר את {role:N} עם N מחוץ לטווח שבין 1 למספר התפקידים. וגם כל {role:N} ב-line של ייחוס.
400no_roles_in_previewתצוגה מקדימה שלא הייתה משנה כלום, לפי מה שהיא שולחת: לא נשאר בה תפקיד עם תמונות, ואין בה ייחוס קבוע, prePrompt, postPrompt או סגנון אמנותי. תצוגה מקדימה שכל התפקידים הושארו מחוצה לה עדיין רצה כשיש בה ייחוס, פרומפט או, כש-styleOnly הוא true, סגנון אמנותי. במנוע שהתשובה עבורו היא "precise", תצוגה מקדימה שהשינוי היחיד שלה הוא הסגנון האמנותי נדחית עם הקוד הזה. כל עוד Nodaro מריץ הרצה בסגנון המדויק עם סגנון אמנותי כהרצה בסגנון התנועה, גם תצוגה מקדימה כזו רצה בסגנון התנועה.
400prompt_too_longהפרומפט היה יוצא ארוך מדי. כשלתפקיד אין תמונות, המשתנה {role:N} מוחלף בשם של התפקיד, ולכן פרומפטים שכל אחד מהם בתוך 4,000 תווים עדיין יכולים לחרוג יחד מהמגבלה של המנוע. המגבלה של Nodaro Motion Pulse היא 8,000 תווים.
400unsafe_urlהערך של videoUrl, של תמונת תפקיד או של תמונת ייחוס הוא לא כתובת http או https ציבורית.
400video_unreadableאי אפשר היה לקרוא את אורך הקליפ. הקובץ הוא לא סרטון שאפשר לנגן.
400clip_out_of_rangeהקליפ קצר מ-4 שניות או ארוך מ-30 שניות.
400clip_too_long_for_styleרק עם style: "motion", כל עוד האופן שבו Nodaro מכין הרצות בסגנון התנועה במנוע מגביל את הקליפ. הרצה מלאה שהקליפ שלה ארוך מ-27.9 שניות. ההודעה היא "This clip is too long for Motion. Use a shorter clip or choose Precise." (הקליפ הזה ארוך מדי לסגנון התנועה. השתמשו בקליפ קצר יותר או בחרו בסגנון המדויק).
400prompt_parts_not_allowedגוף הבקשה שולח promptParts. רק פלטפורמת Nodaro עצמה יכולה לשלוח אותו, לפרומפט של טרנד.
400prompt_style_not_allowedגוף הבקשה שולח promptStyle. רק פלטפורמת Nodaro עצמה יכולה לשלוח אותו. הניסוח של הרצה נקבע לפי ה-style שלה.
400preview_out_of_rangeהתצוגה המקדימה חורגת מסוף הקליפ. הערך previewStart ועוד 4 צריך להיות לכל היותר אורך הקליפ.
400unnamed_role_needs_pictureתפקיד של אדם, חיית מחמד או מוצר בלי name ובלי תמונה. תפקיד בלי שם מקבל שם לפי התמונה הראשונה שלו, ולכן הוא צריך תמונה.
400art_style_needs_prismסגנון אמנותי עם engine: "motion-pulse", שלא מקבל סגנון אמנותי.
400art_style_needs_flexסגנון אמנותי בהרצה בסגנון המדויק כש-preciseArtStyle הוא לא true, בהרצת טרנד, או בהרצה בסגנון התנועה שההגדרה של Nodaro כותבת לה פרומפט של הסגנון המדויק.
400unknown_art_styleהערך direction.style הוא לא מזהה מהקטלוג של הבורר סגנון.
400art_style_not_supportedהשדה direction מציין מודבורד שמור, שהרצה של Nodaro Motion לא יכולה לקבל.
400role_name_requiredהרצת טרנד עם תפקיד שאין לו שם. לתפקידים של טרנד יש תמיד שם.
401unauthorizedאין משתמש מאומת.
402insufficient_creditsאין לכם מספיק קרדיטים להרצה. רק ב-POST /v1/cast-swap. כשבאומדן יש privacyCredits, הקרדיטים הנדרשים הם השריון ועוד privacyCredits. בסביבת עבודה, במקום הקוד הזה יכול לחזור קוד המגבלה שדחתה את הבקשה: budget_exceeded, member_cap_exceeded או user_allowance_exceeded.
404not_foundהשדה sessionId מציין סשן שאין לכם הרשאה להשתמש בו. רק ב-POST /v1/cast-swap.
422job_blockedמדיניות המשימות של הפריסה חסמה את הבקשה. רק ב-POST /v1/cast-swap.
503host_too_oldגרסת הפלטפורמה הזו לא יכולה להריץ את Nodaro Motion.
503estimate_unavailableכרגע אי אפשר לתת אומדן מחיר. נסו שוב בעוד רגע. רק ב-/estimate.

דרך ה-SDK

המשאב client.castSwap עוטף את כל הנתיבים. אפשר גם לייבא אותו מ-@nodaro/sdk/cast-swap.

run(params: CastSwapParams, options?: { idempotencyKey?: string }): Promise<{ jobId: string; deduped?: boolean }>
estimate(params: CastSwapParams): Promise<CastSwapEstimate>
fullQualityEstimate(jobId: string): Promise<CastSwapFullQualityEstimate>
fullQuality(jobId: string, params?: { sessionId?: string }): Promise<CastSwapFullQualityResult>
styleChoice(): Promise<CastSwapStyleChoice> // GET /v1/cast-swap/style-choice, public

הטיפוס CastSwapParams הוא גוף הבקשה שתואר למעלה, כשהשדה engine מוגדר מהטיפוס CastSwapEngine, style מהטיפוס CastSwapStyle ("precise" | "motion") ו-motionLength מהטיפוס CastSwapMotionLength. השדה faceMasking עדיין מוגדר בטיפוסים, כדי שקוד ישן ימשיך לעבוד, אבל הוא מיושן והשרת מתעלם ממנו. המתודה estimate() מחזירה תמיד את מזהי המנועים הנוכחיים. הטיפוס CastSwapEstimate הוא האומדן. המתודה run() שולחת את idempotencyKey ללא שינוי בכותרת Idempotency-Key. בלעדיו, לא נשלחת כותרת. המתודה styleChoice() מחזירה את CastSwapStyleChoice, כלומר { engines: { "motion-prism", "motion-pulse" }, styleOnly?, preciseArtStyle? }. כל מנוע הוא CastSwapStyleChoiceOption: "user", "precise" או "flex". השדות styleOnly ו-preciseArtStyle ממפים כל מנוע לערך בוליאני; התייחסו לערך חסר כאל false. הטיפוס CastSwapParams מקבל direction?: { style: string }, והשדה breakdown של האומדן יכול לכלול את referenceAudio.

const { engines, styleOnly } = await client.castSwap.styleChoice()
if (styleOnly?.["motion-prism"] === true && engines["motion-prism"] !== "precise") {
  await client.castSwap.run({ videoUrl, roles: [], style: "motion", direction: { style: "pop-art" } })
}
const params: CastSwapParams = {
  videoUrl,
  roles: [{ kind: "person", name: "the woman dancing", images: [myPhotoUrl], outfit: "original" }],
  preview: true,
  resolution: "480p",
}
const quote = await client.castSwap.estimate(params)
const { jobId } = await client.castSwap.run(params, { idempotencyKey: crypto.randomUUID() })

בדקו את מצב המשימה עם client.jobs.get(jobId). המשימה של תצוגה מקדימה שומרת את כל הקלטים ב-input_data שלה, כך שאפשר להריץ אותה שוב עם preview: false כדי לרנדר את הקליפ המלא עם אותן בחירות.

כדי להשלים הרצה ב-1080p, קבלו אומדן מחיר עם המתודה fullQualityEstimate(draftJobId), שהיא חינמית, ואז קראו למתודה fullQuality(draftJobId). השדה kind באומדן, מהטיפוס CastSwapFullQualityKind, מציין אם מדובר באותו טייק או בטייק חדש, כך שהאפליקציה שלכם יכולה להציג את זה. התוצאה היא { jobId, existing? }. הערך existing: true פירושו שהאיכות המלאה של ההרצה הזו כבר רצה או הסתיימה, ולא נגבו קרדיטים. דחייה כוללת קוד מהטיפוס CastSwapFullQualityRefusalCode. עם full_quality_pending, הערך של err.details.retryable הוא true: נסו שוב מאוחר יותר.

const quote = await client.castSwap.fullQualityEstimate(draftJobId) // free
const { jobId, existing } = await client.castSwap.fullQuality(draftJobId)

דרך ה-CLI

nodaro cast-swap full-quality estimate <jobId> [--json]
nodaro cast-swap full-quality run <jobId> [--session <id>] [--json]

הפקודה estimate נותנת אומדן מחיר בחינם. היא מדפיסה את הקרדיטים, אם מדובר באותו טייק או בטייק חדש, כל חלק של האומדן, ועד מתי אפשר להשלים את ההרצה. הפקודה run מוציאה קרדיטים ומדפיסה את מזהה המשימה החדשה. כשגרסת האיכות המלאה כבר קיימת, הפקודה run מדפיסה את המשימה הזו, ולא נגבים קרדיטים. הקוד full_quality_pending הוא לא סופי: הריצו את הפקודה שוב מאוחר יותר.

דרך MCP

כלי ה-MCP הוא cast_swap. הכלי מקבל את אותם שדות בכתיב snake case, למשל pre_prompt, prepare_references, in_preview, engine, style ו-motion_length. הוא מקבל גם art_style, סגנון אמנותי ב-Nodaro Motion Prism: מזהה מהקטלוג של הבורר סגנון, כגון pop-art. הפרמטר עובד בהרצה בסגנון התנועה, ובהרצה בסגנון המדויק כשהמנוע מקבל בה סגנון אמנותי. בלי תמונות לתפקידים ובלי ייחוסים, הוא מעצב מחדש את הקליפ כולו כשהמנוע מקבל הרצות של סגנון בלבד. ראו את הסעיף cast_swap בדף וידאו. הכלי לא מקבל הגדרה להכנת הקליפ. בלי confirm, הוא מחזיר את אומדן המחיר ולא גובה כלום. עם confirm: true, אחרי שהמחיר אושר, הוא מתחיל את ההרצה ומחזיר מזהה משימה. הכלים estimate_full_quality ו-full_quality נותנים אומדן מחיר ומתחילים את גרסת האיכות המלאה של טיוטה או של הרצה של Nodaro Motion Pulse ב-720p.

שאלות נפוצות

מה עושה Nodaro Motion?

Nodaro Motion מחליף את האנשים, חיות המחמד, המוצרים או המיקום בסרטון קצר בתמונות הייחוס שלכם. התנועה, המסגור, התזמון והסאונד של הסרטון נשארים כמו שהם, והתוצאה ארוכה כמו הקליפ.

מה האורך המותר של סרטון המקור?

סרטון המקור של Nodaro Motion צריך להיות באורך של בין 4 ל-30 שניות. קליפ קצר או ארוך יותר נדחה עם clip_out_of_range לפני שנגבים קרדיטים.

איך יודעים כמה תעלה הרצה של Nodaro Motion?

כדי לדעת כמה תעלה הרצה של Nodaro Motion, קראו לנתיב POST /v1/cast-swap/estimate עם אותו גוף בקשה שתריצו. הקריאה הזו חינמית, והיא מחזירה את totalCredits, הסכום שמשוריין כשההרצה מתחילה, ואת expectedCredits, החיוב הצפוי על ההרצה. בדקו את שני הסכומים הכוללים, ואף פעם לא את סכום החלקים בפירוט.

האם אפשר לנסות את המראה לפני שמרנדרים את כל הקליפ?

כן. ב-Nodaro Motion, שלחו את preview עם הערך true כדי לרנדר 4 שניות מהקליפ, החל מ-previewStart. תצוגה מקדימה עולה פחות, והמשימה שלה שומרת את כל הקלטים, כך שאפשר להריץ אותה שוב עם preview בערך false.

האם אפשר להשלים הרצת טיוטה באיכות מלאה?

כן, בתוך 7 ימים מסיום ההרצה. הנתיב POST /v1/cast-swap/:jobId/full-quality מרנדר מחדש ב-1080p את הטייק של טיוטה של Nodaro Motion Prism, או יוצר טייק חדש ב-1080p להרצה של Nodaro Motion Pulse ב-720p, כמשימה חדשה. קבלו קודם אומדן מחיר בחינם, דרך נתיב האומדן.

באילו מנועים Nodaro Motion יכול להשתמש?

Nodaro Motion משתמש בשני מנועים. Nodaro Motion Prism הוא ברירת המחדל, והוא מרנדר ב-480p, ב-720p או ב-1080p, עם טיוטה ב-480p. שלחו את engine עם הערך motion-pulse כדי להשתמש ב-Nodaro Motion Pulse, שמרנדר ב-720p או ב-1080p, אין לו טיוטה, והוא יוצר טייק חדש לפי הקליפ והתמונות שלכם.

האם אפשר לבחור אם הפנים בקליפ יוסתרו?

לא. Nodaro קובע לכל מנוע איך קליפ המקור מוכן, כולל אם הפנים מוסתרות קודם. שדה faceMasking שלקוח ישן שולח מתקבל, אבל לא נלקח בחשבון.

האם Nodaro Motion עובד בהתקנה באירוח עצמי?

לא. Nodaro Motion רץ רק ב-Nodaro Cloud. בהתקנה באירוח עצמי, כל נתיב שלו מחזיר 404.

עודכן לאחרונה

בדף הזה