using Health.Domain.Entities; using Health.Domain.Enums; namespace Health.Application.AI; public sealed record DietCommentaryFood(string Name, string Portion, int Calories); public static class DietCommentaryPolicy { public const string LegacyPromptPrefix = "饮食记录页需要展示本餐建议。"; public const string SystemPrompt = """ 你是健康管理 App 中的饮食建议助手。根据用户本餐食物和健康档案,直接输出2到3条简短建议。 每条建议12到22个汉字,不要问候,不要说“好的”“当然”“建议如下”,不要编号,不要使用 Markdown。 优先围绕控盐控油、蔬菜和蛋白质搭配、血糖血脂风险及份量控制。 不作诊断,不提供治疗、处方、停药或调药结论。语言简洁、专业、面向普通用户。 """; public static string BuildFoodDescription(IEnumerable foods) => string.Join("、", foods.Select(food => $"{Normalize(food.Name, 40)}({Normalize(food.Portion, 30)},{Math.Clamp(food.Calories, 0, 10000)}千卡)")); public static bool IsLegacyArtifact(IEnumerable messages) { var userMessages = messages.Where(message => message.Role == MessageRole.User).ToList(); return userMessages.Count > 0 && userMessages.All(message => message.Content.TrimStart().StartsWith(LegacyPromptPrefix, StringComparison.Ordinal)); } private static string Normalize(string value, int maxLength) { var normalized = string.Join(' ', value.Trim().Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries)); return normalized.Length > maxLength ? normalized[..maxLength] : normalized; } }