ES ▾
Uncensored Chatbot APIAcceso directo a la API de un LLM sin censuraObtener clave de API

Uncensored Chatbot APISeguridad

Gestión responsable de un producto de chatbot para adultos: lista de verificación para desarrolladores

Un chatbot para adultos es un producto real, y los productos reales conllevan responsabilidades. La API te ofrece un modelo que no rechaza contenido adulto lícito, lo que significa que tu aplicación, no el modelo, es donde residen las verificaciones de edad, las normas internas, los informes y los controles de abuso. Esta lista de verificación recorre cada capa con código funcional, para que puedas lanzar con confianza.

Actualizado

Puntos clave

  • La plataforma es solo para adultos; verifica la edad en tu puerta y mantén la verificación en el servidor.
  • Escribe tu propia política de contenido y una ruta de informes, porque la apertura del modelo no reemplaza tus normas.
  • El contenido sexual que involucra a menores siempre se bloquea con un 403; diseña una interfaz de usuario clara y tranquila para ello.
  • Limita el uso por usuario y mantén la clave de API en tu servidor; una clave es compartida por todo tu tráfico.

Quién es responsable de qué

Piensa en la pila en dos capas. La API sirve contenido adulto lícito, ficción y temas controvertidos sin rechazar, para usuarios mayores de 18 años. Todo lo que rodea al modelo, las personas que pueden acceder a él, las reglas a las que se comprometen y lo que sucede cuando algo sale mal, es tuyo. Esa división es liberadora, pero solo si te tomas tu parte en serio.

Aquí tienes una tabla breve de responsabilidades para mantener a la vista.

PreocupaciónPlataformaTu aplicación
Contenido sexual que involucra a menoresSiempre bloqueado (403)Explícalo, finaliza la escena, evita soluciones alternativas
Edad de tus usuariosSolo adultos por términosControla y verifica en tu entrada
Normas internas más allá de la leyNo aplicadasEscribe, publica y hazlas cumplir
Abuso por usuario300 peticiones por minuto por claveLímites por usuario y por día
Clave secretaLa emiteManténla en tu servidor

Esta es una guía de ingeniería, no asesoramiento legal; las normas varían según el lugar, así que verifica los requisitos donde viven tus usuarios.

Control de edad que realmente controle

Un banner con un botón de «Tengo 18 años» es el mínimo, y un menor decidido puede hacer clic en él. Aún importa, porque registra una afirmación afirmativa y mantiene tu política honesta. La clave está en dónde la aplicas. Si la verificación solo oculta el chat en el navegador, cualquiera puede llamar a tu endpoint directamente. Haz que el servidor se niegue a hablar hasta que exista un marcador firmado.

import crypto from "node:crypto";

// Minimal 18+ gate: the user must confirm before the chat routes work.
// Replace the confirmation with a real verification step when your market requires it.
const SECRET = process.env.GATE_SECRET;   // random string kept on the server

function sign(value) {
  return crypto.createHmac("sha256", SECRET).update(value).digest("hex");
}

export function issueAdultCookie(res, userId) {
  const stamp = String(Date.now());
  const payload = `${userId}.${stamp}`;
  res.cookie("adult_ok", `${payload}.${sign(payload)}`, {
    httpOnly: true, sameSite: "strict", secure: true, maxAge: 30 * 24 * 3600 * 1000,
  });
}

export function requireAdult(req, res, next) {
  const raw = req.cookies?.adult_ok || "";
  const [userId, stamp, sig] = raw.split(".");
  if (!sig || sign(`${userId}.${stamp}`) !== sig) {
    return res.status(403).json({ state: "age_required" });
  }
  req.userId = userId;
  next();
}

Incluye requireAdult delante de cada ruta de chat. Añade una verificación más estricta cuando tu mercado o nivel de riesgo lo requiera, como una verificación de edad de terceros, y mantén el marcador lo suficientemente breve como para poder volver a generar el prompt. No dirijas tu marketing a estudiantes o escuelas, y coloca el filtro antes de mostrar cualquier contenido para adultos, incluidas las vistas previas y las conversaciones de ejemplo.

Escribir tu propia política de contenido

El modelo no rechaza material adulto lícito, así que tú decides qué permite tu producto. Una política de una página es suficiente. Cubre qué es bienvenido, qué está fuera de límites en tu comunidad aunque sea lícito (por ejemplo, acoso a personas reales o doxxing), cómo pueden los usuarios informar de problemas y qué acciones tomas: advertencias, silencios temporales, prohibiciones.

  1. Públicalo donde los usuarios se registran, en lenguaje claro.
  2. Refleja la política en tu prompt del sistema. Una línea como "Todos los personajes son adultos; finaliza cualquier escena que se vuelva no consensuada o involucre personas reales con nombre" mantiene al bot alineado con tus normas.
  3. Haz que la aplicación de la norma sea aburrida. Decide los umbrales de antemano para que los moderadores no improvisen.
  4. Revisa la política cada trimestre a medida que tu producto evoluciona.

Una ruta de informes que los usuarios puedan encontrar

Proporciona a cada mensaje un pequeño control de informe, y haz que funcione sin un desvío de inicio de sesión. Cuando alguien informe de una respuesta, captura el mínimo que necesitas para actuar: el id de usuario, el id del mensaje, una razón breve y una marca de tiempo. Enrútalo a una cola que vigilen tus moderadores.

app.post("/api/report", requireAdult, express.json(), (req, res) => {
  const { messageId, reason } = req.body;
  // Store only what you need to act on: who, which message, why, when.
  queueForModerator({ userId: req.userId, messageId, reason: String(reason).slice(0, 500), at: Date.now() });
  res.json({ ok: true });
});

Mantén tus promesas estrechas. Dile a los usuarios exactamente qué desencadena un informe, y almacena solo lo que tu propia política y las normas aplicables requieran. Revisa cuánto tiempo conservas los informes y elimínalos según un calendario. Reconoce cada informe a la persona que lo presentó, incluso con un agradecimiento de una línea, porque los usuarios dejan de informar cuando parece que no pasa nada. Rastrea qué tan rápido cierran tus moderadores los elementos, y establece un objetivo que puedas cumplir realmente.

Diseño para el bloqueo 403 de menores

El contenido sexual que involucra a menores siempre se bloquea, también en ficción y roleplay, y la API responde con un 403 y el código content_blocked. No reintentes y no intentes reformular en nombre del usuario. En su lugar, trátalo como un momento del producto que merece un diseño claro.

  • Tradúcelo en el servidor a un estado que tu UI conozca, para que el texto crudo del origen nunca llegue a la pantalla.
  • Di lo que sucedió en una oración tranquila y nombra la regla.
  • Finaliza o reinicia la escena. Ofrecer «continuar de todos modos» anula el propósito.
  • Registra el evento con el id de usuario para que los intentos repetidos puedan activar tu propia aplicación de la norma.
  • No adivines la intención. Algunos bloqueos provienen de un texto ambiguo; el mensaje neutral funciona para ambos casos.
// server: translate upstream outcomes into states your UI understands
if (upstream.status === 403) {
  return res.status(403).json({
    state: "content_blocked",
    message: "That request breaks our rules, so we can't continue this scene.",
  });
}
if (upstream.status === 402) return res.status(503).json({ state: "paused" });
if (upstream.status === 503) return res.status(503).json({ state: "busy" });
// browser: show a calm, specific message for each state
const MESSAGES = {
  content_blocked: "This scene can't continue. Sexual content involving minors is never allowed. Start a new chat any time.",
  age_required: "Please confirm you are 18 or older to use the chat.",
  slow_down: "You're sending messages quickly. Give it a few seconds.",
  daily_limit: "You've reached today's message allowance. Come back tomorrow.",
  paused: "Chat is briefly unavailable. We're on it.",
  busy: "The service is busy. Try again in a moment.",
};

async function send(messages) {
  const res = await fetch("/api/chat", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ messages }),
  });
  if (!res.ok) {
    const info = await res.json().catch(() => ({}));
    showBanner(MESSAGES[info.state] || "Something went wrong.");
    if (info.state === "content_blocked") endCurrentScene();
    return null;
  }
  return res;
}

Controles de abuso y límites por usuario

Tu única clave de API permite 300 peticiones por minuto en total, compartidas por todos los usuarios. Una cuenta automatizada puede agotar los recursos de todos los demás, así que aplica límites de uso justo tú mismo, muy por debajo de ese techo. El ejemplo limita a cada usuario a 12 mensajes por minuto y les da un presupuesto diario de tokens medido a partir de la figura usage en el último fragmento de streaming.

const WINDOW_MS = 60_000;
const PER_USER_PER_MIN = 12;       // your product rule, far below the key's 300
const DAILY_TOKEN_BUDGET = 60_000; // per user, tracked from the usage chunk

const hits = new Map();            // userId -> array of timestamps
const spent = new Map();           // userId -> tokens used today

export function userLimit(req, res, next) {
  const now = Date.now();
  const recent = (hits.get(req.userId) || []).filter((t) => now - t < WINDOW_MS);
  if (recent.length >= PER_USER_PER_MIN) {
    return res.status(429).json({ state: "slow_down" });
  }
  if ((spent.get(req.userId) || 0) >= DAILY_TOKEN_BUDGET) {
    return res.status(429).json({ state: "daily_limit" });
  }
  recent.push(now);
  hits.set(req.userId, recent);
  next();
}

export function recordUsage(userId, totalTokens) {
  spent.set(userId, (spent.get(userId) || 0) + totalTokens);
}

Para producción, almacena los contadores en un almacén compartido en lugar de en la memoria del proceso, para que los límites sobrevivan a los reinicios y funcionen en varios servidores. Añade un max_tokens moderado a cada petición para acotar el peor caso, y vigila los 402 en tu propio saldo. Una prueba gratuita con $0,50 durante 7 días es una buena forma de probar estos controles antes de que llegue el tráfico real.

Mantén la clave en el servidor

No envíes la clave en bundles de front-end, aplicaciones móviles ni repositorios públicos. Almacénala como variable de entorno o en un gestor de secretos, cárgala solo en tu backend y exclúyela de los registros y reportes de errores. Si sospechas que fue expuesta, regénerala desde tu cuenta; la clave anterior deja de funcionar de inmediato, así que ten un despliegue listo. Recuerda que hay una clave por cuenta, lo que hace que una capa de proxy limpia sea aún más valiosa. El tutorial del chat web muestra el patrón de extremo a extremo, y la documentación lista los códigos de error que tu wrapper debe mapear.

Lista de verificación previa al lanzamiento

Revisa esta lista el día antes de abrir las puertas. Cada elemento toma minutos y previene una clase de problemas que es dolorosa de corregir una vez que los usuarios llegan.

  1. Intenta romper el control. Llama a tu ruta de chat con curl y sin cookie. Debe responder 403 con age_required, nunca una respuesta del modelo.
  2. Activa cada estado. Simula el upstream para devolver 402, 403, 429 y 503 por turno, y confirma que cada uno muestra el banner correcto y nunca filtra texto de error crudo.
  3. Lee tu propia política en voz alta. Si un moderador no puede decidir un caso a partir de ella en un minuto, ajusta la redacción.
  4. Prueba el botón de informe desde una pantalla de teléfono. Un control que es difícil de alcanzar no cuenta como un canal de informes.
  5. Busca la clave en tu repositorio. Revisa carpetas de front-end, salida de compilación, configuraciones de ejemplo e historial de commits. Regenera la clave si la encuentras en algún lugar público.
  6. Configura alertas. Notifícate ante un 402, ante un pico de bloqueos 403 de un solo usuario y ante un salto en el uso diario de tokens.
  7. Prepara el interruptor de pausa. Una sola bandera que apague el chat de forma elegante es invaluable durante un incidente.

La seguridad nunca termina, y tampoco la lista; añade elementos cada vez que un incidente te enseñe algo nuevo, y compártelos con quien se una a tu equipo. Revisa la lista cuando añadas funciones como subida de imágenes en tu propia UI, salas grupales o intercambio público de personajes, porque cada una abre nuevas vías de abuso. Para ayuda con el diseño de los personajes en sí, lee la guía de diseño de personas, y mantén a mano los conceptos básicos de las notas de integración en la documentación a medida que crece tu equipo.

Preguntas y respuestas

¿Es suficiente una casilla de verificación para la verificación de edad?

Es un mínimo y registra una declaración, pero es fácil de eludir. Aplícala en el servidor y añade una verificación más robusta donde tu riesgo o las normas locales lo requieran.

¿Qué debe hacer mi app ante un 403 content_blocked?

No reintentes. Tradúcelo a un mensaje tranquilo en la aplicación, finaliza o reinicia la escena y registra el evento para tu propia aplicación de la norma.

¿Puedo permitir que los usuarios compartan la capacidad de mi clave de API de forma justa?

Sí, añadiendo límites de tasa y de tokens diarios por usuario en tu servidor. La clave en sí está limitada a 300 peticiones por minuto en total.

¿Aplica el modelo mis reglas propias?

No. No rechaza contenido adulto lícito, así que tu política, el system prompt y el flujo de moderación deben hacer ese trabajo.

Tu clave está a un formulario de distancia

Crea una cuenta, copia la clave, cambia la base URL. Eso es toda la configuración.

Obtener clave de APILeer la documentación