Integración de YandexGPT en .NET: Guía práctica para desarrolladores
YandexGPT no es solo un servicio de LLM en la nube; es una API totalmente gestionada que admite la generación asíncrona de texto e imágenes y se integra a la perfección con la infraestructura empresarial de .NET. Este artículo proporciona una implementación de integración lista para producción, abordando desafíos del mundo real como los tiempos de espera, el estado de las operaciones, el manejo de Base64 y la sanitización de la salida en Markdown. Nos centramos en lo que más importa en entornos de producción: tolerancia a fallos, seguridad de tipos, control de la ingeniería de prompts y almacenamiento seguro de credenciales.
Arquitectura del cliente e inicialización segura
La clase MyGPTClient debe ser thread-safe y evitar fugas de recursos. Utilizar un HttpClient global es un antipatrón. En su lugar, aprovechamos IHttpClientFactory, registrado mediante Inyección de Dependencias:
// Program.cs
builder.Services.AddHttpClient<MyGPTClient>((sp, client) =>
{
var config = sp.GetRequiredService<IConfiguration>();
client.BaseAddress = new Uri("https://llm.api.cloud.yandex.net/");
client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue(
"Api-Key", config["Yandex:ApiKey"]);
});
El constructor de MyGPTClient ahora acepta IHttpClientFactory en lugar de crear directamente un HttpClient. Las URI de los modelos (gpt://.../yandexgpt, art://.../yandex-art/latest) se trasladan a la configuración, lo que permite cambiar fácilmente entre entornos (desarrollo, staging y producción) sin recompilar.
Importante: El rol ai.languageModels.user requiere una asignación explícita en la política IAM del catálogo de Yandex Cloud. Para entornos CI/CD, se necesita una cuenta de servicio separada con permisos mínimos—solo ai.*.user”—sin roles de editor ni admin`.
Manejo de tareas asíncronas: desde el polling hasta la lógica de reintentos
El método original WaitForTaskCompletionAsync utiliza un bucle infinito con un Task.Delay(1000) fijo. Esto es inaceptable en producción: con más de 50 solicitudes concurrentes, sobrecarga los límites de la API y agota los hilos. Implementamos un polling adaptativo con retroceso exponencial y límites de reintentos:
private async Task<dynamic> WaitForTaskCompletionAsync(string taskId, int maxAttempts = 30)
{
int attempt = 0;
TimeSpan delay = TimeSpan.FromMilliseconds(500);
while (attempt < maxAttempts)
{
try
{
var response = await _client.GetAsync($
— Editorial Team
Aún no hay comentarios.