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