using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using LanguageDetection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Diagnostics; namespace GTPCorrgir { internal class gtpask { private readonly string openAiApiKey = "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"; public Logger Log = new Logger(); private Dictionary languageMap = new Dictionary { { "en", "English" }, { "es", "Spanish" }, { "it", "Italian" }, { "pt", "Portuguese" } // Agrega más idiomas según sea necesario }; public string IdiomaDetectado; public string TextoACorregir; public string TextoCorregido; public string TextodeSistema; private string CrearMensajeDeSistema() { return "You are an engineer working in industrial automation. Your task is to review texts and rewrite them in a simple and concise manner, making sure to preserve important technical terms specially if they are in English. Please rewrite the following text in " + IdiomaDetectado + " and respond in the following JSON format: { 'Rewritten_text': 'Your text here' }."; } private string CrearMensajeDeUsuario(string texto) { return "Please rewrite and improve the following text to make it clearer and more concise the words inside brackets are technical words: \"" + texto + "\""; } private string DetectarIdioma(string TextoACorregir) { LanguageDetector detector = new LanguageDetector(); detector.AddLanguages("en", "es", "it"); string detectedLanguageCode = detector.Detect(TextoACorregir); string detectedLanguageName = languageMap.ContainsKey(detectedLanguageCode) ? languageMap[detectedLanguageCode] : "Desconocido"; return detectedLanguageName; } private bool DetectarIdioma() { if (TextoACorregir.Length>0) { IdiomaDetectado = DetectarIdioma(TextoACorregir); Log.Log("Idioma: " + IdiomaDetectado); if(IdiomaDetectado != "Desconocido") return true; else return false; } return false; } public async Task CorregirTexto() { Log.Log("Texto a corregir: " + TextoACorregir); if (DetectarIdioma()) { if (IdiomaDetectado == "Desconocido" || this.TextoACorregir.Length == 0) { // Nada que hacer TextoCorregido = TextoACorregir; return; } var md = new Obsidean(); md.LeerPalabrasTecnicas(); TextoACorregir = md.MarkTechnicalTerms(TextoACorregir); Log.Log("Texto a marcado: " + TextoACorregir); string RespuestaLLM = await CallOpenAiApi(TextoACorregir); //string RespuestaLLM = await CallOllamaApi(TextoACorregir); Log.Log("Respuesta: " + RespuestaLLM); TextoCorregido = ExtractCorrectedText(RespuestaLLM); // Elimina comillas al principio y al final si existen TextoCorregido = TextoCorregido.Trim('\"'); Log.Log("Texto a corregido: " + TextoCorregido); } } static string ExtractCorrectedText(string input) { try { // Encuentra el índice del inicio y del final del JSON int startJson = input.IndexOf('{'); int endJson = input.IndexOf('}') + 1; if (startJson == -1 || endJson == -1 || endJson <= startJson) { throw new Exception("No valid JSON found in the input string."); } // Extrae solo la parte JSON de la entrada string jsonString = input.Substring(startJson, endJson - startJson); // Parsea el JSON y extrae el campo "Rewritten_text" JObject jsonObject = JObject.Parse(jsonString); string rewrittenText = (string)jsonObject["Rewritten_text"]; return rewrittenText; } catch (Exception ex) { Console.WriteLine("An error occurred: " + ex.Message); return null; } } private async Task CallOllamaApi(string input) { var httpClient = new HttpClient(); string Mensaje_Sistema = CrearMensajeDeSistema(); string Mensaje_Usuario = CrearMensajeDeUsuario(input); httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {openAiApiKey}"); var requestData = new { model = "llama3", messages = new[] { new { role = "system", content = Mensaje_Sistema }, new { role = "user", content = Mensaje_Usuario } }, stream = false }; var content = new StringContent(JsonConvert.SerializeObject(requestData), Encoding.UTF8, "application/json"); try { Log.Log("Ask Ollama: " + content.ToString()); var response = await httpClient.PostAsync("http://127.0.0.1:11434/api/chat", content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); dynamic data = JsonConvert.DeserializeObject(jsonResponse); if (data.done == true && data.message != null) { return data.message.content; } return "No hubo respuesta del asistente o la sesión aún no ha concluido."; } catch (HttpRequestException e) { // Captura errores en la solicitud HTTP, como problemas de red o respuestas de error HTTP. Console.WriteLine($"Error making HTTP request: {e.Message}"); return null; } catch (Exception e) { // Captura cualquier otro error Console.WriteLine($"An error occurred: {e.Message}"); return null; } } private async Task CallOpenAiApi(string input) { var httpClient = new HttpClient(); string Mensaje_Sistema = CrearMensajeDeSistema(); string Mensaje_Usuario = CrearMensajeDeUsuario(input); httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {openAiApiKey}"); var requestData = new { model = "gpt-4", messages = new[] { new { role = "system", content = Mensaje_Sistema }, new { role = "user", content = Mensaje_Usuario } } }; var content = new StringContent(JsonConvert.SerializeObject(requestData), Encoding.UTF8, "application/json"); try { Log.Log("Ask OpenAI: " + content.ToString()); var response = await httpClient.PostAsync("https://api.openai.com/v1/chat/completions", content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); dynamic data = JsonConvert.DeserializeObject(jsonResponse); return data.choices[0].message.content; } catch (HttpRequestException e) { // Captura errores en la solicitud HTTP, como problemas de red o respuestas de error HTTP. Console.WriteLine($"Error making HTTP request: {e.Message}"); return null; } catch (Exception e) { // Captura cualquier otro error Console.WriteLine($"An error occurred: {e.Message}"); return null; } } } }