מדריך מלא לשימוש ב-Swagger
מערכת סיכומי וועדות המים
מדריך זה ינחה אותך שלב-אחר-שלב דרך כל תהליך העלאת הקלטה, הפעלת עיבוד AI וצפייה בסיכום — ישירות דרך ממשק ה-Swagger, ללא כתיבת קוד.
⏱️ זמן משוער להשלמת ההדרכה: 15–25 דקות, תלוי בגודל הקובץ ובמשך עיבוד ה-AI.
מה תלמד בהדרכה זו?
performedBy: "test@...".
בסיום ההדרכה תדע כיצד:
- לפתוח ממשק Swagger ולנווט בו
- ליצור רשומת ועדה חדשה ולקבל
meetingId - להעלות קובץ בתהליך מחולק לשלבים
- לעקוב אחר עיבוד ה-AI ולדעת מתי הוא הסתיים
- לצפות בסיכום שנוצר אוטומטית
- להוריד קובץ Word / PDF מוכן לשיתוף
איך עובד Swagger — מבוא מהיר
Swagger הוא ממשק ויזואלי שמאפשר לך לקרוא לכל endpoint של ה-API ישירות מהדפדפן — בלי לכתוב שורת קוד. כל ה-HTTP Requests מתבצעות בזמן אמת לשרת האמיתי.
כפתור "Try it out"
לחץ עליו כדי לאפשר עריכת הבקשה. לפני לחיצה — הטופס נעול לעיון בלבד.
תיבת Request body
כאן מדביקים את ה-JSON שרוצים לשלוח. ניתן לערוך ישירות בתיבה.
כפתור "Execute"
שולח את הבקשה לשרת. ניתן ללחוץ מספר פעמים (לצורך polling).
Server response
תוצאת הבקשה — סטטוס HTTP + JSON שחזר. כאן מעתיקים ערכים כמו uploadId.
meetingId → uploadId → processId
זרימת העבודה הטיפוסית
- מרחיב endpoint ברשימה (לחיצה על השם)
- לוחץ Try it out
- ממלא / מדביק את ה-JSON בתיבה
- לוחץ Execute
- מגלל למטה ל-Server response ומעתיק את הערך הרלוונטי
שלב 0 — בדיקת חיבור לשרת
כיצד לבצע
- בחלק העליון של Swagger, מצא
GET /api/health - לחץ כדי להרחיב → לחץ Try it out → לחץ Execute
- ודא שקיבלת
200 OK
תגובה צפויה
{
"status": "ok",
"message": "Server is running healthy"
}
200 — עצור כאן. השרת לא פועל. פנה למנהל המערכת.נתקלת בשגיאה? עברו לתקלות נפוצות ←
שלב 1 — יצירת רשומת ועדה
performedBy עם כתובת מייל של בדיקה (לדוגמה test@example.com). אל תשתמש בפרטים של משתמש אמיתי.
meetingId ייחודי — שישמש בכל שלבי ההמשך.Request Body
💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.
{
"performedBy": "test@example.com"
}
תגובה צפויה — 201 Created
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "DRAFT",
"currentStep": 0
}
"id" — זהו meetingId שלך לכל השלבים הבאים.
meetingId מהמערכת (מהדשבורד או מ-GET /api/meetings) — ניתן לדלג על שלב זה ולהשתמש בו ישירות.
נתקלת בשגיאה? עברו לתקלות נפוצות ←
שלבים 2–4 — העלאת קובץ להקלטה
תהליך ההעלאה מורכב מ-3 קריאות API: start → part → complete. עבור קבצים קטנים (עד 5MB) שולחים חלק אחד בלבד.
test.txt עם כל תוכן (אפילו "בדיקה") — הוא יעבוד לבדיקת הזרימה המלאה, אם כי הסיכום ייצא ריק (אין תמלול אמיתי). לסיכום עם תוכן אמיתי — השתמש בקובץ .mp3 או .mp4.
uploadId — המפתח לשלבים הבאים.Request Body
💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.
{
"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 | חובה | מייל / מזהה המשתמש המבצע |
תגובה צפויה
{
"uploadId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"status": "initialized"
}
uploadId — תזדקק לו בשני השלבים הבאים.מילוי הטופס ב-Swagger
| שדה בטופס | ערך להזין |
|---|---|
uploadId |
ה-uploadId מתגובת שלב 2 |
partNumber |
1 (עבור קובץ קטן — חלק יחיד) |
currentStep |
4 |
chunk |
לחץ Choose File ובחר את הקובץ שלך |
תגובה צפויה
{
"status": "success",
"receivedPart": 1,
"message": "Part accepted"
}
receivedPart == 1 — הצלחת. הקובץ נשמר בשרת ומוכן לסיום.העלאה מרובת חלקים (לקבצים > 5MB)
קרא לשלב זה פעם אחת לכל חלק, עם partNumber עולה (1, 2, 3 ...). בשלב הבא, הגדר totalParts למספר החלקים הכולל.
Request Body
💡 החליפו את test@example.com בכתובת אימייל מזוהה שלכם או של משתמש אימון מוסכם. הערך נשמר במסד הנתונים ומשמש למעקב.
{
"uploadId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"meetingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"totalParts": 1,
"currentStep": 4,
"performedBy": "test@example.com"
}
תגובה צפויה
{
"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} - לחץ Try it out
- הזן את ה-
meetingIdשלך בשדה meetingId - הוסף
userIdHeader — הזן את כתובת המייל שלך - לחץ Execute → המתן 30 שניות → חזור שוב
תגובה צפויה (בעיבוד)
{
"meetingId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"processId": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"percentage": 65,
"estimatedTimeRemaining": "2 minutes",
"statusMessage": "Transcribing audio..."
}
•
percentage == 100, או• ה-endpoint מחזיר
404 (תהליך נמחק לאחר השלמה)
שכבת ההתקדמות מופיעה כאשר ה-API מחזיר תהליך פעיל עבור הפגישה. השדה
percentage מגיע ישירות מהשרת, ולא מחושב בצד הלקוח.
אם התהליך נראה תקוע סביב 75%, זה בדרך כלל שלב יצירת הסיכום ב-AI. המתינו כמה דקות ובדקו שוב. אם לא זז אחרי 10 דקות — בדוק שגיאות ב-Bedrock / Gemini בלוגים.
נתקלת בשגיאה? עברו לתקלות נפוצות ←
שלב 6 — צפייה בסיכום שנוצר
Header נדרש
| Header | ערך |
|---|---|
userId | כתובת המייל שלך |
מה לבדוק בתגובה
{
"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
אם
aiContent.htmlContent ריק — ייתכן שהועלה קובץ טקסט (.txt) ללא תמלול אמיתי, או שלפגישה לא הוזנו פרטי ועדה. לסיכום עם תוכן — השתמש בקובץ שמע/וידאו אמיתי.
נתקלת בשגיאה? עברו לתקלות נפוצות ←
שלב 7 — יצוא והורדת Word / PDF
Header נדרש
| Header | ערך |
|---|---|
userId | כתובת המייל שלך |
תגובה צפויה
{
"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
}
]
}
Query Params
| פרמטר | ערכים אפשריים | הסבר |
|---|---|---|
format |
word / pdf |
פורמט הקובץ המבוקש |
inline |
false (ברירת מחדל) |
הורדה כ-Attachment. true מציג PDF בתוך iFrame. |
זה ידוע ומצופה! ה-Swagger UI מגבילה קבצים בינאריים. הדרך הנכונה:
- העתק את ה-URL מתגובת
GET /exports(השדהurl) - הדבק אותו ישירות בכרטיסיית דפדפן חדשה
- ההורדה תתחיל אוטומטית
הורדה עם curl (חלופה)
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 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 בסדר
← אין ערך לשמור
← שמור: id (meetingId)
← שמור: uploadId
← ודא: receivedPart == 1
← שמור: processId
← polling עד 100%
← ודא: READY_FOR_EDIT
← שמור: url להורדה