⚠️ שימו לב: סביבת ה-Swagger מחוברת לשרת אמיתי. כל ביצוע יוצר נתונים אמיתיים ועלול להפעיל עיבוד AI בעלות.

🏠 מה תלמד בהדרכה זו?

⚠️
שים לב — הדרכת אימון בלבד השתמש ברשומות ועדה לבדיקה בלבד. אל תמחק רשומות ועדה אמיתיות שנמצאות בשימוש פעיל. ניתן לזהות ועדות בדיקה לפי שדה performedBy: "test@...".
💡
Swagger UI — כתובת הממשק פתח בדפדפן: https://d1h1pi9n5z1j85.cloudfront.net/api/docs

בסיום ההדרכה תדע כיצד:

  • לפתוח ממשק Swagger ולנווט בו
  • ליצור רשומת ועדה חדשה ולקבל meetingId
  • להעלות קובץ בתהליך מחולק לשלבים
  • לעקוב אחר עיבוד ה-AI ולדעת מתי הוא הסתיים
  • לצפות בסיכום שנוצר אוטומטית
  • להוריד קובץ Word / PDF מוכן לשיתוף

🔍 איך עובד Swagger — מבוא מהיר

Swagger הוא ממשק ויזואלי שמאפשר לך לקרוא לכל endpoint של ה-API ישירות מהדפדפן — בלי לכתוב שורת קוד. כל ה-HTTP Requests מתבצעות בזמן אמת לשרת האמיתי.

▶️

כפתור "Try it out"

לחץ עליו כדי לאפשר עריכת הבקשה. לפני לחיצה — הטופס נעול לעיון בלבד.

📝

תיבת Request body

כאן מדביקים את ה-JSON שרוצים לשלוח. ניתן לערוך ישירות בתיבה.

כפתור "Execute"

שולח את הבקשה לשרת. ניתן ללחוץ מספר פעמים (לצורך polling).

📩

Server response

תוצאת הבקשה — סטטוס HTTP + JSON שחזר. כאן מעתיקים ערכים כמו uploadId.

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

זרימת העבודה הטיפוסית

  1. מרחיב endpoint ברשימה (לחיצה על השם)
  2. לוחץ Try it out
  3. ממלא / מדביק את ה-JSON בתיבה
  4. לוחץ Execute
  5. מגלל למטה ל-Server response ומעתיק את הערך הרלוונטי

💚 שלב 0 — בדיקת חיבור לשרת

GET /api/health
בדיקת תקינות השרת
לפני כל דבר — ודא שהשרת פועל ומגיב.

כיצד לבצע

  1. בחלק העליון של Swagger, מצא GET /api/health
  2. לחץ כדי להרחיב → לחץ Try it out → לחץ Execute
  3. ודא שקיבלת 200 OK

תגובה צפויה

JSON — 200 OK
{
  "status": "ok",
  "message": "Server is running healthy"
}
🚫
אם קיבלת תגובה שאינה 200 — עצור כאן. השרת לא פועל. פנה למנהל המערכת.

נתקלת בשגיאה? עברו לתקלות נפוצות ←

📋 שלב 1 — יצירת רשומת ועדה

⚠️
ועדת אימון בלבד השתמש ב-performedBy עם כתובת מייל של בדיקה (לדוגמה test@example.com). אל תשתמש בפרטים של משתמש אמיתי.
POST /api/meetings
יצירת רשומת ועדה חדשה
שלב זה יוצר רשומה ריקה במסד הנתונים ומחזיר meetingId ייחודי — שישמש בכל שלבי ההמשך.

Request Body

💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.

JSON
{
  "performedBy": "test@example.com"
}

תגובה צפויה — 201 Created

JSON — 201 Created
{
  "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "DRAFT",
  "currentStep": 0
}
📋 חשוב: העתק את ערך "id" — זהו meetingId שלך לכל השלבים הבאים.
💡
חלופה — שימוש ב-meetingId קיים אם כבר יש לך meetingId מהמערכת (מהדשבורד או מ-GET /api/meetings) — ניתן לדלג על שלב זה ולהשתמש בו ישירות.

נתקלת בשגיאה? עברו לתקלות נפוצות ←

📁 שלבים 2–4 — העלאת קובץ להקלטה

תהליך ההעלאה מורכב מ-3 קריאות API: start → part → complete. עבור קבצים קטנים (עד 5MB) שולחים חלק אחד בלבד.

📁
קובץ מומלץ לאימון צור קובץ test.txt עם כל תוכן (אפילו "בדיקה") — הוא יעבוד לבדיקת הזרימה המלאה, אם כי הסיכום ייצא ריק (אין תמלול אמיתי). לסיכום עם תוכן אמיתי — השתמש בקובץ .mp3 או .mp4.
POST /api/files/upload/start
התחלת סשן ההעלאה
יוצר "תיקיית העלאה" בשרת ומחזיר uploadId — המפתח לשלבים הבאים.

Request Body

💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.

JSON
{
  "meetingId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "currentStep": 4,
  "fileName":   "test.txt",
  "fileSize":   30,
  "performedBy": "test@example.com"
}

פירוט השדות

שדהסוגחובההסבר
meetingId UUID חובה ה-ID שקיבלת בשלב 1
currentStep integer חובה תמיד 4 להעלאת הקלטה
fileName string חובה שם הקובץ בלבד (ללא תיקיות). לדוג' audio.mp3
fileSize integer רשות גודל הקובץ בבייטים. אם לא ידוע — השמט.
performedBy string חובה מייל / מזהה המשתמש המבצע

תגובה צפויה

JSON — 200 OK
{
  "uploadId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
  "status": "initialized"
}
📋 העתק את uploadId — תזדקק לו בשני השלבים הבאים.
POST /api/files/upload/part
העלאת תוכן הקובץ
שולח את בייטי הקובץ עצמו. בניגוד לשלבים האחרים — כאן הבקשה היא Multipart Form, לא JSON. Swagger יציג שדות ולא תיבת טקסט.
⚠️
שים לב — Swagger יציג כאן שדות טופס (לא תיבת JSON). זה נורמלי ותקין עבור העלאת קבצים.

מילוי הטופס ב-Swagger

שדה בטופסערך להזין
uploadId ה-uploadId מתגובת שלב 2
partNumber 1 (עבור קובץ קטן — חלק יחיד)
currentStep 4
chunk לחץ Choose File ובחר את הקובץ שלך

תגובה צפויה

JSON — 200 OK
{
  "status": "success",
  "receivedPart": 1,
  "message": "Part accepted"
}
אם receivedPart == 1 — הצלחת. הקובץ נשמר בשרת ומוכן לסיום.

העלאה מרובת חלקים (לקבצים > 5MB)

קרא לשלב זה פעם אחת לכל חלק, עם partNumber עולה (1, 2, 3 ...). בשלב הבא, הגדר totalParts למספר החלקים הכולל.

POST /api/files/upload/complete
סיום וחיבור הקובץ — הפעלת AI
מאחד את כל חלקי הקובץ, מעלה לאחסון, ומפעיל את תהליך עיבוד הקלטה + יצירת סיכום AI.

Request Body

💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.

JSON
{
  "uploadId":   "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
  "meetingId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "totalParts": 1,
  "currentStep": 4,
  "performedBy": "test@example.com"
}

תגובה צפויה

JSON — 200 OK
{
  "status": "processing",
  "processId": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
  "message": "File assembly complete. AI summary generation started."
}
📋 העתק את processId — ניתן להשתמש בו לבדיקת ההתקדמות. את ה-meetingId תמשיך להשתמש בשלב הבא.

נתקלת בשגיאה? עברו לתקלות נפוצות ←

שלב 5 — מעקב אחר עיבוד ה-AI

לאחר /complete, השרת מריץ ברקע תמלול + יצירת סיכום. תהליך זה עשוי לקחת מספר דקות. ניתן לבדוק את ההתקדמות.

GET /api/active-processes/meeting/{meetingId}
בדיקת התקדמות העיבוד
מחזיר את אחוז ההתקדמות של תהליך ה-AI עבור ועדה ספציפית. יש לבצע Polling — לחיצות חוזרות על Execute — עד ל-100%.

כיצד לבצע

  1. הרחב GET /api/active-processes/meeting/{meetingId}
  2. לחץ Try it out
  3. הזן את ה-meetingId שלך בשדה meetingId
  4. הוסף userId Header — הזן את כתובת המייל שלך
  5. לחץ Execute → המתן 30 שניות → חזור שוב

תגובה צפויה (בעיבוד)

JSON — 200 OK
{
  "meetingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "processId": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
  "percentage": 65,
  "estimatedTimeRemaining": "2 minutes",
  "statusMessage": "Transcribing audio..."
}
עיבוד הסתיים כאשר:
percentage == 100, או
• ה-endpoint מחזיר 404 (תהליך נמחק לאחר השלמה)
ℹ️
כיצד עובד שדה ה-percentage
שכבת ההתקדמות מופיעה כאשר ה-API מחזיר תהליך פעיל עבור הפגישה. השדה percentage מגיע ישירות מהשרת, ולא מחושב בצד הלקוח.
⏱️
תקוע סביב 75%?
אם התהליך נראה תקוע סביב 75%, זה בדרך כלל שלב יצירת הסיכום ב-AI. המתינו כמה דקות ובדקו שוב. אם לא זז אחרי 10 דקות — בדוק שגיאות ב-Bedrock / Gemini בלוגים.

נתקלת בשגיאה? עברו לתקלות נפוצות ←

📄 שלב 6 — צפייה בסיכום שנוצר

GET /api/meetings/{meetingId}
קבלת פרטי הוועדה והסיכום
לאחר שהעיבוד הסתיים, מחזיר את הוועדה המלאה כולל הסיכום שנוצר ב-AI.

Header נדרש

Headerערך
userIdכתובת המייל שלך

מה לבדוק בתגובה

JSON — 200 OK (קטע רלוונטי)
{
  "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "READY_FOR_EDIT",  // ← זה מה שאנחנו מחפשים
  "aiContent": {
    "htmlContent": "<h1>סיכום וועדה...</h1>",  // ← הסיכום
    "isEditedByUser": false,
    "lastGenerated": "2026-05-27T10:00:00Z"
  },
  "filesStatus": {
    "processingActive": false,  // ← false = עיבוד הסתיים
    "recordingReady": true
  }
}
עיבוד מוצלח:
  • status = "READY_FOR_EDIT"
  • aiContent.htmlContent לא ריק
  • filesStatus.processingActive = false
⚠️
סיכום ריק / HTML ריק?
אם aiContent.htmlContent ריק — ייתכן שהועלה קובץ טקסט (.txt) ללא תמלול אמיתי, או שלפגישה לא הוזנו פרטי ועדה. לסיכום עם תוכן — השתמש בקובץ שמע/וידאו אמיתי.

נתקלת בשגיאה? עברו לתקלות נפוצות ←

⬇️ שלב 7 — יצוא והורדת Word / PDF

GET /api/meetings/{meetingId}/exports
קבלת קישורי ההורדה
מחזיר רשימת קישורים ישירים לקבצי Word ו-PDF שנוצרו אוטומטית.

Header נדרש

Headerערך
userIdכתובת המייל שלך

תגובה צפויה

JSON — 200 OK
{
  "meetingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "files": [
    {
      "format": "WORD",
      "url": "https://...cloudfront.net/api/meetings/.../exports/download?format=word",
      "label": "סיכום ישיבה (Word)",
      "isPrimary": true
    },
    {
      "format": "PDF",
      "url": "https://...cloudfront.net/api/meetings/.../exports/download?format=pdf",
      "label": "סיכום ישיבה (PDF)",
      "isPrimary": false
    }
  ]
}
GET /api/meetings/{meetingId}/exports/download?format=word
הורדת קובץ Word / PDF
מחזיר את הקובץ הבינארי ישירות. ב-Swagger יש מגבלה ידועה עם קבצים בינאריים — ראה הערה חשובה למטה.

Query Params

פרמטרערכים אפשרייםהסבר
format word / pdf פורמט הקובץ המבוקש
inline false (ברירת מחדל) הורדה כ-Attachment. true מציג PDF בתוך iFrame.
🚫
Swagger — "Failed to fetch" בהורדת Word/PDF?
זה ידוע ומצופה! ה-Swagger UI מגבילה קבצים בינאריים. הדרך הנכונה:
  1. העתק את ה-URL מתגובת GET /exports (השדה url)
  2. הדבק אותו ישירות בכרטיסיית דפדפן חדשה
  3. ההורדה תתחיל אוטומטית

הורדה עם curl (חלופה)

Bash
curl -H "userId: test@example.com" \
  "https://d1h1pi9n5z1j85.cloudfront.net/api/meetings/MEETING_ID/exports/download?format=word" \
  -o summary.docx

נתקלת בשגיאה? עברו לתקלות נפוצות ←


🔧 תקלות נפוצות ופתרונות

שגיאות 400 Bad Request

הודעת שגיאהסיבהפתרון
"Invalid file name." שם הקובץ מכיל תיקייה (/ או ..) השתמש בשם בסיסי בלבד: audio.mp3
"partNumber must be >= 1." שלחת partNumber: 0 התחל מ-1
"totalParts must be >= 1." שלחת totalParts: 0 השתמש ב-1 לפחות
"Missing part N" הצהרת N חלקים אך לא העלאת את כולם העלה את כל החלקים לפני /complete
"Merged file size X does not match Y" ה-fileSize ב-/start שגוי השמט את fileSize (הוא רשות) או הזן ספירת בייטים מדויקת
"Meeting does not match upload session." meetingId ב-/complete שונה מזה ב-/start השתמש באותו meetingId לאורך כל הזרימה
"Invalid uploadId" uploadId לא בפורמט UUID תקין העתק אותו ישירות מהתגובה של /start
"Meeting must have a draft summary..." ניסיון לשמור סיכום לפני שהעיבוד הסתיים המתן ל-status == READY_FOR_EDIT

שגיאות 404 Not Found

הודעת שגיאהסיבהפתרון
"Meeting not found." ה-meetingId לא קיים במסד הנתונים צור ועדה חדשה דרך POST /api/meetings
"Upload session not found" ה-uploadId לא קיים / כבר נמחק אחרי /complete התחל מחדש מ-/start
"No active process found for meeting" העיבוד כבר הסתיים (תהליך נמחק) עבור לבדוק GET /api/meetings/{meetingId} — הסיכום כבר מוכן

שגיאות 500 Internal Server Error

הודעת שגיאהסיבהפתרון
"Failed to store uploaded file." S3 / אחסון נכשל בדוק הרשאות IAM (s3:PutObject) ולוגים של ECS
"Failed to write merged file." כתיבה לדיסק נכשלה בדוק שה-UPLOAD_DIR קיים ויש לו הרשאות כתיבה

בעיות עיבוד AI (Bedrock / Claude / Gemini)

🤖
סיכום לא נוצר / עיבוד תקוע
  • בדוק שמשתנה הסביבה USE_AWS_BEDROCK מוגדר נכון (true לבדיקות ב-AWS)
  • ודא שרול ה-ECS Task מורשה ל-bedrock:InvokeModel
  • ודא שמודל Claude מופעל ב-Bedrock בריג'ון הנכון
  • קובץ .txt יעבד בהצלחה אך יניב סיכום ריק כי אין תמלול אמיתי

בעיות CORS והורדת קבצים

🌐
Swagger "Failed to fetch" בעת הורדה
Swagger UI נחסמת מלהציג קבצים בינאריים בגלל CORS ומגבלות דפדפן. הפתרון: הדבק את ה-URL מ-GET /exports בכרטיסיה חדשה, או השתמש ב-curl כמוצג בשלב 7. ב-curl ובדפדפן ישיר — ההורדה תעבוד תקין.

רשימת בדיקה — האם הכל עבד?

סמן כל פריט לאחר שאימתת אותו. הסימון נשמר אוטומטית בדפדפן.

  • השרת מגיב עם 200 OK ב-GET /health
  • יצרתי ועדה ב-POST /meetings וקיבלתי meetingId
  • קריאת /upload/start החזירה uploadId ו-status: initialized
  • קריאת /upload/part החזירה receivedPart: 1
  • קריאת /upload/complete החזירה status: processing ו-processId
  • תהליך ה-AI הגיע ל-percentage: 100 או ה-endpoint החזיר 404
  • בדיקת GET /meetings/{id}status הוא READY_FOR_EDIT
  • aiContent.htmlContent — לא ריק (מכיל HTML של הסיכום)
  • קריאת GET /exports — החזירה URLs לקבצי Word ו-PDF
  • הורדת קובץ Word הצליחה (ישירות מהדפדפן / curl)
  • קובץ ה-Word נפתח ומכיל תוכן סיכום (לא ריק)
  • מחקתי את ועדת האימון מהדשבורד אם אין בה צורך
🧹
נקיון לאחר אימון
בסיום האימון מומלץ למחוק רשומות בדיקה ישירות מהדשבורד (כפתור מחיקה ליד שם הוועדה). כך תשמרו על נתונים נקיים ולא תזהמו את הרשימה עם ועדות בדיקה.
🎉
השלמת את ההדרכה!
עברת את כל שלבי זרימת ה-API מאפס ועד לקבלת מסמך Word עם סיכום. כעת אתה יכול לבצע את הזרימה הזו עבור ועדות אמיתיות.

📋 סיכום מהיר — כל ה-Endpoints בסדר

GET /api/health
← אין ערך לשמור
POST /api/meetings
← שמור: id (meetingId)
POST /api/files/upload/start
← שמור: uploadId
POST /api/files/upload/part
← ודא: receivedPart == 1
POST /api/files/upload/complete
← שמור: processId
GET /api/active-processes/meeting/{id}
← polling עד 100%
GET /api/meetings/{id}
← ודא: READY_FOR_EDIT
GET /api/meetings/{id}/exports
← שמור: url להורדה