# Set up AI moderation

Build a flow that reads chat for harassment, hate speech, sexual content, scam/spam and your own rule — watch first, then let it act.

Updated 23 September 2026

## Before you start

You’ll need the **AI moderation filter** feature on your channel — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes). Without it the step still appears in the step list, but can’t be added, and everything else about your moderation setup keeps working unchanged.

> **This is a flow, not a filter card**
>
> AI moderation is something you build, not something you switch on. Your six deterministic filters — blacklist, links, caps, symbols, emotes, repetition — are exactly where they were on the [Moderation page](https://bloopbot.com/docs/moderation) and behave exactly as they always have. The AI is a separate step you put in a flow, which is what lets you delete a scam link quietly and time someone out for a slur, in the same flow, in your own words.

## Watch it for a stream first

1. Open **Flows → Explore packs** and install **AI chat moderation — watch only**, from the **AI helpers** pack.
2. It reads every non-moderator message and writes what it thought into the flow’s run log. It says nothing in chat, deletes nothing and times out nobody.
3. Leave it running for a stream or two, then open the flow and read its **Run log** — every message it saw, the verdict, and every probability behind it.

You can see the step, change what it looks for, and point it at any trigger you like.

> **Don’t have it repeat what it caught**
>
> It is tempting to add a chat step saying what was flagged. Don’t: your bot would be repeating a slur, someone’s address or a scam link word for word under its own name, to everyone, while the original message is still sitting there. The run log tells you the same thing and only you and your editors can read it.

## Let it act

When you trust it, install **AI chat moderation — delete and warn** and pause or delete the watch-only flow. It deletes a message that breaks the rules and says so; only the hate-speech branch reaches a timeout.

What it does about each finding sits in one group inside the flow, **Enforce chat rules**: open the group to change a branch, and every flow that uses it follows — [reuse a set of nodes as a group](https://bloopbot.com/docs/group-nodes) walks through it. Every branch is yours. Point **Scam/spam** at a delete with no reply, send **Harassment** to a warning instead, add a **Timeout** where you want one — they are ordinary steps. A change to the group applies to every flow that uses it.

> **Never wire a judgment straight to a ban**
>
> Both templates put a **Who can use this** check in front, so a moderator is never judged at all, and only one category reaches a timeout. If you wire every branch to the harshest thing you can, one AI judgment is all it takes — which is exactly what this bot is built to avoid.

## Categories and your own rule

Four categories you tick on the step, each getting its own output so you can treat them differently:

| Category | Catches |
| --- | --- |
| Harassment | Harassment or a personal attack aimed at a specific person. |
| Hate speech | A slur or hateful language aimed at race, ethnicity, gender, sexual orientation, religion, disability or a similar protected characteristic. |
| Sexual content | Sexual content, solicitation or sexually degrading language. |
| Scam/spam | A scam, spam or unsolicited self-promotion — a follow-for-follow pitch, a crypto/gambling link, repeated promotion of another channel. |

Plus **your own rule**, written in plain English — “no discussing other streamers by name” — which gets an output of its own once you write one. Untick a category and it is never asked about, which also costs you nothing.

Ordinary chat — hype, trash talk about the game rather than a person, swearing for emphasis, ALL CAPS excitement — is deliberately not a violation on its own, however crude, as long as nothing is aimed at a person as an attack.

## Sensitivity, and what it costs

One **Sensitivity** picker rather than a threshold per category: **Low — only the obvious**, **Medium — recommended** (the default, and the safe starting point) or **High — catches more, and more false alarms**.

**Ignore very short and emote-only messages** is on by default and means an emote wall costs you nothing — those never reach the judge at all. Neither does a message the step was never pointed at.

Chat stays exactly as fast as it was. The flow runs beside your bot’s replies rather than in front of them, so a command typed in a message that is about to be deleted may still get its answer a beat before the message disappears.

## The Unsure branch

The step leaves by **Unsure** when the judge can’t answer — your channel doesn’t include the feature, or the judge is unreachable — and also when it lands right on the fence.

Leaving **Unsure** unconnected is the right choice here: a judgment that isn’t sure hasn’t found anything, and doing nothing about it is correct. Both templates leave it unwired; the run log still records every one, so you can see how often it happens.

## Troubleshooting

- Step won’t add? Your channel doesn’t currently include the AI moderation feature — check [Your plan](https://bloopbot.com/docs/what-your-plan-includes).
- Nothing happens when you expect a detection? Check which branches you wired. An unconnected branch is silence by design — read the flow’s run log, which records the verdict on every message it saw whether or not anything was wired.
- A command answered on a message that then got deleted? Expected — the check runs beside your bot’s reply, not in front of it.
- Catching too much or too little? Move **Sensitivity** one step, or untick the category that keeps firing. The run log shows the probability behind each one, so you can see how close the calls were.
- Silent entirely? If the AI judge is unreachable, not switched on for your channel, or your channel loses the feature, every message leaves by **Unsure** — your six deterministic filters keep moderating exactly as before.
