{"repo": "asmaa-elfatayry/ai-code-reviewer-murajea", "files": {"AICodeReviewer.Core/AI/Providers/DeepSeekProvider.cs": {"a49c78ce3c45664272e2a33ff158d5f8d7cfcdc1": {"t": 1785746194.5632331, "n": 6828, "h": "d753ac7050a67c72", "c": "using AICodeReviewer.Core.Models;\nusing System.Net.Http.Headers;\nusing System.Text;\nusing System.Text.Json;\n\nnamespace AICodeReviewer.Core.AI.Providers;\n\npublic class DeepSeekProvider : IAIProvider\n{\n private readonly HttpClient _httpClient;\n private readonly string _apiKey;\n private readonly string _model;\n private string _language = \"en\"; // 👈 إضافة\n\n public string ProviderName => \"DeepSeek\";\n public bool IsAvailable => !string.IsNullOrEmpty(_apiKey);\n\n public DeepSeekProvider(string apiKey, string model = \"deepseek-chat\")\n {\n _httpClient = new HttpClient();\n _apiKey = apiKey;\n _model = model;\n _httpClient.DefaultRequestHeaders.Authorization =\n new AuthenticationHeaderValue(\"Bearer\", _apiKey);\n }\n\n public void SetLanguage(string language) // 👈 إضافة\n {\n _language = language;\n }\n\n public async Task ReviewFunctionAsync(FunctionReview function)\n {\n // 👈 اختيار الـ System Prompt حسب اللغة\n var systemPrompt = _language == \"ar\"\n ? @\"أنت خبير متخصص في .NET و C# مع خبرة 10 سنوات.\nمهمتك هي تحليل كود C# وتقديم ملاحظات بناءة ودقيقة.\nيجب أن يكون الرد بصيغة JSON فقط بدون أي نص خارج JSON.\"\n : @\"You are a senior .NET backend developer. Respond with valid JSON only.\";\n\n // 👈 اختيار الـ User Prompt حسب اللغة\n var userPrompt = _language == \"ar\"\n ? $@\"\nقم بمراجعة دالة C# التالية:\n\nاسم الدالة: {function.FunctionName}\nرقم السطر: {function.LineNumber}\n\nالكود:\n```csharp\n{function.Code}\nقم بالرد بصيغة JSON بالهيكل التالي:\n{{\n\"\"issues\"\": [\n{{ \"\"severity\"\": \"\"Warning\"\", \"\"message\"\": \"\"وصف المشكلة\"\", \"\"codeSnippet\"\": \"\"السطر المرتبط\"\" }}\n],\n\"\"suggestion\"\": \"\"اقتراح التحسين الشامل\"\"\n}}\n\nدرجة الخطورة: \"\"Info\"\"، \"\"Warning\"\"، أو \"\"Critical\"\".\nقم بالرد باللغة العربية.\"\n: $@\"\nReview this C# function:\n\nFunction Name: {function.FunctionName}\nLine Number: {function.LineNumber}\n\nCode:\n\ncsharp\n{function.Code}\nReturn JSON with this exact structure:\n{{\n\"\"issues\"\": [\n{{ \"\"severity\"\": \"\"Warning\"\", \"\"message\"\": \"\"issue description\"\", \"\"codeSnippet\"\": \"\"relevant code line\"\" }}\n],\n\"\"suggestion\"\": \"\"overall improvement suggestion\"\"\n}}\n\nSeverity must be: \"\"Info\"\", \"\"Warning\"\", or \"\"Critical\"\".\";\n\n var request = new\n {\n model = _model,\n messages = new[]\n {\nnew { role = \"system\", content = systemPrompt },\nnew { role = \"user\", content = userPrompt }\n},\n temperature = 0.3,\n max_tokens = 800\n };\n\n try\n {\n var json = JsonSerializer.Serialize(request);\n var content = new StringContent(json, Encoding.UTF8, \"application/json\");\n\n var response = await _httpClient.PostAsync(\n \"https://api.deepseek.com/v1/chat/completions\",\n content);\n\n var responseJson = await response.Content.ReadAsStringAsync();\n\n using var doc = JsonDocument.Parse(responseJson);\n var result = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"message\").GetProperty(\"content\").GetString() ?? \"\";\n\n var (issues, suggestion) = ParseResponse(result);\n\n function.Issues = issues;\n function.Suggestion = suggestion;\n }\n catch (Exception ex)\n {\n function.Suggestion = _language == \"ar\"\n ? $\"⚠️ خطأ في DeepSeek: {ex.Message}\"\n : $\"⚠️ DeepSeek Error: {ex.Message}\";\n function.Issues = new List();\n }\n\n return function;\n }\n\n public async Task GenerateSummaryAsync(List reviews)\n {\n var totalIssues = reviews.Sum(r => r.Issues.Count);\n var critical = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Critical));\n var warnings = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Warning));\n\n if (_language == \"ar\")\n {\n var result = $@\"\n📊 ملخص المراجعة\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 عدد الدوال التي تمت مراجعتها: {reviews.Count}\n🐛 إجمالي المشاكل: {totalIssues}\n🔴 خطيرة: {critical}\n⚠️ تحذيرات: {warnings}\n\";\n\n if (critical > 0)\n {\n result += \"\\n⚠️ يرجى إصلاح المشاكل الخطيرة قبل المتابعة!\";\n }\n else if (totalIssues == 0)\n {\n result += \"\\n✨ ممتاز! لم يتم العثور على أي مشاكل.\";\n }\n\n return await Task.FromResult(result);\n }\n else\n {\n var result = $@\"\n📊 Review Summary\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 Functions reviewed: {reviews.Count}\n🐛 Total issues: {totalIssues}\n🔴 Critical: {critical}\n⚠️ Warnings: {warnings}\n\";\n\n if (critical > 0)\n {\n result += \"\\n⚠️ Please fix critical issues before merging!\";\n }\n else if (totalIssues == 0)\n {\n result += \"\\n✨ Excellent! No issues found.\";\n }\n\n return await Task.FromResult(result);\n }\n }\n\n private (List issues, string suggestion) ParseResponse(string response)\n {\n try\n {\n var json = response.Trim();\n var start = json.IndexOf('{');\n var end = json.LastIndexOf('}');\n\n if (start >= 0 && end > start)\n {\n json = json.Substring(start, end - start + 1);\n }\n\n using var doc = JsonDocument.Parse(json);\n var root = doc.RootElement;\n\n var issues = new List();\n\n if (root.TryGetProperty(\"issues\", out var issuesArray))\n {\n foreach (var item in issuesArray.EnumerateArray())\n {\n var severityStr = item.GetProperty(\"severity\").GetString();\n var severity = severityStr?.ToLower() switch\n {\n \"critical\" => IssueSeverity.Critical,\n \"warning\" => IssueSeverity.Warning,\n _ => IssueSeverity.Info\n };\n\n issues.Add(new Issue\n {\n Severity = severity,\n Message = item.GetProperty(\"message\").GetString() ?? \"\",\n CodeSnippet = item.TryGetProperty(\"codeSnippet\", out var snippet)\n ? snippet.GetString()\n : null\n });\n }\n }\n\n var suggestion = root.TryGetProperty(\"suggestion\", out var suggestionProp)\n ? suggestionProp.GetString() ?? \"\"\n : \"\";\n\n return (issues, suggestion);\n }\n catch\n {\n return (new List(), _language == \"ar\" ? \"تعذر تحليل استجابة الذكاء الاصطناعي\" : \"Unable to parse response\");\n }\n }\n}"}, "e0fc575fcf2216ac99e8d37a900882e9210f0987": {"t": 1785760507.9815562, "n": 6828, "h": "d753ac7050a67c72", "c": "using AICodeReviewer.Core.Models;\nusing System.Net.Http.Headers;\nusing System.Text;\nusing System.Text.Json;\n\nnamespace AICodeReviewer.Core.AI.Providers;\n\npublic class DeepSeekProvider : IAIProvider\n{\n private readonly HttpClient _httpClient;\n private readonly string _apiKey;\n private readonly string _model;\n private string _language = \"en\"; // 👈 إضافة\n\n public string ProviderName => \"DeepSeek\";\n public bool IsAvailable => !string.IsNullOrEmpty(_apiKey);\n\n public DeepSeekProvider(string apiKey, string model = \"deepseek-chat\")\n {\n _httpClient = new HttpClient();\n _apiKey = apiKey;\n _model = model;\n _httpClient.DefaultRequestHeaders.Authorization =\n new AuthenticationHeaderValue(\"Bearer\", _apiKey);\n }\n\n public void SetLanguage(string language) // 👈 إضافة\n {\n _language = language;\n }\n\n public async Task ReviewFunctionAsync(FunctionReview function)\n {\n // 👈 اختيار الـ System Prompt حسب اللغة\n var systemPrompt = _language == \"ar\"\n ? @\"أنت خبير متخصص في .NET و C# مع خبرة 10 سنوات.\nمهمتك هي تحليل كود C# وتقديم ملاحظات بناءة ودقيقة.\nيجب أن يكون الرد بصيغة JSON فقط بدون أي نص خارج JSON.\"\n : @\"You are a senior .NET backend developer. Respond with valid JSON only.\";\n\n // 👈 اختيار الـ User Prompt حسب اللغة\n var userPrompt = _language == \"ar\"\n ? $@\"\nقم بمراجعة دالة C# التالية:\n\nاسم الدالة: {function.FunctionName}\nرقم السطر: {function.LineNumber}\n\nالكود:\n```csharp\n{function.Code}\nقم بالرد بصيغة JSON بالهيكل التالي:\n{{\n\"\"issues\"\": [\n{{ \"\"severity\"\": \"\"Warning\"\", \"\"message\"\": \"\"وصف المشكلة\"\", \"\"codeSnippet\"\": \"\"السطر المرتبط\"\" }}\n],\n\"\"suggestion\"\": \"\"اقتراح التحسين الشامل\"\"\n}}\n\nدرجة الخطورة: \"\"Info\"\"، \"\"Warning\"\"، أو \"\"Critical\"\".\nقم بالرد باللغة العربية.\"\n: $@\"\nReview this C# function:\n\nFunction Name: {function.FunctionName}\nLine Number: {function.LineNumber}\n\nCode:\n\ncsharp\n{function.Code}\nReturn JSON with this exact structure:\n{{\n\"\"issues\"\": [\n{{ \"\"severity\"\": \"\"Warning\"\", \"\"message\"\": \"\"issue description\"\", \"\"codeSnippet\"\": \"\"relevant code line\"\" }}\n],\n\"\"suggestion\"\": \"\"overall improvement suggestion\"\"\n}}\n\nSeverity must be: \"\"Info\"\", \"\"Warning\"\", or \"\"Critical\"\".\";\n\n var request = new\n {\n model = _model,\n messages = new[]\n {\nnew { role = \"system\", content = systemPrompt },\nnew { role = \"user\", content = userPrompt }\n},\n temperature = 0.3,\n max_tokens = 800\n };\n\n try\n {\n var json = JsonSerializer.Serialize(request);\n var content = new StringContent(json, Encoding.UTF8, \"application/json\");\n\n var response = await _httpClient.PostAsync(\n \"https://api.deepseek.com/v1/chat/completions\",\n content);\n\n var responseJson = await response.Content.ReadAsStringAsync();\n\n using var doc = JsonDocument.Parse(responseJson);\n var result = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"message\").GetProperty(\"content\").GetString() ?? \"\";\n\n var (issues, suggestion) = ParseResponse(result);\n\n function.Issues = issues;\n function.Suggestion = suggestion;\n }\n catch (Exception ex)\n {\n function.Suggestion = _language == \"ar\"\n ? $\"⚠️ خطأ في DeepSeek: {ex.Message}\"\n : $\"⚠️ DeepSeek Error: {ex.Message}\";\n function.Issues = new List();\n }\n\n return function;\n }\n\n public async Task GenerateSummaryAsync(List reviews)\n {\n var totalIssues = reviews.Sum(r => r.Issues.Count);\n var critical = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Critical));\n var warnings = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Warning));\n\n if (_language == \"ar\")\n {\n var result = $@\"\n📊 ملخص المراجعة\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 عدد الدوال التي تمت مراجعتها: {reviews.Count}\n🐛 إجمالي المشاكل: {totalIssues}\n🔴 خطيرة: {critical}\n⚠️ تحذيرات: {warnings}\n\";\n\n if (critical > 0)\n {\n result += \"\\n⚠️ يرجى إصلاح المشاكل الخطيرة قبل المتابعة!\";\n }\n else if (totalIssues == 0)\n {\n result += \"\\n✨ ممتاز! لم يتم العثور على أي مشاكل.\";\n }\n\n return await Task.FromResult(result);\n }\n else\n {\n var result = $@\"\n📊 Review Summary\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 Functions reviewed: {reviews.Count}\n🐛 Total issues: {totalIssues}\n🔴 Critical: {critical}\n⚠️ Warnings: {warnings}\n\";\n\n if (critical > 0)\n {\n result += \"\\n⚠️ Please fix critical issues before merging!\";\n }\n else if (totalIssues == 0)\n {\n result += \"\\n✨ Excellent! No issues found.\";\n }\n\n return await Task.FromResult(result);\n }\n }\n\n private (List issues, string suggestion) ParseResponse(string response)\n {\n try\n {\n var json = response.Trim();\n var start = json.IndexOf('{');\n var end = json.LastIndexOf('}');\n\n if (start >= 0 && end > start)\n {\n json = json.Substring(start, end - start + 1);\n }\n\n using var doc = JsonDocument.Parse(json);\n var root = doc.RootElement;\n\n var issues = new List();\n\n if (root.TryGetProperty(\"issues\", out var issuesArray))\n {\n foreach (var item in issuesArray.EnumerateArray())\n {\n var severityStr = item.GetProperty(\"severity\").GetString();\n var severity = severityStr?.ToLower() switch\n {\n \"critical\" => IssueSeverity.Critical,\n \"warning\" => IssueSeverity.Warning,\n _ => IssueSeverity.Info\n };\n\n issues.Add(new Issue\n {\n Severity = severity,\n Message = item.GetProperty(\"message\").GetString() ?? \"\",\n CodeSnippet = item.TryGetProperty(\"codeSnippet\", out var snippet)\n ? snippet.GetString()\n : null\n });\n }\n }\n\n var suggestion = root.TryGetProperty(\"suggestion\", out var suggestionProp)\n ? suggestionProp.GetString() ?? \"\"\n : \"\";\n\n return (issues, suggestion);\n }\n catch\n {\n return (new List(), _language == \"ar\" ? \"تعذر تحليل استجابة الذكاء الاصطناعي\" : \"Unable to parse response\");\n }\n }\n}"}, "912456da43cc1535e360a3712a371744f901b4b5": {"t": 1785760509.3278568, "n": 5020, "h": "9fd99a7561b7ed7f", "c": "using AICodeReviewer.Core.Models;\nusing System.Net.Http.Headers;\nusing System.Text;\nusing System.Text.Json;\n\n\nnamespace AICodeReviewer.Core.AI.Providers;\n\npublic class DeepSeekProvider : IAIProvider\n{\n private readonly HttpClient _httpClient;\n private readonly string _apiKey;\n private readonly string _model;\n\n public string ProviderName => \"DeepSeek\";\n public bool IsAvailable => !string.IsNullOrEmpty(_apiKey);\n\n public DeepSeekProvider(string apiKey, string model = \"deepseek-chat\")\n {\n _httpClient = new HttpClient();\n _apiKey = apiKey;\n _model = model;\n _httpClient.DefaultRequestHeaders.Authorization =\n new AuthenticationHeaderValue(\"Bearer\", _apiKey);\n }\n\n public async Task ReviewFunctionAsync(FunctionReview function)\n {\n var request = new\n {\n model = _model,\n messages = new[]\n {\n new {\n role = \"system\",\n content = @\"You are a senior .NET backend developer. Respond with valid JSON only.\"\n },\n new {\n role = \"user\",\n content = $@\"\nReview this C# function:\n\nFunction: {function.FunctionName}\nCode:\n```csharp\n{function.Code}\nReturn JSON: {{ \"\"issues\"\": [{{ \"\"severity\"\": \"\"Warning\"\", \"\"message\"\": \"\"...\"\" }}], \"\"suggestion\"\": \"\"...\"\" }}\"\n}\n},\n temperature = 0.3,\n max_tokens = 800\n };\n\n try\n {\n var json = JsonSerializer.Serialize(request);\n var content = new StringContent(json, Encoding.UTF8, \"application/json\");\n\n var response = await _httpClient.PostAsync(\n \"https://api.deepseek.com/v1/chat/completions\",\n content);\n\n var responseJson = await response.Content.ReadAsStringAsync();\n\n using var doc = JsonDocument.Parse(responseJson);\n var result = doc.RootElement.GetProperty(\"choices\")[0].GetProperty(\"message\").GetProperty(\"content\").GetString() ?? \"\";\n\n var (issues, suggestion) = ParseResponse(result);\n\n function.Issues = issues;\n function.Suggestion = suggestion;\n }\n catch (Exception ex)\n {\n function.Suggestion = $\"⚠️ DeepSeek Error: {ex.Message}\";\n function.Issues = new List();\n }\n\n return function;\n }\n\n public async Task GenerateSummaryAsync(List reviews)\n {\n var totalIssues = reviews.Sum(r => r.Issues.Count);\n var critical = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Critical));\n var warnings = reviews.Sum(r => r.Issues.Count(i => i.Severity == IssueSeverity.Warning));\n\n var result = $@\"\n📊 Review Summary\n━━━━━━━━━━━━━━━━━━━━━━━━━━\n📝 Functions reviewed: {reviews.Count}\n🐛 Total issues: {totalIssues}\n🔴 Critical: {critical}\n⚠️ Warnings: {warnings}\n\";\n\n if (critical > 0)\n {\n result += \"\\n⚠️ Please fix critical issues before merging!\";\n }\n else if (totalIssues == 0)\n {\n result += \"\\n✨ Excellent! No issues found.\";\n }\n\n return await Task.FromResult(result);\n }\n\n private (List issues, string suggestion) ParseResponse(string response)\n {\n // نفس الـ ParseResponse من OllamaProvider\n try\n {\n var json = response.Trim();\n var start = json.IndexOf('{');\n var end = json.LastIndexOf('}');\n\n if (start >= 0 && end > start)\n {\n json = json.Substring(start, end - start + 1);\n }\n\n using var doc = JsonDocument.Parse(json);\n var root = doc.RootElement;\n\n var issues = new List();\n\n if (root.TryGetProperty(\"issues\", out var issuesArray))\n {\n foreach (var item in issuesArray.EnumerateArray())\n {\n var severityStr = item.GetProperty(\"severity\").GetString();\n var severity = severityStr?.ToLower() switch\n {\n \"critical\" => IssueSeverity.Critical,\n \"warning\" => IssueSeverity.Warning,\n _ => IssueSeverity.Info\n };\n\n issues.Add(new Issue\n {\n Severity = severity,\n Message = item.GetProperty(\"message\").GetString() ?? \"\",\n CodeSnippet = item.TryGetProperty(\"codeSnippet\", out var snippet)\n ? snippet.GetString()\n : null\n });\n }\n }\n\n var suggestion = root.TryGetProperty(\"suggestion\", out var suggestionProp)\n ? suggestionProp.GetString() ?? \"\"\n : \"\";\n\n return (issues, suggestion);\n }\n catch\n {\n return (new List(), \"Unable to parse response\");\n }\n }\n}\n"}}}}