Skip to main content

Servicio GPT

Este servicio maneja la interacción con OpenAI GPT para generar mensajes nutricionales personalizados a partir de la información obtenida de productos analizados con NutriScan. Funciona como un asistente nutricional digital que transforma datos numéricos en recomendaciones o resúmenes comprensibles.


🔍 Ubicación

src/services/gpt.service.ts


📌 Propósito

Generar un mensaje descriptivo y personalizado que resume la información nutricional de un producto alimenticio utilizando un modelo de lenguaje de OpenAI (gpt-3.5-turbo).


🧩 Importaciones clave

import OpenAI from "openai";

Se importa el cliente oficial para interactuar con la API de OpenAI.


🔐 Validación de clave API

const apiKey = process.env.OPENAI_API_KEY;

Se obtiene la clave desde el archivo .env. Si no se encuentra, el sistema emitirá una advertencia y funcionará con respuestas simuladas. En ese caso:

  • No lanza un error ni interrumpe la ejecución.
  • Retorna un mensaje simple basado en los datos locales disponibles del producto (como calorías y azúcares).

Esto permite que el sistema continúe funcionando aunque la clave de OpenAI no esté configurada..


⚠️ Modo simulación

if (!apiKey) {
console.warn("⚠️ No se encontró la clave de OpenAI. Se usarán respuestas simuladas.");
}

🔒 El sistema se adapta automáticamente si no hay clave API. Aún puede entregar mensajes predeterminados basados en los datos.


🧠 Clase: GPTService

Método: generarMensajeNutricional(nombreProducto: string, resultados: any[]): Promise<string>

✅ Propósito

Generar un resumen nutricional del producto utilizando GPT, con base en los valores encontrados en la base de datos o resultado OCR/OpenFoodFacts.

📥 Parámetros

NombreTipoDescripción
nombreProductostringNombre del producto ingresado o reconocido.
resultadosany[]Array con la información nutricional procesada del producto.

📤 Retorna

Una Promise<string> que contiene el mensaje generado o un texto alternativo si no hay conexión con GPT. El mensaje es generado desde completion.choices[0].message?.content. Si por algún motivo GPT no devuelve contenido válido, se retorna el texto: "No se pudo generar el mensaje.


🤖 Estructura del prompt

El mensaje enviado a GPT incluye:

  • Calorías
  • Azúcares
  • Grasas (totales, saturadas, trans)
  • Sodio
  • Fibra
  • Proteínas
  • Nutriscore
  • Grupo NOVA

Ejemplo parcial del prompt generado:

const prompt = `
Eres un nutricionista digital. Tienes la siguiente información nutricional para un producto llamado "${producto.nombre}":

- Calorías: 340 kcal
- Azúcares: 15 g
...
Redacta un mensaje para el usuario resumiendo esta información.
`;

💡 Se utiliza temperature: 0.6 para equilibrar creatividad y precisión.


📦 Manejador de errores

catch (error: any) {
console.error("❌ Error generando mensaje nutricional:", error);
throw new Error(...);
}

Muestra el error en consola y lanza una excepción legible para otros servicios del backend.


🚀 Instancia exportada

export const gptService = new GPTService();

Se exporta una instancia única de GPTService lista para usarse en controladores u otros servicios.


📝 Resumen

ElementoDetalle
Modelo GPT utilizadogpt-3.5-turbo
Dependencia críticaOPENAI_API_KEY en .env
Modo fallbackSí (respuestas simuladas sin GPT)
Uso principalGenerar mensaje nutricional a partir de datos
ExportacióngptService como singleton

🧠 Notas adicionales

  • Apto para extenderse con otros modelos como gpt-4 si se requiere.
  • Ideal para integrarse con rutas como /nutriscan-ocr y /confirmar-nombre.
  • Si el array resultados está vacío, se devuelve un mensaje explicativo al usuario.