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

העלאות

העלאת תמונות, וידאו ואודיו עם POST /v1/upload, העתקת קבצים מכתובת URL, ייבוא סרטונים מקישורים, קיצוץ מדיה שמורה, חיפוש בספרייה וקישור לקובץ.

העלאות מכניסות תמונות, וידאו ואודיו משלכם לאחסון של Nodaro, כדי שכל רכיב יוכל להשתמש בהם לפי הכתובת שלהם. הנתיב POST /v1/upload שומר קובץ אחד ומחזיר את הכתובת שלו. נתיבים אחרים מעתיקים קובץ מכתובת URL, מייבאים סרטון מרשת חברתית, מקצצים קובץ שמור בחינם או מחזירים את המדיה ששמרתם.

נקודות קצה

שיטהנתיבמה היא עושה
POST/v1/uploadהעלאת קובץ אחד, בפורמט multipart form data.
POST/v1/upload-jsonשמירת מסמך JSON, עד 25 MB, וקבלת הכתובת הציבורית שלו. למשל, מצב העיצוב של עורך תמונות בשביל תמונה ערוכה. קשה לנחש את הכתובת, אבל היא ציבורית, ולכן לעולם אל תשמרו סוד במסמך כזה.
POST/v1/save-to-storageהעתקת קובץ מכתובת URL לאחסון שלכם, כמשימה.
POST/v1/download-videoייבוא סרטון מרשת חברתית או מקישור ישיר לסרטון.
GET/v1/download-video/progress/:downloadIdההתקדמות של הייבוא, כאירועי שרת (SSE).
POST/v1/video-metadataקריאת משך הסרטון, הגודל והכותרת שלו בלי להוריד אותו.
POST/v1/media/processקיצוץ או חיתוך של קובץ וידאו או אודיו שמור. הנתיב חינמי וסינכרוני.
POST/v1/media/import-urlהעתקת תמונה מכתובת אינטרנט לאחסון שלכם.
POST/v1/media/discardמחיקת קובץ שיצרתם זה עתה ושכבר אין לכם צורך בו.
GET/v1/libraryספריית המדיה שלכם, מהחדש לישן, עם חיפוש ומסננים.
POST/v1/library/save-generatedשמירה של אחד הקבצים שלכם בספרייה שלכם.

העלאת קובץ

שלחו את הקובץ כ-multipart form data בשדה file. אפשר לשלוח גם type, עם הערך image, video או audio.

curl -s -X POST https://app.nodaro.ai/v1/upload \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -F "file=@portrait.png;type=image/png" \
  -F "type=image"
{
  "data": {
    "url": "https://…/portrait.png",
    "assetId": "5d6e7f80-91a2-4b3c-8d4e-5f60718293a4",
    "thumbnailUrl": "https://…/portrait-thumb.webp",
    "category": "image",
    "filename": "portrait.png",
    "mimeType": "image/png",
    "sizeBytes": 1482233,
    "r2Key": "…/portrait.png"
  }
}
// In a browser, file comes from an <input type="file">.
// In Node 20 or newer, build it from bytes:
import { readFile } from 'node:fs/promises'

const file = new File([await readFile('portrait.png')], 'portrait.png', { type: 'image/png' })
const upload = await client.uploads.upload(file)
console.log(upload.url) // pass it as imageUrl, videoUrl or audioUrl
שדהמשמעות
urlהכתובת הציבורית של הקובץ השמור. אפשר להשתמש בה בכל רכיב.
assetIdהמזהה של הקובץ באחסון שלכם.
thumbnailUrlתמונה ממוזערת לתמונות ולווידאו, או null לאודיו.
categoryimage, video או audio, לפי הסיווג של השרת.
filenameשם התצוגה של הקובץ.
mimeTypeסוג הקובץ שהשרת קבע. פרטים בהמשך.
sizeBytesהגודל של הקובץ השמור, בבייטים.
r2Keyהמפתח של הקובץ באחסון.

ב-CLI אין פקודת העלאה. כדי להעתיק מהטרמינל לאחסון שלכם קובץ שכבר נמצא ברשת, השתמשו בפקודה nodaro media save <url>.

פורמטים וסוגי קבצים

מדיהפורמטים
תמונהPNG, JPEG, WebP, GIF, AVIF, HEIC, HEIF. עד 25 MB.
וידאוMP4, MOV, WebM, AVI. עד 500 MB.
אודיוMP3, WAV, M4A ו-AAC, OGG, WebM, FLAC. עד 50 MB.

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

  • פרמטרים מוסרים. הסוג audio/webm;codecs=opus הופך ל-audio/webm.
  • כתיבים חלופיים נפוצים ממופים לסוג התקני. הסוג audio/vnd.dlna.adts, ש-Windows משתמש בו לקובץ .aac רגיל, הופך ל-audio/aac, image/jpg הופך ל-image/jpeg ו-video/mov הופך ל-video/quicktime.
  • סוג שלא אומר כלום נקבע לפי שם הקובץ. עם application/octet-stream, או בלי סוג בכלל, הסיומת קובעת: הקובץ clip.mp4 נשמר כ-video/mp4.

סוג שעדיין לא תואם לאף פורמט שמתקבל נדחה עם 400 validation_error, עם רשימת הפורמטים שמתקבלים. הסוג שהשרת קבע חוזר ב-mimeType, והקובץ מוגש איתו.

תמונות HEIC, HEIF ו-AVIF מומרות לפני שהן נשמרות. מעט דפדפנים מציגים את הפורמטים האלה, ומודלי התמונה לא מקבלים אותם. כל דרך העלאה של תמונות שומרת קובץ כזה כ-JPEG, או כ-PNG כשיש בתמונה שקיפות, והשדה mimeType מציין את הסוג השמור. דרכי ההעלאה האלה הן POST /v1/upload, POST /v1/upload/image, ההעלאה שמאחורי כלי ה-MCP prepare_image_upload ו-request_image_upload והייבוא בצד השרת של כתובת תמונה. דרך העלאה שנתנה את הכתובת של הקובץ לפני ההעלאה שומרת על הכתובת הזו, ורק סוג התוכן של הקובץ משתנה. ההמרה כוללת גם קובצי AVIF של 10 ביט ותמונות HEIC מ-iPhone. את שני אלה קורא מפענח שלא שומר על שקיפות, ולכן אזור שקוף בהם יוצא אטום. קובץ AVIF של 8 ביט שומר על השקיפות שלו. קובץ שאי אפשר לפענח בכלל נדחה עם 400.

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

כשהעלאה נדחית

סטטוסקודמשמעות
400validation_errorהקובץ לא בפורמט שמתקבל, או שקובץ תמונה או אודיו חורג ממגבלת הגודל שלו.
413storage_limit_exceededנפח האחסון שלכם מלא. ה-SDK זורק StorageExceededError, עם הקוד ב-reason והשימוש והמגבלה שלכם ב-details: usedBytes, quotaBytes, remainingBytes ו-tier.
422upload_blockedמדיניות ההעלאות של הפריסה דחתה את הקובץ לפני שהוא נשמר. הציגו את ה-message למשתמש שלכם כמו שהוא. רק בפריסות שיש להן מדיניות כזו.

שימוש בכתובת URL במקום העלאה

רוב הנתיבים מקבלים מדיה לפי כתובת URL, כגון imageUrl, videoUrl, audioUrl ו-referenceImageUrls, ולכן אין צורך להעלות קובץ שכבר נמצא ברשת. הכתובת חייבת להיות כתובת http או https ציבורית: כתובת שמפנה לכתובת ברשת פרטית, או שמשתמשת בסכמה אחרת, נדחית.

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

curl -s -X POST https://app.nodaro.ai/v1/save-to-storage \
  -H "Authorization: Bearer $NODARO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mediaUrl": "https://example.com/clip.mp4", "filename": "clip.mp4", "mediaType": "video"}'
# {"jobId":"…"}  poll the job; its output carries the stored file
const { jobId } = await client.media.saveToStorage({
  mediaUrl: 'https://example.com/clip.mp4',
  filename: 'clip.mp4',
  mediaType: 'video',
})
nodaro media save https://example.com/clip.mp4 --filename clip.mp4 --type video --watch

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

ייבוא סרטון מרשת חברתית

הנתיב POST /v1/download-video מייבא לאחסון שלכם את הסרטון שמאחורי קישור לדף של סרטון, או סרטון מקישור ישיר לקובץ וידאו. שלחו את אישור זכויות התוכן של הקישור בשדה confirmationId (ראו את דף ה-API זכויות תוכן). הנתיב מחזיר downloadId, ולא מזהה משימה:

{ "url": "https://youtu.be/XXXX", "maxHeight": 720, "sectionStartSec": 30, "sectionEndSec": 90 }
  • השדה maxHeight מגביל את הרזולוציה; השמיטו אותו כדי לקבל את הרזולוציה הטובה ביותר שזמינה. השדות sectionStartSec ו-sectionEndSec מורידים רק את החלק הזה של הסרטון, עם כ-3 שניות נוספות בכל צד, כי החיתוך נופל על פריימי מפתח. שלחו את שניהם או אף אחד מהם, וקצצו את התוצאה כשצריך חיתוך מדויק. עם exactSection: true, החלק נחתך במקום זאת בדיוק בטווח הזה, בלי שוליים.
  • ייבוא של סרטון בלי רצועת אודיו נכשל, אלא אם שולחים requireAudio: false.
  • כל חשבון יכול להריץ 4 ייבואים בבת אחת. ייבוא חמישי נדחה עם 429 too_many_downloads.
  • הנתיב GET /v1/download-video/progress/:downloadId מזרים את ההתקדמות כאירועי שרת (SSE), בערך פעמיים בשנייה: { phase, percent, videoUrl?, thumbnailUrl?, error? }. הזרם מסתיים כשהסטטוס של הייבוא הוא completed, עם ה-videoUrl השמור, או failed, עם error. ההתקדמות נשמרת רק לזמן קצר אחרי שהייבוא מסתיים, ולכן התחילו לקרוא אותה מיד.
  • הסרטון המוגמר נשמר בספרייה שלכם.

כדי לבדוק סרטון לפני שמייבאים אותו, הנתיב POST /v1/video-metadata עם { url } קורא את משך הסרטון, את הגודל ואת הכותרת שלו בלי להוריד אותו. מהטרמינל: הפקודות nodaro media download <url> --max-height 720 --watch ו-nodaro media metadata <url>. ראו את דף ה-API קול ומדיה לשאר כלי המדיה.

קיצוץ או חיתוך של קובץ שמור

הנתיב POST /v1/media/process מקצץ או חותך קובץ וידאו או אודיו שמור. הנתיב חינמי ועונה מיד, בלי משימה:

{
  "sourceUrl": "https://…/interview.mp4",
  "type": "video",
  "trim": { "startTime": 12.5, "endTime": 48 },
  "crop": { "x": 0, "y": 0, "width": 1080, "height": 1080 }
}

התגובה היא { "data": { url, thumbnailUrl, assetId, sizeBytes, mimeType, metadata } }. השדה format קובע את פורמט הפלט: לווידאו mp4 או webm, לאודיו mp3, wav, m4a או aac. עם deleteSource: true, קובץ המקור נמחק אחר כך אם הוא שלכם ושום דבר אחר לא משתמש בו, כך שהגרסה המקוצצת מחליפה את המקור. ב-SDK, קראו ל-client.media.process(input). כדי לקצץ בתוך תהליך, השתמשו ברכיב קיצוץ וידאו, שעולה קרדיטים.

ייבוא תמונה מכתובת אינטרנט

הנתיב POST /v1/media/import-url עם גוף הבקשה { "url": "https://…" } מעתיק תמונה מכתובת אינטרנט לאחסון שלכם. הכתובת חייבת להיות http או https ולא פרטית, והגודל המרבי של התמונה הוא 20 MB. הפלטפורמה שומרת את הקובץ רק אם אפשר לפענח אותו כתמונה: JPEG, PNG, WebP או GIF. תמונת HEIC, HEIF או AVIF מומרת ל-JPEG או ל-PNG. העותק השמור נחשב להעלאה שלכם, והוא מוגש כך שאלמנט <canvas> בדפדפן יכול לקרוא את הפיקסלים שלו, למשל כדי לחתוך אותו.

התגובה היא { "data": { url, thumbnailUrl, assetId, mimeType, sizeBytes, filename, width, height } }. כשהייבוא נדחה, התשובה היא 400 validation_error על כתובת או פורמט שלא מתקבלים, 422 fetch_failed כשאי אפשר להגיע לכתובת ו-413 כשהתמונה גדולה מ-20 MB (file_too_large) או כשנפח האחסון שלכם מלא (storage_limit_exceeded). ב-SDK, קראו ל-client.uploads.importUrl(url). רכיב העלאת תמונה משתמש בייבוא הזה כשמדביקים קישור לתמונה.

מחיקת קובץ שכבר אין בו צורך

הנתיב POST /v1/media/discard עם גוף הבקשה { "url": "https://…" } מוחק קובץ שיצרתם זה עתה ושכבר אין לכם צורך בו. דוגמאות: הורדה מקישור שהחלפתם לפני שהשתמשתם בה, קטע מקוצץ שהוחלף בקטע חדש יותר ותמונה שייבאתם ואז ביטלתם. זו לא מחיקה כללית. הקובץ נמחק רק אם הוא שלכם, ורק אם /v1/download-video, /v1/media/process או ייבוא מכתובת URL יצרו אותו. בנוסף, הקובץ צריך להיות בן פחות מ-24 שעות, ואסור שמשימה כלשהי שלכם תשתמש בו, לא כפלט ולא כקלט, כמו ה-videoUrl של הרצה.

תגובהמשמעות
{ "data": { "discarded": true } }הקובץ נמחק.
{ "data": { "discarded": false } }בכתובת הזו לא היה קובץ שלכם: הקובץ כבר נמחק, או שהוא לא שלכם.
409 not_discardableהקובץ לא עומד בתנאים שלמעלה. שום דבר לא השתנה.

ב-SDK, קראו ל-client.media.discard({ url }).

ספריית המדיה שלכם

הנתיב GET /v1/library מחזיר את המדיה שלכם, מהחדש לישן. כברירת מחדל הוא מחזיר את הקבצים ששמרתם בספרייה שלכם, ובנוסף את הספרייה המשותפת. עם owned=true, הוא מחזיר במקום זאת כל קובץ שבבעלותכם: העלאות ויצירות, בין שנשמרו בספרייה ובין שלא.

פרמטר שאילתהמשמעות
typeall (ברירת המחדל), image, video או audio.
qחיפוש: רק הקבצים ששם הקובץ שלהם כולל את כל המילים שב-q, עד 5 מילים, בלי הבדל בין אותיות גדולות לקטנות. כל תו נבדק כמו שהוא, ולכן התווים %, _ ו-* לא משמשים כתווים כלליים. ערך ריק ב-q פירושו שאין חיפוש, והאורך המרבי של q הוא 200 תווים. השם הקודם, search, עדיין עובד.
ownedהערך true מחזיר כל קובץ שבבעלותכם, במקום תצוגת הספרייה.
sourceרק מדיה מממשק אחד: internal, mcp, app, cli, sdk, extension, web או api. לקבצים מלפני שהנתון הזה התחיל להירשם אין מקור, ולכן הם מופיעים רק כשמשמיטים את source.
limitגודל העמוד, 1–100. ברירת המחדל היא 40.
cursorהערך nextCursor מהעמוד הקודם.

התגובה היא { data, nextCursor, totalCount }. כל פריט כולל את id, type, filename, mimeType, sizeBytes, url, thumbnailUrl, metadata, isLibraryItem, uploadSource, source, sourceDetail, jobId ו-createdAt. השדה jobId הוא המשימה שיצרה את הקובץ, או null בהעלאה. בעמוד האחרון השדה nextCursor הוא null, והשדה totalCount, מספר הקבצים שתואמים, מגיע רק עם העמוד הראשון.

curl -s "https://app.nodaro.ai/v1/library?owned=true&type=image&q=poster" \
  -H "Authorization: Bearer $NODARO_API_KEY"

ב-SDK, קראו ל-client.library.list({ type: 'image', q: 'poster' }). כלי ה-MCP browse_uploads קורא את התצוגה של owned=true, עם אותו חיפוש לפי שם קובץ בארגומנט search שלו.

הנתיב POST /v1/library/save-generated עם { url, type } שומר קובץ בספרייה שלכם. קובץ באחסון של Nodaro מתקבל רק אם הוא שלכם: אחת היצירות שלכם, קובץ שהעליתם או קובץ בתיקיית ההעלאות שלכם. כל קובץ אחר באחסון של Nodaro נדחה עם 403 forbidden, בין שהוא קיים ובין שלא. קישור לכל אתר אחר נשמר כמו שהוא.

כדי לשלוח משתמש מחובר לקובץ אחד בספריית הקבצים של האפליקציה, הקבצים שלי, צרו קישור ל-/library עם אחד משני פרמטרי שאילתה:

קישורמה הוא פותח
https://app.nodaro.ai/library?job=<jobId>הקובץ שהמשימה הזו יצרה: ה-jobId שקריאת היצירה שלכם החזירה.
https://app.nodaro.ai/library?asset=<assetId>הקובץ הזה: השדה id מ-GET /v1/library?owned=true. בלי owned=true, ברשימה נמצאים גם פריטים מהספרייה המשותפת, שהדף הקבצים שלי אף פעם לא מציג.
  • הדף מחפש, ואז מציג את הקובץ. הדף מציג ״מחפשים את הקובץ…״, ואז גולל אל הקובץ, מסמן אותו ופותח את התצוגה המקדימה שלו.
  • הדף מחפש בין כ-1,000 הקבצים החדשים ביותר של המשתמש. קישור לקובץ ישן יותר פותח את הדף הקבצים שלי בלי הקובץ.
  • כשאי אפשר להציג את הקובץ, הודעה קצרה מסבירה למה, והדף נפתח כרגיל: המזהה לא מוכר או לא שייך למשתמש, המשימה עדיין רצה, או שהמשימה נכשלה או לא יצרה קובץ. כשהחיפוש עצמו נכשל, ההודעה מבקשת מהמשתמש לנסות את הקישור שוב.
  • הפרמטר נמחק מהכתובת אחרי שהדף קורא אותו, ולכן רענון הדף או לחיצה על חזרה בדפדפן לא פותחים את הקובץ שוב.
  • משתמש שלא מחובר מתחבר קודם, ואז מגיע לקובץ. התקנה באירוח עצמי עונה על אותם נתיבים בכתובת שלה.

העלאה דרך עוזר AI

שרת ה-MCP מציע שלוש דרכים להעלות, וכל אחת מהן קיימת לתמונות, לאודיו ולווידאו. כולן דורשות את ההרשאה assets:write.

דרךכליםאיפה היא עובדת
חלון העלאה בצ׳אטupload_image_widget, upload_audio_widget, upload_video_widgetClaude.ai בדפדפן. חלון ההעלאה של התמונות מקבל עד 10 קבצים.
דף העלאה בדפדפןrequest_image_upload, request_audio_upload, request_video_uploadכל לקוח MCP. הכלי מחזיר דף שפותחים בדפדפן, ואת הכתובת הציבורית הסופית של הקובץ.
כתובת העלאה חתומה מראשprepare_image_upload, prepare_audio_upload, prepare_video_uploadלקוחות שיכולים להריץ פקודות shell, כמו Claude Code, Cursor או Cline. שלחו את הקובץ עם curl -X PUT --data-binary @file. לא ב-Claude.ai בדפדפן ולא באנדרואיד.

שאלות נפוצות

איך מעלים קובץ ל-Nodaro דרך ה-API?

שלחו בקשת POST /v1/upload בפורמט multipart form data, עם הקובץ בשדה file. בתגובה מופיע השדה url של הקובץ השמור, ואפשר להעביר אותו לכל רכיב בתור imageUrl, videoUrl או audioUrl.

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

תמונות ב-PNG, ב-JPEG, ב-WebP, ב-GIF, ב-AVIF, ב-HEIC או ב-HEIF, וידאו ב-MP4, ב-MOV, ב-WebM או ב-AVI, ואודיו ב-MP3, ב-WAV, ב-M4A או AAC, ב-OGG, ב-WebM או ב-FLAC. הגודל המרבי של קובץ תמונה הוא 25 MB, של קובץ וידאו 500 MB ושל קובץ אודיו 50 MB.

האם צריך להעלות קובץ לפני שרכיב יכול להשתמש בו?

לא. רוב הנתיבים מקבלים ישירות כתובת URL ציבורית של http או https. העלו את הקובץ, או העתיקו אותו עם POST /v1/save-to-storage, כשהכתובת פרטית או זמנית, או כשאתם רוצים ש-Nodaro ישמור עותק משלו.

מה קורה כשנפח האחסון שלי מלא?

ההעלאה נדחית עם 413, וה-SDK זורק StorageExceededError, עם המגבלה שלכם ב-details.quotaBytes. מחקו קבצים שכבר אין לכם צורך בהם, או שחררו מקום, ואז העלו שוב.

איך שולחים משתמש לקובץ אחד בספריית ה-Nodaro שלו?

צרו קישור לכתובת https://app.nodaro.ai/library עם הפרמטר job ומזהה המשימה, או עם הפרמטר asset ומזהה מ-GET /v1/library?owned=true. הדף מוצא את הקובץ, גולל אליו ופותח את התצוגה המקדימה שלו.

איך עוזרי AI מעלים קבצים דרך MCP?

שרת ה-MCP מציע שלוש דרכים: חלון העלאה בצ׳אט, דף העלאה בדפדפן וכתובת העלאה חתומה מראש ללקוחות שיכולים להריץ פקודות shell. כל אחת מהן קיימת לתמונות, לאודיו ולווידאו.

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

בדף הזה