Skip to main content
Documentación
CENTRO DE APRENDIZAJE

Domina la moderación de contenido con guías completas, tutoriales y documentación de API

Enlaces rápidos

Guía de moderación de contenido con AI

Discuse analiza texto e imágenes para detectar sentimiento/toxicidad, spam, lenguaje no deseado, malas palabras, enlaces e imágenes explícitas; luego devuelve un resultado por categoría para que tu código pueda aprobar, marcar o rechazar contenido automáticamente. Envías el contenido a un único endpoint, POST https://api.discuse.com/api/v2/check, y recibes puntuaciones estructuradas. Esta guía explica cómo funcionan las comprobaciones, los patrones de moderación que las rodean y cómo integrar la API de Discuse en tu flujo de trabajo.

¿Qué es la moderación de contenido con AI?

La moderación de contenido con AI utiliza modelos de aprendizaje automático para detectar y clasificar automáticamente contenido potencialmente dañino. Mientras que un revisor humano lee un elemento a la vez, estos modelos puntúan el contenido a medida que llega, de modo que los envíos pueden revisarse antes de que lleguen a otros usuarios.

¿Cómo funciona?

  1. Enviar contenido: Envía texto y/o URLs de medios a la API de moderación.
  2. Ejecutar comprobaciones: La API ejecuta las comprobaciones habilitadas (sentimiento, idioma, spam, palabras prohibidas, imágenes, enlaces, antivirus).
  3. Puntuar cada categoría: Cada comprobación devuelve puntuaciones y una marca hit que indica si ha superado el umbral configurado.
  4. Decidir: Consulta has_violations (y las puntuaciones de cada comprobación) para aprobar, marcar o rechazar.

Con Discuse, la solicitud se ve así:

const response = await fetch('https://api.discuse.com/api/v2/check', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': process.env.DISCUSE_API_KEY
  },
  body: JSON.stringify({
    content: { text: 'message to check', image_urls: ['https://...'] },
    settings: { check_sentiment: true, check_spam: true, check_images: true }
  })
});
const result = await response.json(); // { has_violations, results: { sentiment, spamfinder, images, ... }, usage }

¿Qué cubre cada comprobación de Discuse?

Comprobación (interruptor de settings) Qué cubre Campos clave del resultado
check_sentiment Negatividad, toxicidad, lenguaje ofensivo, amenazas e insultos en texto sentiment.is_toxic, sentiment.toxicity, sentiment.score, sentiment.hit
check_spam Clasificación de spam en texto spamfinder.label, spamfinder.confidence, spamfinder.is_spam, spamfinder.hit
check_language Si el texto coincide con el idioma esperado language.language, language.confidence, language.hit
check_badwords Coincidencias con la lista personalizada de palabras prohibidas badwords.hit, badwords.matched_words
check_images Imágenes explícitas en URLs de imágenes images.porn, images.sexual, images.neutral, images.hit
check_links Reputación de enlaces links.status, links.hit
check_antivirus Malware en URLs de documentos/archivos antivirus.status, antivirus.hit

Cada interruptor es un booleano. Los umbrales numéricos que convierten una puntuación en un hit se configuran por proyecto en el panel de control, no se pasan en cada solicitud; consulta la guía de configuración de umbrales.

Ventajas de la moderación con AI

Escala

La AI procesa volúmenes de contenido que los equipos humanos no pueden asumir. Una sola llamada a la API devuelve resultados en milisegundos, por lo que la moderación sigue el ritmo de los envíos en lugar de quedarse atrasada en una cola de revisión. Combina las comprobaciones automatizadas con una cola humana para los casos dudosos (que se tratan más adelante).

Velocidad

Las comprobaciones en tiempo real te permiten revisar el contenido antes de que se publique:

// Pre-moderation: Check content before publishing
async function publishPost(content) {
  const moderation = await checkContent(content);

  if (moderation.has_violations) {
    return { published: false, reason: moderation.message };
  }

  // Content passes moderation
  return await saveAndPublish(content);
}

Coherencia

La AI aplica las mismas reglas de forma uniforme a todo el contenido, sin cansancio y sin variaciones entre revisores. Las decisiones son reproducibles: la misma entrada con los mismos umbrales del proyecto produce los mismos indicadores hit, lo que permite auditar la aplicación de las normas.

Arquitectura de moderación

Flujo de premoderación

User Submits → AI Check → Decision
                 ↓
    ┌───────────┼───────────┐
    ↓           ↓           ↓
  Allow      Review       Block
    ↓           ↓           ↓
 Publish   Human Queue   Reject

Flujo de posmoderación

User Submits → Publish → AI Check → Action
                           ↓
              ┌────────────┼────────────┐
              ↓            ↓            ↓
            Safe       Borderline    Violation
              ↓            ↓            ↓
           Keep       Flag/Review    Remove

Enfoque híbrido (recomendado)

La respuesta de Discuse establece has_violations cuando cualquiera de las comprobaciones habilitadas supera su umbral configurado, y expone las puntuaciones subyacentes por categoría para que puedas añadir tu propia franja de confianza encima:

async function moderateContent(content) {
  const result = await checkContent(content);

  // Build a confidence figure from the scores you care about.
  // e.g. the toxicity score and the spam classifier confidence.
  const confidence = Math.max(
    result.results?.sentiment?.toxicity ?? 0,
    result.results?.spamfinder?.confidence ?? 0,
    result.results?.images?.porn ?? 0
  );

  // High confidence: automate.
  if (confidence > 0.95) {
    return result.has_violations
      ? { action: 'auto_remove', reason: result.message }
      : { action: 'auto_approve' };
  }

  // Medium confidence: route to a human.
  if (confidence > 0.5) {
    await addToReviewQueue(content, result);
    return { action: 'pending_review' };
  }

  // Low confidence: approve, keep watching.
  return { action: 'approve_with_monitoring' };
}

Implementar la moderación con AI

Paso 1: Define tu política

Decide qué contenido es aceptable y cómo actuar ante cada categoría antes de llamar a la API. En Discuse, el punto de corte numérico de cada categoría se configura en los ajustes de tu proyecto (el panel), por lo que la política de tu aplicación asigna un resultado de la API a una acción, en lugar de volver a decidir el umbral:

const MODERATION_POLICY = {
  // What to do when a given Discuse check reports a hit.
  // Thresholds themselves are configured per project in the dashboard.
  actions: {
    sentiment: 'block',   // toxic / threatening text
    spam: 'block',
    badwords: 'flag',
    images: 'block',      // explicit imagery
    links: 'flag'
  }
};

Paso 2: Integra la API

Envía el contenido y las comprobaciones que quieres habilitar para esta solicitud. Cada conmutador check_* es un booleano opcional que sobrescribe el valor predeterminado del proyecto para esta llamada:

async function checkContent(content) {
  const response = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({
      content: {
        text: content.text,
        image_urls: content.images
      },
      settings: {
        check_sentiment: true,
        check_spam: true,
        check_images: true
      }
    })
  });

  if (!response.ok) {
    throw new Error(`Discuse API returned ${response.status}`);
  }
  return response.json();
}

Paso 3: Aplica las decisiones

Asigna cada comprobación que indique un hit a la acción que definiste:

function applyModerationDecision(result) {
  const r = result.results || {};

  if (r.sentiment?.hit) return { action: MODERATION_POLICY.actions.sentiment, category: 'sentiment' };
  if (r.spamfinder?.hit) return { action: MODERATION_POLICY.actions.spam, category: 'spam' };
  if (r.images?.hit)    return { action: MODERATION_POLICY.actions.images, category: 'images' };
  if (r.badwords?.hit)  return { action: MODERATION_POLICY.actions.badwords, category: 'badwords' };
  if (r.links?.hit)     return { action: MODERATION_POLICY.actions.links, category: 'links' };

  return { action: 'allow' };
}

Paso 4: Gestiona los casos límite

async function handleModerationResult(content, result) {
  switch (result.action) {
    case 'block':
      await notifyUser(content.author, 'content_blocked', result);
      await logModeration(content, result);
      return false;

    case 'flag':
      await addToReviewQueue(content, result);
      await publishWithWarning(content);
      return true;

    case 'allow':
      await publish(content);
      return true;

    default:
      // Unknown action - fail safe by blocking
      await logError('unknown_moderation_action', result);
      return false;
  }
}

Buenas prácticas

Empieza de forma conservadora y ajusta con el tiempo

Comienza con umbrales de proyecto más estrictos y flexibilízalos a medida que midas los falsos positivos. En Discuse, estos umbrales son ajustes del proyecto, por lo que la configuración se realiza en el panel de control (o mediante la API de actualización de ajustes), no en cada solicitud. Consulta la guía de configuración de umbrales para ver el flujo de trabajo.

Mantén una cola de revisión humana

La AI debe complementar, no sustituir, el criterio humano en los casos límite:

async function processReviewQueue() {
  const items = await getReviewQueue();

  for (const item of items) {
    // Present to human reviewer with AI context
    const reviewUI = {
      content: item.content,
      ai_scores: item.moderation_result,
      similar_decisions: await getSimilarPreviousDecisions(item)
    };

    // Human makes final decision
    const decision = await presentToReviewer(reviewUI);

    // Log for model improvement
    await logHumanDecision(item, decision);
  }
}

Supervisa y mejora

Haz seguimiento de métricas clave para mejorar tu sistema de moderación:

const METRICS = {
  // Accuracy metrics
  false_positive_rate: 'Content incorrectly blocked',
  false_negative_rate: 'Harmful content missed',

  // Operational metrics
  average_response_time: 'API latency',
  review_queue_depth: 'Human review backlog',

  // User impact
  appeal_rate: 'Users appealing decisions',
  appeal_success_rate: 'Appeals overturned'
};

Gestiona las apelaciones con cuidado

Cuando un usuario apele, envía el elemento a un revisor humano en lugar de volver a decidirlo automáticamente. Proporciona al revisor las puntuaciones originales de Discuse y el historial del usuario como contexto:

async function handleAppeal(contentId, userId) {
  const original = await getContentWithModeration(contentId);

  await addToReviewQueue(contentId, {
    type: 'appeal',
    original_decision: original.moderation, // Discuse `results` saved at decision time
    author_history: await getAuthorHistory(userId)
  });

  return { status: 'pending', message: 'Under review' };
}

La API en sí no tiene ningún parámetro de "contexto" o "historial del autor" por solicitud: el contexto es algo que aplicas de tu lado al elegir umbrales y dirigir contenido a revisión.

Errores comunes

Depender demasiado de la AI

Automatizar cada decisión significa automatizar cada error. Mantén siempre a una persona involucrada para:

  • Decisiones contextuales complejas
  • Contenido de alto riesgo (legal, seguridad)
  • Apelaciones y casos límite

Ignorar el contexto

Las mismas palabras pueden ser dañinas o aceptables según el contexto:

"I'm going to kill it at this interview!" // Positive
"I'm going to kill you"                    // Threat

Discuse evalúa cada mensaje de forma aislada; no tiene un parámetro de "context" a nivel de solicitud. Aplica el contexto de tu lado: elige umbrales de proyecto más estrictos o más flexibles según la superficie (publicación pública frente a mensaje directo) y deriva los hits dudosos a revisión humana.

Configurarlo y olvidarse

La moderación de contenido requiere ajustes continuos:

  • Supervisa las tasas de falsos positivos y falsos negativos
  • Actualiza los umbrales según los datos
  • Revisa nuevos patrones de contenido
  • Vuelve a entrenar o actualiza los modelos

Aplicación incoherente

Aplica la política según reglas, no según quién haya publicado. Define los umbrales a partir de un nivel de confianza documentado, en lugar de excepciones improvisadas:

// Avoid: per-person exceptions
if (user.isInfluencer) { /* lenient */ }

// Prefer: thresholds keyed to a documented trust level,
// configured the same way for everyone in that level.
const action = MODERATION_POLICY.actions[category];

Próximos pasos

Escrito por Equipo de Discuse · Última actualización June 2026

Artículos relacionados

Configuración de umbrales de detección

Equilibra falsos positivos y negativos para tu caso de uso

Escalado de la moderación de contenido

Patrones de arquitectura para moderación de contenido de alto volumen