Skip to content

Commit

Permalink
refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
PHAN Xuan Quang committed Sep 11, 2024
1 parent 60be1b0 commit 45defbe
Show file tree
Hide file tree
Showing 6 changed files with 5 additions and 112 deletions.
48 changes: 0 additions & 48 deletions EngAce.Api/Controllers/ReviewController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,53 +59,5 @@ public async Task<ActionResult<Comment>> 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.");
}
}

/// <summary>
/// Generates a comment from an uploaded image based on the specified English level
/// </summary>
/// <param name="file">The image file from which to generate a comment.</param>
/// <param name="englishLevel">The English level for the generated comment. Default is Intermediate.</param>
/// <returns>
/// An <see cref="ActionResult{T}"/> 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.
/// </returns>
/// <response code="200">The generated comment from the image.</response>
/// <response code="400">The error message if no image is uploaded, the image size exceeds the maximum limit, or an error occurs during generation.</response>
/// <response code="401">The error message if the access key is invalid.</response>
[HttpPost("GenerateFromImage")]
[ResponseCache(Duration = QuizScope.OneHourAsCachingAge, Location = ResponseCacheLocation.Client, NoStore = false)]
public async Task<ActionResult<CommentFromImage>> 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.");
}
}
}
}
9 changes: 4 additions & 5 deletions Events/QuizScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static async Task<List<Quiz>> GenerateQuizes(string apiKey, string topic,
var quizes = new List<Quiz>();
var quizTypeQuestionCount = GeneralHelper.GenerateRandomNumbers(quizzTypes.Count, questionsCount);

var tasks = new List<Task<List<Quiz>?>>();
var tasks = new List<Task<List<Quiz>>>();

for (int i = 0; i < quizTypeQuestionCount.Count; i++)
{
Expand All @@ -41,7 +41,7 @@ public static async Task<List<Quiz>> 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(),
Expand Down Expand Up @@ -116,9 +116,8 @@ public static async Task<List<string>> SuggestTopcis(string apiKey, EnglishLevel
promptBuilder.AppendLine("]");
promptBuilder.Append("Your response:");

var response = await Gemini.Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 75);
return JsonConvert.DeserializeObject<List<string>>(response);
var response = await Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 75);
return [.. JsonConvert.DeserializeObject<List<string>>(response)];
}

}
}
34 changes: 0 additions & 34 deletions Events/ReviewScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,39 +41,5 @@ public static async Task<Comment> GenerateReview(string apiKey, EnglishLevel lev
var result = await Gemini.Generator.GenerateContent(apiKey, promptBuilder.ToString(), true, 50, model);
return JsonConvert.DeserializeObject<Comment>(result);
}

public static async Task<CommentFromImage> 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<CommentFromImage>(result);
}
}
}
2 changes: 0 additions & 2 deletions Gemini/DTO/ResponseForConversation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,5 @@ public class UsageMetadata
[JsonProperty("totalTokenCount")]
public int TotalTokenCount;
}


}
}
2 changes: 1 addition & 1 deletion Helper/GeneralHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public static List<int> GenerateRandomNumbers(int totalQuizTypes, int totalQuizz

for (int i = 0; i < totalQuizTypes; i++)
{
result.Add(1);
result.Add(1);
}

int remaining = totalQuizzes - totalQuizTypes;
Expand Down
22 changes: 0 additions & 22 deletions Helper/ImageOptimizer.cs

This file was deleted.

0 comments on commit 45defbe

Please sign in to comment.