Jailbreaks use role play, hypotheticals, encoding tricks, translation, and long-context distraction to get past alignment. Because they exploit the model's flexibility, the fix is layered:
1. Input classifier — cheap model or rules flag policy-violating intent before the main call. 2. Constrained interface — structured output and a fixed tool set shrink the attack surface. 3. Output classifier — screen the response before it reaches the user or a tool. 4. Rate limits and abuse signals per user, since jailbreaking is iterative.
ts
const verdict = await classify(input, ["allowed", "self_harm", "malware", "pii_request"]);
if (verdict !== "allowed") {
await abuse.record(userId, verdict);
return SAFE_REFUSAL[verdict];
}Log every block with the input hash (not the raw text) so you can measure attack volume without building a corpus of harmful content. Keep refusals short and non-instructive — a refusal that explains exactly which filter fired is a tutorial for the attacker.
Exercise: assemble 20 red-team prompts, measure the block rate with and without the input classifier, and check the false-positive rate on 100 benign prompts.