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}) }