ImageModerationDetectorService
Este documento describe el funcionamiento del archivo image-moderation-detector.service.ts, el cual forma parte del backend NestJS del sistema ElephanTalk. Su objetivo principal es analizar una imagen (por URL o base64) para determinar si contiene contenido NSFW (Not Safe For Work).
Objetivo del Servicio
Este servicio proporciona una capa de integración con un microservicio externo de moderación de imágenes, el cual retorna un nivel de probabilidad de contenido NSFW. Si la imagen supera un umbral definido por el entorno, se considera inapropiada.
Dependencias
@nestjs/common: Proporciona decoradores como@Injectabley excepciones HTTP comoServiceUnavailableException.@nestjs/axios: Utilizado para realizar peticiones HTTP al microservicio de moderación.rxjs: Para convertir observables a promesas.@nestjs/config: Acceso a variables de entorno (IMAGE_MODERATION_URLyIMAGE_MOD_THRESHOLD_NSF).
Variables de Entorno Relevantes
| Variable | Descripción |
|---|---|
IMAGE_MODERATION_URL |
URL base del microservicio de moderación de imágenes |
IMAGE_MOD_THRESHOLD_NSF |
Umbral numérico (0 a 1) para considerar la imagen NSFW |
Interfaz Interna
interface ModerationResult {
nsfw: { nsfw: number };
}
Esta interfaz modela el resultado que devuelve el microservicio. El atributo nsfw.nsfw representa un valor entre 0 y 1 que indica la probabilidad de que la imagen sea NSFW.
Métodos
constructor()
Inicializa el servicio cargando la URL y el umbral desde las variables de entorno.
async isImageAllowed(base64OrUrl: string, isUrl = false): Promise<{ allowed: boolean; reasons: string\[]; raw: ModerationResult }>
Evalúa una imagen y determina si puede ser publicada o no.
Parámetros:
base64OrUrl: cadena base64 o URL de la imagen.isUrl: booleano que indica si el primer argumento es una URL o una cadena base64.
Proceso:
- Construye el payload dependiendo de
isUrl. - Hace una petición POST a
/moderatedel microservicio externo. - Si la petición falla, lanza
ServiceUnavailableException. - Compara el valor de
raw.nsfw.nsfwcon el umbral (thrNsfw). - Si supera el umbral, se considera NSFW y se agrega a
reasons. - Imprime log de depuración con valores clave.
- Retorna:
allowed:truesi la imagen pasa el filtro.reasons: razones por las cuales fue rechazada.raw: objeto con el resultado completo de moderación.
Ejemplo de log generado:
[MODERACIÓN IMAGEN] {
url: 'https://ejemplo.com/imagen.jpg',
isUrl: true,
rawScore: 0.91,
threshold: 0.8,
reasons: ['NSFW']
}
Posibles Excepciones
ServiceUnavailableException: Si el microservicio de moderación está inactivo o la petición falla por timeout u otros motivos.
Recomendaciones
- Asegúrate de configurar correctamente el
.envconIMAGE_MODERATION_URLyIMAGE_MOD_THRESHOLD_NSF. - Puedes ajustar el umbral si deseas una moderación más o menos estricta.
- Verifica que el microservicio externo esté levantado y accesible desde el contenedor de NestJS si usas Docker.