Files
soft_usite/rest/controllers/api/ia_v2_controller.go
T
Lizandro GuarnizoandClaude Opus 5 5f95e67595 fix(api-v2): que el fallo de /vcard/ia quede en el log y distinga de quién es el problema
La integración muestra solo "error code: 502" y el motivo no quedaba escrito en
ningún lado. Ahora se loguea.

Y el estado separa los dos casos: 503 si falta configurar la IA de este lado,
502 si el que falló fue el proveedor. Con el mismo código para ambos no se sabe
a quién mirar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 21:19:15 -05:00

53 lines
1.8 KiB
Go

package controllers
import (
"log"
"strings"
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/pkg/services"
)
// GenerarTextoIA corre una generación con la configuración de IA que el staff
// eligió en /app/ai-config para el módulo "ia" (el que la pantalla llama
// "IA / vCard").
//
// La clave del proveedor no sale de acá: la integración manda su prompt con su
// propia API key de /api/v2 y recibe el texto. Es la diferencia con devolverle
// la configuración —incluida la clave de OpenAI o Anthropic— a otra aplicación.
//
// POST /api/v2/vcard/ia {"prompt": "...", "sistema": "..."}
func GenerarTextoIA(c *fiber.Ctx) error {
var body struct {
Prompt string `json:"prompt"`
Sistema string `json:"sistema"`
}
if err := c.BodyParser(&body); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "body inválido"})
}
if body.Prompt == "" {
return c.Status(400).JSON(fiber.Map{"error": "prompt requerido"})
}
if body.Sistema == "" {
body.Sistema = "Respondé de forma clara y breve."
}
// El módulo va fijo: si lo eligiera quien llama, una llave con scope vcard
// podría usar la configuración del agente o la del Landing Generator.
texto, err := services.CompletarTextoIA("ia", body.Sistema, body.Prompt)
if err != nil {
// Al log también: la integración suele mostrar solo el código de estado,
// y sin esta línea el motivo no queda registrado en ningún lado.
log.Printf("[IA v2] falló la generación: %v", err)
// 503 cuando falta configurar algo de este lado y 502 cuando el que
// falló fue el proveedor: son problemas de dueños distintos.
estado := 502
if strings.Contains(err.Error(), "configuración de IA") {
estado = 503
}
return c.Status(estado).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"texto": texto})
}