diff --git a/.gitignore b/.gitignore index 9491a2f..f5dad3a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.user *.userosscache *.sln.docstates +appsettings.json # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs diff --git a/GTPCorrgir.csproj b/GTPCorrgir.csproj index 6fe1626..2c92ab1 100644 --- a/GTPCorrgir.csproj +++ b/GTPCorrgir.csproj @@ -32,5 +32,11 @@ + + + PreserveNewest + + + diff --git a/Program.cs b/Program.cs index 7f28245..b853f89 100644 --- a/Program.cs +++ b/Program.cs @@ -13,7 +13,8 @@ namespace GTPCorrgir { OpenAI, Ollama, - Groq + Groq, + Grok // x.ai } public enum modoDeUso { @@ -29,6 +30,7 @@ namespace GTPCorrgir { { Opciones.LLM_a_Usar.Ollama, "Ollama" }, { Opciones.LLM_a_Usar.Groq, "Groq" }, + { Opciones.LLM_a_Usar.Grok, "Grok" }, { Opciones.LLM_a_Usar.OpenAI, "OpenAI" }, }; @@ -42,8 +44,8 @@ namespace GTPCorrgir if (_instance == null) { _instance = new Opciones(); - _instance.LLM = LLM_a_Usar.OpenAI; - _instance.modo = modoDeUso.Corregir; + _instance.LLM = LLM_a_Usar.Grok; + _instance.modo = modoDeUso.Chat; } return _instance; } @@ -76,6 +78,8 @@ namespace GTPCorrgir Opciones.Instance.LLM = Opciones.LLM_a_Usar.Ollama; else if (arg.Contains("Groq")) Opciones.Instance.LLM = Opciones.LLM_a_Usar.Groq; + else if (arg.Contains("Grok")) + Opciones.Instance.LLM = Opciones.LLM_a_Usar.Grok; else if (arg.Contains("OpenAI")) Opciones.Instance.LLM = Opciones.LLM_a_Usar.OpenAI; diff --git a/gtpask.cs b/gtpask.cs index 1622ea5..29df322 100644 --- a/gtpask.cs +++ b/gtpask.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Net.Http; using System.Text; @@ -14,11 +15,23 @@ using libObsidean; namespace GTPCorrgir { + public class ApiSettings + { + public class ApiKeySection + { + public string OpenAI { get; set; } + public string Groq { get; set; } + public string Grok { get; set; } + } + + public ApiKeySection ApiKeys { get; set; } + } public class gtpask { - private readonly string openAiApiKey = "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"; - private readonly string groqApiKey = "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"; + private readonly string openAiApiKey; + private readonly string groqApiKey; + private readonly string grokApiKey; public Logger Log = new Logger(); private Dictionary languageMap = new Dictionary { @@ -35,6 +48,37 @@ namespace GTPCorrgir public string TextodeSistema; private const bool Simulacion = false; + public gtpask() + { + try + { + string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json"); + if (File.Exists(configPath)) + { + string jsonContent = File.ReadAllText(configPath); + var settings = JsonConvert.DeserializeObject(jsonContent); + + openAiApiKey = settings.ApiKeys.OpenAI; + groqApiKey = settings.ApiKeys.Groq; + grokApiKey = settings.ApiKeys.Grok; + + if (string.IsNullOrEmpty(openAiApiKey) || string.IsNullOrEmpty(groqApiKey) || string.IsNullOrEmpty(grokApiKey)) + { + Log.Log("Warning: One or more API keys are missing in the configuration file."); + } + } + else + { + Log.Log("Error: Configuration file (appsettings.json) not found."); + throw new FileNotFoundException("Configuration file (appsettings.json) not found."); + } + } + catch (Exception ex) + { + Log.Log($"Error loading configuration: {ex.Message}"); + throw; + } + } private string CrearMensajeDeSistema() { @@ -132,6 +176,7 @@ namespace GTPCorrgir if (Opciones.Instance.LLM == Opciones.LLM_a_Usar.OpenAI) RespuestaLLM = await CallOpenAiApi(TextoACorregir); if (Opciones.Instance.LLM == Opciones.LLM_a_Usar.Ollama) RespuestaLLM = await CallOllamaApi(TextoACorregir); if (Opciones.Instance.LLM == Opciones.LLM_a_Usar.Groq) RespuestaLLM = await CallGroqAiApi(TextoACorregir); + if (Opciones.Instance.LLM == Opciones.LLM_a_Usar.Grok) RespuestaLLM = await CallGrokApi(TextoACorregir); } else { await Task.Delay(1000); @@ -235,6 +280,74 @@ namespace GTPCorrgir } + private async Task CallGrokApi(string input) + { + using var httpClient = new HttpClient(); + string Mensaje_Sistema = CrearMensajeDeSistema(); + string Mensaje_Usuario = CrearMensajeDeUsuario(input); + + // Configurar headers + httpClient.DefaultRequestHeaders.Clear(); + httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {grokApiKey}"); + + // Crear el objeto de solicitud siguiendo exactamente el formato del ejemplo curl + var requestData = new + { + messages = new[] + { + new { role = "system", content = Mensaje_Sistema }, + new { role = "user", content = Mensaje_Usuario } + }, + model = "grok-beta", + stream = false, + temperature = 0 + }; + + var content = new StringContent( + JsonConvert.SerializeObject(requestData), + Encoding.UTF8, + "application/json" + ); + + try + { + Log.Log("Ask Grok: " + JsonConvert.SerializeObject(requestData)); + + // URL corregida para coincidir con el ejemplo + var response = await httpClient.PostAsync("https://api.x.ai/v1/chat/completions", content); + response.EnsureSuccessStatusCode(); + + var jsonResponse = await response.Content.ReadAsStringAsync(); + Log.Log("Grok Response: " + jsonResponse); // Logging la respuesta para debug + + dynamic data = JsonConvert.DeserializeObject(jsonResponse); + return data.choices[0].message.content; + } + catch (HttpRequestException e) + { + Log.Log($"Error en la solicitud HTTP: {e.Message}"); + Console.WriteLine($"Error making HTTP request: {e.Message}"); + return null; + } + catch (JsonException e) + { + Log.Log($"Error al procesar JSON: {e.Message}"); + Console.WriteLine($"Error processing JSON response: {e.Message}"); + return null; + } + catch (Exception e) + { + Log.Log($"Error general: {e.Message}"); + Console.WriteLine($"An error occurred: {e.Message}"); + return null; + } + finally + { + httpClient?.Dispose(); + } + } + + private async Task CallOllamaApi(string input) { var httpClient = new HttpClient(); @@ -245,7 +358,7 @@ namespace GTPCorrgir var requestData = new { - model = "phi3", //"llama3", + model = "llama3.2:latest", // "phi3", //"llama3", messages = new[] { new { role = "system", content = Mensaje_Sistema }, @@ -294,7 +407,7 @@ namespace GTPCorrgir var requestData = new { - model = "gpt-4", + model = "gpt-4o-mini", //"gpt -4", messages = new[] { new { role = "system", content = Mensaje_Sistema }, @@ -326,6 +439,7 @@ namespace GTPCorrgir } } + private async Task CallGroqAiApi(string input) { var httpClient = new HttpClient(); @@ -336,7 +450,7 @@ namespace GTPCorrgir var requestData = new { - model = "llama3-70b-8192", + model = "llama-3.1-70b-versatile", // "llama3-70b-8192", messages = new[] { new { role = "system", content = Mensaje_Sistema },