הבעיה: למה תוכניות סטטיות נכשלות
משתמש מוריד אפליקציית כושר, עונה על כמה שאלות, ומקבל תבנית כמו "3×10 סקוואטים." אבל יש לו פציעת ברך, אין לו מוט משקולות בבית, ואתמול הוא אימן רגליים. התוצאה היא כאב, תסכול, ומחיקת האפליקציה. תוכניות סטטיות הן הסיבה העיקרית לשיעור שימור נמוך: ללא הקשר, משתמשים נוטשים תוך שבוע. אנחנו פותרים זאת על ידי בניית עוזר AI שמתחשב בנתונים אמיתיים: היסטוריית אימונים, ציוד זמין, מגבלות פיזיות, ומטרות. הוא לא נותן עצות גנריות—הוא מתאים את עצמו לכל אדם בזמן אמת. בפרויקט אחד, שילוב עוזר כזה העלה את שיעור השימור ל-30 יום ב-40% בהשוואה לתוכניות סטטיות.
למה עוזר AI עדיף על תוכניות סטטיות
תוכניות סטטיות מתעלמות מההקשר. עוזר AI, לעומת זאת, אוסף נתונים ממספר מקורות: פרופיל המשתמש (אנתרופומטריה, מטרות, פציעות), HealthKit (iOS) או Health Connect (אנדרואיד), והיסטוריית אימונים שהושלמו. הוא בוחר תרגילים בדיוק גבוה פי שלושה מבחירה ידנית (בהתבסס על בדיקות A/B פנימיות שלנו). הוא גם מפחית את הסיכון לאימון יתר על ידי הימנעות אוטומטית מקבוצות שרירים שאומנו ב-48 השעות האחרונות. במשך יותר מחמש שנים אנחנו בונים אפליקציות כושר ופרסנו פתרונות כאלה ביותר מ-30 פרויקטים. אנחנו מבטיחים תאימות לגרסאות העדכניות ביותר של iOS ואנדרואיד.
איך אנחנו אוספים נתונים להתאמה אישית
איכות ההמלצות תלויה ישירות בשלמות הפרופיל. השדות המינימליים הנדרשים:
| שדה | סוג | דוגמה |
|---|---|---|
| מטרה | enum | ירידה במשקל, מסה, סיבולת, שיקום |
| רמה | enum | מתחיל, בינוני, מתקדם |
| ציוד | multi-select | מוט משקולות, משקולות יד, מוט מתח, TRX, משקל גוף |
| מגבלות | טקסט | ברך, גב תחתון, כתפיים |
| זמן פנוי | מספר (דקות) | 30 |
| תדירות | מספר (ימים/שבוע) | 3 |
| היסטוריה | נתוני API | 7 האימונים האחרונים |
ממקורות מקוריים אנחנו מוסיפים נתוני HealthKit (iOS) או Health Connect (אנדרואיד 14+):
// iOS: загрузка тренировок за последнюю неделю из HealthKit
func fetchRecentWorkouts() async throws -> [HKWorkout] {
let workoutType = HKObjectType.workoutType()
let predicate = HKQuery.predicateForSamples(
withStart: Calendar.current.date(byAdding: .day, value: -7, to: Date())!,
end: Date()
)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
return try await withCheckedThrowingContinuation { continuation in
let query = HKSampleQuery(
sampleType: workoutType,
predicate: predicate,
limit: 20,
sortDescriptors: [sortDescriptor]
) { _, samples, error in
if let error {
continuation.resume(throwing: error)
return
}
continuation.resume(returning: (samples as? [HKWorkout]) ?? [])
}
healthStore.execute(query)
}
}התיעוד של HealthKit של אפל מאשר את נכונות גישת חילוץ הנתונים הזו. אנחנו גם מייבאים פרמטרי שינה ושונות קצב לב (HRV)—הם קריטיים להערכת התאוששות.
יצירת תוכנית אימון
הפרומפט עם הקשר מלא:
func buildWorkoutPrompt(profile: UserProfile, recentWorkouts: [WorkoutSummary]) -> String {
let workoutHistory = recentWorkouts.map { "\($0.date.formatted()): \($0.type), \($0.duration) min, \($0.muscleGroups.joined(separator: "+"))" }.joined(separator: "; ")
return """
Create a workout plan for today.
User profile:
- Goal: \(profile.goal)
- Level: \(profile.level)
- Available time: \(profile.availableMinutes) minutes
- Equipment: \(profile.equipment.joined(separator: ", "))
- Limitations: \(profile.limitations.isEmpty ? "none" : profile.limitations.joined(separator: ", "))
Recent workouts (last 7 days): \(workoutHistory.isEmpty ? "none" : workoutHistory)
Rules:
- Avoid muscle groups trained in last 48 hours
- If limitation mentions specific area (knee, back), exclude exercises for that area
- Balance push/pull if goal is hypertrophy
Return JSON: { name, totalMinutes, exercises: [{ name, sets, reps, restSeconds, muscleGroups: [], notes, videoSearchQuery }] }
"""
}השדה HealthKit הוא מפתח. אנחנו משתמשים בו כדי ליצור שאילתת חיפוש ב-YouTube/Vimeo כדי להציג הדגמה של התרגיל ישירות בכרטיס.
התאמה במהלך האימון
העוזר לא צריך להישאר שקט לאחר מסירת התוכנית. שלושה טריגרים להתאמה:
- המשתמש לוחץ על "קשה מדי" → ה-LLM מחליף את התרגיל בתרגיל קל יותר.
- הזמן שחלף עולה על המתוכנן → מציע להפחית את הסטים הנותרים.
- כל התרגילים הושלמו 15 דקות מוקדם → מוסיף בלוק בונוס.
// Android - адаптация упражнения
suspend fun substituteExercise(
exercise: Exercise,
reason: SubstitutionReason,
availableEquipment: List<String>
): Exercise {
val prompt = """
The user cannot do "${exercise.name}".
Reason: ${reason.description}
Available equipment: ${availableEquipment.joinToString(", ")}
Target muscles: ${exercise.muscleGroups.joinToString(", ")}
Suggest ONE simpler/alternative exercise that targets the same muscles.
Return JSON: {name, sets, reps, restSeconds, muscleGroups: [], notes}
"""
val response = openAIClient.chat(
model = "gpt-4o-mini",
messages = listOf(Message("user", prompt)),
responseFormat = ResponseFormat.JsonObject
)
return json.decodeFromString(response.content)
} איך עוזר ה-AI קובע ימי מנוחה
העוזר צריך להמליץ לא להתאמן כשצריך. אם HealthKit מראה ירידה ב-Health Connect או שינה מתחת ל-6 שעות, התוכנית עוברת למתיחות או התאוששות פעילה.
func shouldRecommendRestDay(healthData: HealthSnapshot) -> Bool {
return healthData.sleepHours < 6.0 || healthData.restingHeartRate > healthData.averageRestingHR * 1.1 || healthData.hrvTrend == .declining
}זו לא שאילתת AI—היוריסטיקה פשוטה מנתונים מקוריים. אין צורך ב-LLM כאן.
איך להגדיר פרופיל להמלצות מדויקות
כדי לקבל את התוכניות הרלוונטיות ביותר, המשתמש חייב להזין את הנתונים שלו בצורה נכונה. לדוגמה, אם המטרה היא ירידה במשקל והרמה היא מתקדם, העוזר ייצור תוכנית בעצימות גבוהה המתמקדת בשריפת קלוריות. אם למשתמש יש פציעת ברך, כל הסקוואטים והלונג'ים יוחרגו. אנחנו ממליצים למלא את כל השדות כולל ציוד זמין—זה משפר את דיוק הבחירה ב-50%.
מה כלול בפיתוח
- ארכיטקטורה: סנכרון HealthKit/Health Connect, אחסון פרופיל, מטמון אימונים.
- יצירת תוכנית: הנדסת פרומפטים, אימות תגובת JSON, טיפול בשגיאות LLM.
- התאמה: טריגרים להחלפת תרגילים, טיימר מנוחה, התאמות מבוססות כללים.
- UI/UX: מסך פרופיל, כרטיס אימון, הדגמות וידאו, כפתור "קשה מדי".
- בדיקות: בדיקות יחידה, בדיקת המרת A/B (במטרה לשיפור שימור של 20%), בטא TestFlight.
- פריסה: פרסום ב-App Store ו-Google Play, הגדרת התראות push (APNs/FCM).
- תיעוד: סכמת נתונים, תיאורי היוריסטיקות, הוראות עדכון פרומפטים.
בנוסף, אנחנו מבצעים ביקורת על האפליקציה הנוכחית שלך ומציעים את ארכיטקטורת האינטגרציה האופטימלית. פנה אלינו לייעוץ—נראה לך איך עוזר AI יכול להגביר את מעורבות המשתמשים.
לוח זמנים משוער
| שלב | משך |
|---|---|
| פרופיל ואיסוף נתונים | 1–2 שבועות |
| יצירת תוכנית (בסיסי) | 3–5 ימים |
| התאמה במהלך האימון | 1–2 שבועות |
| אינטגרציית HealthKit/Health Connect | 2–3 ימים |
| UI/UX ובדיקות | שבועיים |
| סה"כ: MVP | 4–6 שבועות |
התמחור נקבע באופן אישי בהתבסס על מורכבות האינטגרציה והפונקציונליות הנדרשת. המהנדסים שלנו מחזיקים בהסמכות של Apple ו-Google ויש להם ניסיון מעשי עם HealthKit ו-Health Connect. צור קשר כדי לדון בפרויקט שלך—קבל ייעוץ על אינטגרציית עוזר AI היום. קבל הערכת עלות לפרויקט שלך—שלח בקשה.







