add architecture skeleton
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
using GymLogAI.Application.DTOs;
|
||||
using GymLogAI.Application.Interfaces;
|
||||
using GymLogAI.Core.Entities;
|
||||
|
||||
namespace GymLogAI.AI;
|
||||
|
||||
public sealed class WorkoutRecommendationAIService(OpenRouterChatClient chatClient) : IWorkoutRecommendationGenerator
|
||||
{
|
||||
public async Task<WorkoutRecommendationDto> GenerateAsync(
|
||||
WorkoutRecommendationContext context,
|
||||
IReadOnlyCollection<Workout> workoutHistory,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
await chatClient.CompleteAsync(
|
||||
$"Recommend workout for goal {context.GoalType} with {workoutHistory.Count} historical workouts.",
|
||||
cancellationToken);
|
||||
|
||||
var lastWorkout = workoutHistory.FirstOrDefault();
|
||||
var fallbackExercises = lastWorkout?.WorkoutExercises
|
||||
.OrderBy(x => x.Order)
|
||||
.Select(x => x.Exercise?.Name ?? "Bodyweight movement")
|
||||
.Distinct()
|
||||
.Take(4)
|
||||
.ToArray();
|
||||
|
||||
return new WorkoutRecommendationDto(
|
||||
"Today's training recommendation",
|
||||
$"Goal: {context.GoalType}. History count: {workoutHistory.Count}.",
|
||||
fallbackExercises is { Length: > 0 }
|
||||
? fallbackExercises
|
||||
: ["Squat", "Bench Press", "Row", "Plank"],
|
||||
"Keep the session moderate and leave 1-2 reps in reserve.");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user