Agregada la opción para utilizar el modelo Claude en la aplicación, incluyendo la implementación de la llamada a su API y la validación de la clave API correspondiente. Se realizaron ajustes en el menú y se mejoró la gestión de logs.
This commit is contained in:
parent
6d8f70d15b
commit
a48e64f372
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||||
|
// Use hover for the description of the existing attributes
|
||||||
|
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
|
||||||
|
"name": ".NET Core Launch (console)",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "launch",
|
||||||
|
"preLaunchTask": "build",
|
||||||
|
// If you have changed target frameworks, make sure to update the program path.
|
||||||
|
"program": "${workspaceFolder}/bin/Debug/net8.0-windows/GTPCorrgir.dll",
|
||||||
|
"args": [],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||||
|
"console": "internalConsole",
|
||||||
|
"stopAtEntry": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": ".NET Core Attach",
|
||||||
|
"type": "coreclr",
|
||||||
|
"request": "attach"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "build",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"build",
|
||||||
|
"${workspaceFolder}/GTPCorrgir.sln",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "publish",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"publish",
|
||||||
|
"${workspaceFolder}/GTPCorrgir.sln",
|
||||||
|
"/property:GenerateFullPaths=true",
|
||||||
|
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "watch",
|
||||||
|
"command": "dotnet",
|
||||||
|
"type": "process",
|
||||||
|
"args": [
|
||||||
|
"watch",
|
||||||
|
"run",
|
||||||
|
"--project",
|
||||||
|
"${workspaceFolder}/GTPCorrgir.sln"
|
||||||
|
],
|
||||||
|
"problemMatcher": "$msCompile"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
12
App.xaml.cs
12
App.xaml.cs
|
@ -154,9 +154,9 @@ namespace GTPCorrgir
|
||||||
ShowCustomNotification("Se puede pegar",
|
ShowCustomNotification("Se puede pegar",
|
||||||
$"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
$"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
||||||
|
|
||||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || Opciones.Instance.modo == Opciones.modoDeUso.Ortografia ||
|
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || Opciones.Instance.modo == Opciones.modoDeUso.Ortografia ||
|
||||||
Opciones.Instance.modo == Opciones.modoDeUso.PreguntaRespuesta || Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Espanol ||
|
Opciones.Instance.modo == Opciones.modoDeUso.PreguntaRespuesta || Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Espanol ||
|
||||||
Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Ingles || Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Italiano ||
|
Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Ingles || Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Italiano ||
|
||||||
Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Portugues)
|
Opciones.Instance.modo == Opciones.modoDeUso.Traducir_a_Portugues)
|
||||||
{
|
{
|
||||||
if (Opciones.Instance.FuncionesOpcionales == Opciones.funcionesOpcionales.MostrarPopUp)
|
if (Opciones.Instance.FuncionesOpcionales == Opciones.funcionesOpcionales.MostrarPopUp)
|
||||||
|
@ -215,10 +215,10 @@ namespace GTPCorrgir
|
||||||
{
|
{
|
||||||
_cancellationTokenSource?.Cancel();
|
_cancellationTokenSource?.Cancel();
|
||||||
_cancellationTokenSource?.Dispose();
|
_cancellationTokenSource?.Dispose();
|
||||||
|
|
||||||
// Limpiar recursos de PaddleOCR
|
// Limpiar recursos de PaddleOCR
|
||||||
PaddleOCRManager.Cleanup();
|
PaddleOCRManager.Cleanup();
|
||||||
|
|
||||||
base.OnExit(e);
|
base.OnExit(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ namespace GTPCorrgir
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
GTP.Log.Log($"Mostrando notificación: {title} - {message}");
|
// GTP.Log.Log($"Mostrando notificación: {title} - {message}"); // Comentado para limpiar logs
|
||||||
if (notificationWindow == null)
|
if (notificationWindow == null)
|
||||||
{
|
{
|
||||||
notificationWindow = new notificacion();
|
notificationWindow = new notificacion();
|
||||||
|
|
|
@ -59,7 +59,8 @@ namespace GTPCorrgir
|
||||||
new MenuOption { DisplayName = "OpenAI", Value = Opciones.LLM_a_Usar.OpenAI },
|
new MenuOption { DisplayName = "OpenAI", Value = Opciones.LLM_a_Usar.OpenAI },
|
||||||
new MenuOption { DisplayName = "Ollama", Value = Opciones.LLM_a_Usar.Ollama },
|
new MenuOption { DisplayName = "Ollama", Value = Opciones.LLM_a_Usar.Ollama },
|
||||||
new MenuOption { DisplayName = "Groq", Value = Opciones.LLM_a_Usar.Groq },
|
new MenuOption { DisplayName = "Groq", Value = Opciones.LLM_a_Usar.Groq },
|
||||||
new MenuOption { DisplayName = "Grok", Value = Opciones.LLM_a_Usar.Grok }
|
new MenuOption { DisplayName = "Grok", Value = Opciones.LLM_a_Usar.Grok },
|
||||||
|
new MenuOption { DisplayName = "Claude", Value = Opciones.LLM_a_Usar.Claude }
|
||||||
};
|
};
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
|
@ -14,7 +14,8 @@ namespace GTPCorrgir
|
||||||
OpenAI,
|
OpenAI,
|
||||||
Ollama,
|
Ollama,
|
||||||
Groq,
|
Groq,
|
||||||
Grok
|
Grok,
|
||||||
|
Claude
|
||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@ -45,6 +46,7 @@ namespace GTPCorrgir
|
||||||
{ LLM_a_Usar.Groq, "Groq" },
|
{ LLM_a_Usar.Groq, "Groq" },
|
||||||
{ LLM_a_Usar.Grok, "Grok" },
|
{ LLM_a_Usar.Grok, "Grok" },
|
||||||
{ LLM_a_Usar.OpenAI, "OpenAI" },
|
{ LLM_a_Usar.OpenAI, "OpenAI" },
|
||||||
|
{ LLM_a_Usar.Claude, "Claude" },
|
||||||
};
|
};
|
||||||
|
|
||||||
private static Opciones _instance;
|
private static Opciones _instance;
|
||||||
|
@ -102,6 +104,8 @@ namespace GTPCorrgir
|
||||||
Opciones.Instance.LLM = Opciones.LLM_a_Usar.Grok;
|
Opciones.Instance.LLM = Opciones.LLM_a_Usar.Grok;
|
||||||
else if (arg.Contains("OpenAI"))
|
else if (arg.Contains("OpenAI"))
|
||||||
Opciones.Instance.LLM = Opciones.LLM_a_Usar.OpenAI;
|
Opciones.Instance.LLM = Opciones.LLM_a_Usar.OpenAI;
|
||||||
|
else if (arg.Contains("Claude"))
|
||||||
|
Opciones.Instance.LLM = Opciones.LLM_a_Usar.Claude;
|
||||||
|
|
||||||
if (arg.Contains("CtrlA"))
|
if (arg.Contains("CtrlA"))
|
||||||
Opciones.Instance.FuncionesOpcionales = Opciones.funcionesOpcionales.CtrlA;
|
Opciones.Instance.FuncionesOpcionales = Opciones.funcionesOpcionales.CtrlA;
|
||||||
|
|
61
gtpask.cs
61
gtpask.cs
|
@ -20,6 +20,7 @@ namespace GTPCorrgir
|
||||||
public string OpenAI { get; set; }
|
public string OpenAI { get; set; }
|
||||||
public string Groq { get; set; }
|
public string Groq { get; set; }
|
||||||
public string Grok { get; set; }
|
public string Grok { get; set; }
|
||||||
|
public string Claude { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApiKeySection ApiKeys { get; set; }
|
public ApiKeySection ApiKeys { get; set; }
|
||||||
|
@ -30,6 +31,7 @@ namespace GTPCorrgir
|
||||||
private string _openAiApiKey;
|
private string _openAiApiKey;
|
||||||
private string _groqApiKey;
|
private string _groqApiKey;
|
||||||
private string _grokApiKey;
|
private string _grokApiKey;
|
||||||
|
private string _claudeApiKey;
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private readonly LanguageDetector _languageDetector;
|
private readonly LanguageDetector _languageDetector;
|
||||||
|
@ -90,6 +92,7 @@ namespace GTPCorrgir
|
||||||
_openAiApiKey = settings?.ApiKeys?.OpenAI;
|
_openAiApiKey = settings?.ApiKeys?.OpenAI;
|
||||||
_groqApiKey = settings?.ApiKeys?.Groq;
|
_groqApiKey = settings?.ApiKeys?.Groq;
|
||||||
_grokApiKey = settings?.ApiKeys?.Grok;
|
_grokApiKey = settings?.ApiKeys?.Grok;
|
||||||
|
_claudeApiKey = settings?.ApiKeys?.Claude;
|
||||||
|
|
||||||
ValidateApiKeys();
|
ValidateApiKeys();
|
||||||
}
|
}
|
||||||
|
@ -107,6 +110,7 @@ namespace GTPCorrgir
|
||||||
if (string.IsNullOrEmpty(_openAiApiKey)) missingKeys.Add("OpenAI");
|
if (string.IsNullOrEmpty(_openAiApiKey)) missingKeys.Add("OpenAI");
|
||||||
if (string.IsNullOrEmpty(_groqApiKey)) missingKeys.Add("Groq");
|
if (string.IsNullOrEmpty(_groqApiKey)) missingKeys.Add("Groq");
|
||||||
if (string.IsNullOrEmpty(_grokApiKey)) missingKeys.Add("Grok");
|
if (string.IsNullOrEmpty(_grokApiKey)) missingKeys.Add("Grok");
|
||||||
|
if (string.IsNullOrEmpty(_claudeApiKey)) missingKeys.Add("Claude");
|
||||||
|
|
||||||
if (missingKeys.Any())
|
if (missingKeys.Any())
|
||||||
{
|
{
|
||||||
|
@ -238,6 +242,9 @@ namespace GTPCorrgir
|
||||||
case Opciones.LLM_a_Usar.Grok:
|
case Opciones.LLM_a_Usar.Grok:
|
||||||
respuestaLLM = await CallGrokApi(textoMarcado);
|
respuestaLLM = await CallGrokApi(textoMarcado);
|
||||||
break;
|
break;
|
||||||
|
case Opciones.LLM_a_Usar.Claude:
|
||||||
|
respuestaLLM = await CallClaudeApi(textoMarcado);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentException("LLM no válido");
|
throw new ArgumentException("LLM no válido");
|
||||||
}
|
}
|
||||||
|
@ -462,6 +469,40 @@ namespace GTPCorrgir
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<string> CallClaudeApi(string input)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_httpClient.DefaultRequestHeaders.Clear();
|
||||||
|
_httpClient.DefaultRequestHeaders.Add("x-api-key", _claudeApiKey);
|
||||||
|
_httpClient.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01");
|
||||||
|
|
||||||
|
var requestData = new
|
||||||
|
{
|
||||||
|
model = "claude-sonnet-4-20250514",
|
||||||
|
max_tokens = 4096,
|
||||||
|
temperature = 1,
|
||||||
|
system = CrearMensajeDeSistema(),
|
||||||
|
messages = new[]
|
||||||
|
{
|
||||||
|
new { role = "user", content = CrearMensajeDeUsuario(input) }
|
||||||
|
},
|
||||||
|
thinking = new
|
||||||
|
{
|
||||||
|
type = "enabled",
|
||||||
|
budget_tokens = 2048
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return await EnviarSolicitudLLM("https://api.anthropic.com/v1/messages", requestData);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Log($"Error en llamada a Claude API: {ex.Message}");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<string> EnviarSolicitudLLM(string endpoint, object requestData)
|
private async Task<string> EnviarSolicitudLLM(string endpoint, object requestData)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -498,6 +539,26 @@ namespace GTPCorrgir
|
||||||
}
|
}
|
||||||
throw new ApplicationException("Formato de respuesta de Ollama inválido");
|
throw new ApplicationException("Formato de respuesta de Ollama inválido");
|
||||||
}
|
}
|
||||||
|
else if (endpoint.Contains("anthropic"))
|
||||||
|
{
|
||||||
|
if (data.content != null && data.content.Count > 0)
|
||||||
|
{
|
||||||
|
// Buscar el elemento con type = "text" en el array de content
|
||||||
|
foreach (var contentItem in data.content)
|
||||||
|
{
|
||||||
|
if (contentItem.type == "text")
|
||||||
|
{
|
||||||
|
return contentItem.text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Si no encuentra un elemento con type="text", usar el primer elemento como fallback
|
||||||
|
if (data.content[0].text != null)
|
||||||
|
{
|
||||||
|
return data.content[0].text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new ApplicationException("No se encontró contenido en la respuesta de Claude");
|
||||||
|
}
|
||||||
else // OpenAI, Groq, Grok
|
else // OpenAI, Groq, Grok
|
||||||
{
|
{
|
||||||
if (data.choices != null && data.choices.Count > 0)
|
if (data.choices != null && data.choices.Count > 0)
|
||||||
|
|
Loading…
Reference in New Issue