From 45defbed0bb974937cdc6e88992af356f6ef3da8 Mon Sep 17 00:00:00 2001 From: PHAN Xuan Quang <20521008@ms.uit.edu.vn> Date: Thu, 12 Sep 2024 00:16:36 +0700 Subject: [PATCH] refactor code --- EngAce.Api/Controllers/ReviewController.cs | 48 ---------------------- Events/QuizScope.cs | 9 ++-- Events/ReviewScope.cs | 34 --------------- Gemini/DTO/ResponseForConversation.cs | 2 - Helper/GeneralHelper.cs | 2 +- Helper/ImageOptimizer.cs | 22 ---------- 6 files changed, 5 insertions(+), 112 deletions(-) delete mode 100644 Helper/ImageOptimizer.cs diff --git a/EngAce.Api/Controllers/ReviewController.cs b/EngAce.Api/Controllers/ReviewController.cs index b4a7ca9..a2b737d 100644 --- a/EngAce.Api/Controllers/ReviewController.cs +++ b/EngAce.Api/Controllers/ReviewController.cs @@ -59,53 +59,5 @@ public async Task> Generate([FromBody] string content, Eng return BadRequest("Có lỗi xảy ra! Vui lòng kiểm tra lại nội dung bài viết."); } } - - /// - /// Generates a comment from an uploaded image based on the specified English level - /// - /// The image file from which to generate a comment. - /// The English level for the generated comment. Default is Intermediate. - /// - /// An containing the generated comment from the image if the operation is successful, - /// or an error response if the access key is invalid, no image is uploaded, the image size exceeds the maximum limit, or an exception occurs during generation. - /// - /// The generated comment from the image. - /// The error message if no image is uploaded, the image size exceeds the maximum limit, or an error occurs during generation. - /// The error message if the access key is invalid. - [HttpPost("GenerateFromImage")] - [ResponseCache(Duration = QuizScope.OneHourAsCachingAge, Location = ResponseCacheLocation.Client, NoStore = false)] - public async Task> GenerateFromImage(IFormFile file, EnglishLevel englishLevel = EnglishLevel.Intermediate) - { - if (string.IsNullOrEmpty(_accessKey)) - { - return Unauthorized("Invalid Access Key"); - } - - if (file == null || file.Length == 0) - { - return BadRequest("Không có ảnh nào được tải lên."); - } - - var maxSize = 15 * 1000 * 1000; - - if (file.Length > maxSize) - { - return BadRequest($"Dung lượng ảnh phải nhỏ hơn {maxSize / 1024 / 1024} MB."); - } - - using var stream = new MemoryStream(); - try - { - await file.CopyToAsync(stream); - stream.Position = 0; - - var result = await ReviewScope.GenerateReviewFromImage(_accessKey, englishLevel, stream); - return Ok(result); - } - catch - { - return BadRequest("Có lỗi xảy ra! Vui lòng kiểm tra lại ảnh và thử lại."); - } - } } } \ No newline at end of file diff --git a/Events/QuizScope.cs b/Events/QuizScope.cs index 305e681..6f3c065 100644 --- a/Events/QuizScope.cs +++ b/Events/QuizScope.cs @@ -20,7 +20,7 @@ public static async Task> GenerateQuizes(string apiKey, string topic, var quizes = new List(); var quizTypeQuestionCount = GeneralHelper.GenerateRandomNumbers(quizzTypes.Count, questionsCount); - var tasks = new List?>>(); + var tasks = new List>>(); for (int i = 0; i < quizTypeQuestionCount.Count; i++) { @@ -41,7 +41,7 @@ public static async Task> GenerateQuizes(string apiKey, string topic, .AsParallel() .OrderBy(x => Guid.NewGuid()) .Take(questionsCount) - .Select(q => new Quiz + .Select(q => new Quiz { Question = q.Question.Replace("**", "'"), Options = q.Options.Select(o => o.Replace("**", "'")).ToList(), @@ -116,9 +116,8 @@ public static async Task> SuggestTopcis(string apiKey, EnglishLevel promptBuilder.AppendLine("]"); promptBuilder.Append("Your response:"); - var response = await Gemini.Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 75); - return JsonConvert.DeserializeObject>(response); + var response = await Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 75); + return [.. JsonConvert.DeserializeObject>(response)]; } - } } diff --git a/Events/ReviewScope.cs b/Events/ReviewScope.cs index 951e5a0..d571985 100644 --- a/Events/ReviewScope.cs +++ b/Events/ReviewScope.cs @@ -41,39 +41,5 @@ public static async Task GenerateReview(string apiKey, EnglishLevel lev var result = await Gemini.Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 50, model); return JsonConvert.DeserializeObject(result); } - - public static async Task GenerateReviewFromImage(string apiKey, EnglishLevel level, MemoryStream image) - { - var base64 = await ImageOptimizer.GetOptimizedBase64VersionOf(image); - var promptBuilder = new StringBuilder(); - var userLevel = GeneralHelper.GetEnumDescription(level); - - promptBuilder.Append("Bạn là một giáo viên tiếng Anh với hơn 20 năm kinh nghiệm giảng dạy, đồng thời đang làm việc tại một trung tâm dạy IELTS lớn. "); - promptBuilder.Append($"Trình độ tiếng Anh của tôi theo tiêu chuẩn CEFR là '{userLevel}'. "); - promptBuilder.AppendLine("Bạn hãy đọc nội dung bài viết trong ảnh chụp của tôi, sau đó nhận xét và chỉnh sửa lại để nó tốt hơn. "); - promptBuilder.AppendLine("Output phải bao gồm 3 phần như sau:"); - promptBuilder.AppendLine("- ExtractedContent: Nội dung bài viết mà bạn extract từ tấm ảnh. Nếu tấm ảnh có quá nhiều text được đặt rời rạc nhau, bạn hãy lấy nội dung text nổi bật nhất trong tấm ảnh"); - promptBuilder.AppendLine("- GeneralComment: Nhận xét chung bằng tiếng Việt cho cả bài viết. Nhận xét của bạn phải dựa trên nội dung chính của bài viết và trình độ tiếng Anh của tôi. Nội dung nhận xét phải bao gồm: Phát hiện lỗi chính tả và nêu cách sửa, phát hiện lỗi ngữ pháp và giải thích cho từng lỗi, đề xuất cách thay thế từ ngữ phù hợp hơn, phân tích phong cách viết và đề xuất cách viết phù hợp với ngữ cảnh và đối tượng tùy vào từng câu trong bài viết, phát hiện lỗi logic và đề xuất cách sửa để nội dung mạch lạc hơn. Bạn cũng phải giải thích chi tiết cho các gợi ý sửa chữa để tôi hiểu rõ và áp dụng hiệu quả."); - promptBuilder.AppendLine("- ImprovedContent: Bài viết được chỉnh sửa sau khi áp dụng những sửa chữa trong phần GeneralComment, nhớ highlight những đoạn được chỉnh sửa bằng cặp dấu **. Bạn tuyệt đối không được tự ý thay đổi nội dung chính của bài viết, và bài viết sau khi được chỉnh sửa không được phép dài hơn 1.5 lần bài viết ban đầu."); - promptBuilder.AppendLine("Output phải là một JSON object tương ứng với class C# sau: "); - promptBuilder.AppendLine("class ReviewerResponse"); - promptBuilder.AppendLine("{"); - promptBuilder.AppendLine(" string ExtractedContent;"); - promptBuilder.AppendLine(" string GeneralComment;"); - promptBuilder.AppendLine(" string ImprovedContent;"); - promptBuilder.AppendLine("}"); - promptBuilder.AppendLine("Ví dụ về output:"); - promptBuilder.AppendLine("{"); - promptBuilder.AppendLine(" \"ExtractedContent\": \"Đây là nội dung bài viết được extract từ ảnh của tôi\","); - promptBuilder.AppendLine(" \"GeneralComment\": \"Đây là nhận xét chung cho bài viết của tôi, hãy nhớ là phải sử dụng tiếng Việt\","); - promptBuilder.AppendLine(" \"ImprovedContent\": \"Đây là bài viết đã được sửa chữa dựa trên nhận xét trong phần GeneralComment.\""); - promptBuilder.AppendLine("}"); - promptBuilder.AppendLine("Nếu bài viết của tôi là một thứ vô nghĩa hoặc không thể khác định hoặc không thể hiểu được hoặc không phải một bài viết tiếng Anh, GenerateComment sẽ mang giá trị 'Không thể nhận xét', còn ImprovedContent mang giá trị ''."); - promptBuilder.AppendLine("Nội dung bài viết của tôi: "); - - var result = await Gemini.Generator.GenerateReviewFromImage(apiKey, promptBuilder.ToString(), base64); - - return JsonConvert.DeserializeObject(result); - } } } diff --git a/Gemini/DTO/ResponseForConversation.cs b/Gemini/DTO/ResponseForConversation.cs index 1d382c5..9393a3c 100644 --- a/Gemini/DTO/ResponseForConversation.cs +++ b/Gemini/DTO/ResponseForConversation.cs @@ -63,7 +63,5 @@ public class UsageMetadata [JsonProperty("totalTokenCount")] public int TotalTokenCount; } - - } } diff --git a/Helper/GeneralHelper.cs b/Helper/GeneralHelper.cs index 9587eae..697d934 100644 --- a/Helper/GeneralHelper.cs +++ b/Helper/GeneralHelper.cs @@ -48,7 +48,7 @@ public static List GenerateRandomNumbers(int totalQuizTypes, int totalQuizz for (int i = 0; i < totalQuizTypes; i++) { - result.Add(1); + result.Add(1); } int remaining = totalQuizzes - totalQuizTypes; diff --git a/Helper/ImageOptimizer.cs b/Helper/ImageOptimizer.cs deleted file mode 100644 index c009636..0000000 --- a/Helper/ImageOptimizer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Formats.Jpeg; - -namespace Helper -{ - public static class ImageOptimizer - { - public static async Task GetOptimizedBase64VersionOf(MemoryStream stream) - { - using var image = await Image.LoadAsync(stream); - var encoder = new JpegEncoder - { - Quality = 70 - }; - - using var outputStream = new MemoryStream(); - await image.SaveAsync(outputStream, encoder); - - return Convert.ToBase64String(outputStream.ToArray()); - } - } -}