Caso de uso
Un filtro de chat con IA para servidores de Minecraft
Los filtros de chat con listas de palabras bloquean palabras inocentes y dejan pasar insultos sin palabrotas. VigiMod lee el sentido de cada mensaje, en 26 idiomas, y revisa las reglas de tu servidor, como «Nada de publicidad de otros servidores».
Qué lo hace difícil
Las listas de palabras fallan por los dos lados
Bloquean palabras inocentes que contienen una grosería y dejan pasar «aquí nadie te quiere». Un modelo puntúa el sentido, no palabras sueltas.
Jugadores de todas las edades
Muchos jugadores son jóvenes. La categoría opcional child_safety (beta) marca intentos de captar a un menor, como aviso para el staff.
Anuncios de servidores y ventas
Anunciar otros servidores o vender cuentas es una regla, no una palabrota. Escríbela como regla y VigiMod la puntúa.
Cómo funciona con VigiMod
- 1
Un plugin escucha el chat (AsyncChatEvent en Paper), que se ejecuta fuera del hilo principal.
- 2
Envía a VigiMod el mensaje, el UUID del jugador y tus reglas, con un timeout corto.
- 3
Si está marcado, cancela el mensaje y avisa al jugador; varias marcas pueden activar tu comando de mute o warn.
Reglas para copiar
Envíalas en el campo rules: cada una vuelve con su propia puntuación, como una categoría integrada.
{
"rules": {
"no-server-ads": "Nada de publicidad de otros servidores de Minecraft o de Discord",
"no-selling": "Nada de vender cuentas, objetos o rangos por dinero real",
"no-personal-info": "No preguntar a los jugadores su edad, dirección o teléfono",
"spanish-only": "En el chat global solo español"
}
}Ejemplo
Un listener para un plugin de Paper en Java: el evento del chat es asíncrono, así que la llamada HTTP no ralentiza el tick del servidor.
Java (Paper plugin)
// A listener for a Paper plugin: register it in onEnable() with
// getServer().getPluginManager().registerEvents(new ChatFilter(), this);
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.papermc.paper.event.player.AsyncChatEvent;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public final class ChatFilter implements Listener {
private final HttpClient http = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(2)).build();
private final String key = System.getenv("VIGIMOD_KEY");
// AsyncChatEvent runs off the main thread: waiting for the answer does not slow the server
@EventHandler(ignoreCancelled = true)
public void onChat(AsyncChatEvent event) {
JsonObject rules = new JsonObject();
rules.addProperty("no-server-ads", "No advertising other Minecraft servers or Discord servers");
JsonObject body = new JsonObject();
body.addProperty("text", PlainTextComponentSerializer.plainText().serialize(event.message()));
body.addProperty("user_id", event.getPlayer().getUniqueId().toString());
body.addProperty("scope", "my-server");
body.add("rules", rules);
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.vigimod.com/moderate"))
.timeout(Duration.ofSeconds(2))
.header("X-API-Key", key)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body.toString()))
.build();
try {
HttpResponse<String> response = http.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) return;
JsonObject result = JsonParser.parseString(response.body()).getAsJsonObject();
if (result.get("flagged").getAsBoolean()) {
event.setCancelled(true);
event.getPlayer().sendMessage(Component.text("Your message was not sent: it breaks the server rules."));
}
} catch (Exception e) {
// slow or down: let the message through
}
}
}Consejos
- Usa un timeout corto (unos dos segundos) y deja pasar el mensaje si la revisión falla, para que el chat nunca se congele.
- Añade child_safety a las categorías en servidores con jugadores jóvenes y envía sus marcas al staff en lugar de actuar solo.
- Envía el UUID del jugador como user_id: el mismo mensaje repetido una y otra vez sube la puntuación de spam.
Preguntas
- ¿Funciona en Spigot, Paper y Velocity?
- El ejemplo usa AsyncChatEvent de Paper. Spigot tiene AsyncPlayerChatEvent y los proxies como Velocity tienen sus propios eventos de chat; la llamada HTTP a VigiMod es la misma en todos.
- ¿Provoca lag en el servidor?
- No, si lo llamas desde el evento asíncrono del chat como en el ejemplo: el hilo principal nunca se bloquea.
- ¿Detecta trucos de escritura como el l33t speak?
- A menudo sí, porque el modelo lee frases enteras, pero no siempre. Para los peores casos añade tus palabras bloqueadas con el plugin que ya usas.
- ¿Cuántos mensajes puede revisar?
- La beta gratuita permite 120 mensajes por minuto por clave API. Las redes más grandes pueden pedir a soporte un límite mayor.
Sigue aprendiendo
Todas las guías- Básico · 6 min de lecturaQué es un clasificador de texto y cómo decideUn clasificador de texto lee una frase y devuelve una probabilidad para cada categoría. Cómo se construye, qué significa la puntuación y dónde se equivoca.
- Intermedio · 6 min de lecturaCómo elegir el umbral de moderaciónUna puntuación de 0,7 no es una decisión. Cómo funcionan los umbrales, por qué el valor por defecto es solo un punto de partida y cómo ajustarlos.
- Intermedio · 6 min de lecturaEl sesgo en los modelos de moderación: por qué se marcan mensajes inocentes con nombres extranjerosLos modelos de moderación pueden marcar «Mohammed ha perdido el tren» como odio. De dónde viene este sesgo, cómo medirlo y cómo eliminarlo.
Pruébalo en tu comunidad
Crea una clave API gratuita en dos minutos. Sin tarjeta y sin periodo de prueba.