Anwendungsfall
Ein KI-Chatfilter für Minecraft-Server
Chatfilter mit Wortlisten auf Minecraft-Servern blockieren harmlose Wörter und lassen Beleidigungen ohne Schimpfwörter durch. VigiMod liest die Bedeutung jeder Nachricht, in 26 Sprachen, und prüft die Regeln deines Servers, etwa „Keine Werbung für andere Server“.
Was es schwierig macht
Wortlisten irren in beide Richtungen
Sie blockieren harmlose Wörter, die ein Schimpfwort enthalten, und lassen „hier will dich keiner“ durch. Ein Modell bewertet die Bedeutung, nicht einzelne Wörter.
Spieler jeden Alters
Viele Spieler sind jung. Die optionale Kategorie child_safety (Beta) markiert Versuche, an Minderjährige heranzutreten, als Hinweis für das Team.
Serverwerbung und Verkäufe
Werbung für andere Server oder der Verkauf von Accounts ist eine Regel, kein Schimpfwort. Schreib sie als Regel, und VigiMod bewertet sie.
So funktioniert es mit VigiMod
- 1
Ein Plugin hört auf den Chat (AsyncChatEvent auf Paper), der außerhalb des Hauptthreads läuft.
- 2
Es sendet VigiMod die Nachricht, die UUID des Spielers und deine Regeln, mit kurzem Timeout.
- 3
Bei einer Markierung bricht es die Nachricht ab und informiert den Spieler; mehrere Markierungen können deinen Mute- oder Warn-Befehl auslösen.
Regeln zum Kopieren
Sende sie im Feld rules: Jede kommt mit einer eigenen Bewertung zurück, wie eine eingebaute Kategorie.
{
"rules": {
"no-server-ads": "Keine Werbung für andere Minecraft- oder Discord-Server",
"no-selling": "Kein Verkauf von Accounts, Items oder Rängen für echtes Geld",
"no-personal-info": "Spieler nicht nach Alter, Adresse oder Telefonnummer fragen",
"german-only": "Im globalen Chat nur Deutsch"
}
}Beispiel
Ein Listener für ein Paper-Plugin in Java: Das Chat-Event ist asynchron, daher bremst der HTTP-Aufruf den Server-Tick nicht.
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
}
}
}Tipps
- Nutze einen kurzen Timeout (etwa zwei Sekunden) und lass die Nachricht durch, wenn die Prüfung fehlschlägt, damit der Chat nie hängt.
- Füge auf Servern mit jungen Spielern child_safety zu den Kategorien hinzu und leite diese Markierungen an das Team weiter, statt allein zu handeln.
- Sende die UUID des Spielers als user_id: Dieselbe Nachricht immer wieder erhöht den Spam-Wert.
Fragen
- Funktioniert es mit Spigot, Paper und Velocity?
- Das Beispiel nutzt AsyncChatEvent von Paper. Spigot hat AsyncPlayerChatEvent, und Proxys wie Velocity haben eigene Chat-Events; der HTTP-Aufruf an VigiMod ist überall gleich.
- Verursacht es Lag auf dem Server?
- Nein, wenn du es wie im Beispiel aus dem asynchronen Chat-Event aufrufst: Der Hauptthread wird nie blockiert.
- Erkennt es Schreibtricks wie l33t speak?
- Oft, weil das Modell ganze Sätze liest, aber nicht immer. Für die schlimmsten Fälle ergänze deine gesperrten Wörter mit dem Plugin, das du schon nutzt.
- Wie viele Nachrichten kann es prüfen?
- Die kostenlose Beta erlaubt 120 Nachrichten pro Minute und API-Schlüssel. Größere Netzwerke können beim Support ein höheres Limit anfragen.
Weiterlernen
Alle Leitfäden- Grundlagen · 6 Min. LesezeitWas ist ein Textklassifikator und wie entscheidet er?Ein Textklassifikator liest einen Satz und gibt für jede Kategorie eine Wahrscheinlichkeit zurück. Wie er gebaut ist, was der Wert bedeutet und wo er sich irrt.
- Fortgeschritten · 6 Min. LesezeitWie man die Moderationsschwelle wähltEin Wert von 0,7 ist keine Entscheidung. Wie Schwellen funktionieren, warum der Standardwert nur ein Anfang ist und eine einfache Methode, sie einzustellen.
- Fortgeschritten · 6 Min. LesezeitBias in Moderationsmodellen: warum harmlose Nachrichten mit ausländischen Namen markiert werdenModerationsmodelle markieren mitunter „Mohammed hat den Zug verpasst“ als Hass. Woher der Bias kommt, wie man ihn misst und wie man ihn beseitigt.
Teste es in deiner Community
Erstelle in zwei Minuten einen kostenlosen API-Schlüssel. Keine Karte, keine Testphase.