blog · Aug 24, 2026 · 3 min

Why roleplay needs its own model tuning

Persona drift, repetition loops, over-trained filler — what breaks when you point a general assistant at roleplay, and the sampling and prompt discipline that fixes it.


Point a general-purpose assistant at a roleplay scene and it fails in ways a benchmark never shows. It stays polite when the character is furious. It summarizes instead of inhabiting. Forty messages in, it starts every reply with the same three words. And at the first sign of intensity it steps out of the scene to remind everyone it is an AI.

None of this is a capability problem. It is a tuning problem. RP+ exists because we ran character products long enough to catalogue the failure modes and fix them one by one. Here is the catalogue.

Failure 1: repetition loops

Small and mid-size models drift into loops: a pet phrase appears, gets reinforced by its own presence in the context, and by message 30 the character has said "with a smirk" eleven times.

The fix is not more parameters, it is sampling discipline. A mild frequency penalty pushes down tokens the transcript already contains; a presence penalty discourages re-opening the same themes. The exact values matter and differ by model family — too high and prose goes weird, too low and the loop wins. We ship per-family penalty profiles that we re-measure whenever a model version moves. That is invisible in an API that charges per token; in ours it is just what eroq-rp-plus does.

Failure 2: over-trained filler

Even strong models lean on trained-in filler at high temperature — the "oh honey…" problem. Roleplay runs hot (temperature 0.8+ is normal, flatness is death), so filler pressure is constant.

Counter-intuitively, the answer is a milder penalty on strong models rather than none: enough to tax the filler, not enough to distort voice. Then temperature stays high where roleplay needs it.

Failure 3: persona drift

A character sheet in the system prompt decays as the conversation grows: the transcript outweighs the sheet, and the model starts averaging toward generic-assistant behavior.

Three things hold a persona:

  1. The system prompt owns conduct, not content. "Stay in character, never add meta commentary, actions in asterisks" — conduct survives context growth much better than paragraphs of backstory.
  2. History windows beat full history. Past a threshold, older turns add drift faster than they add memory. Send a window, keep long-term facts in your own store, and re-inject what matters.
  3. No fourth-wall leaks. A model that has ever seen an "as an AI…" turn in its context will produce more of them. Filter them out of the history you send.

The eroq API is stateless by design — you send the history you want seen. That is not laziness; it is the only architecture that lets you control drift.

Failure 4: the refusal wall

Character products for adults hit a wall general APIs will not name: at the first mature turn the model breaks scene and lectures. Users do not experience this as safety; they experience it as the character dying mid-story.

Our engines are selected so that fiction between adults renders — with the hard limits enforced at the policy layer (no minors, no real-person impersonation, no illegal content — the AUP is short and absolute). Deciding where the wall stands is a product decision; pretending it is a model limitation is not.

What this means for your integration

  • Send a conduct-focused system prompt; keep lore in your own store and inject selectively.
  • Trust the default temperature (0.8) before tuning; it is set where roleplay lives.
  • Window your history around 20–40 turns and summarize beyond it.
  • Let eroq-rp-mini carry volume and switch to eroq-rp-plus for scenes where texture matters — same API shape, 1 vs 3 credits.

The uncomfortable summary: roleplay is not a smaller version of assistance. It is a different target, and a model tuned for one will miss the other. We tuned for this one.

Build with the models behind this post — get an API key (50 free credits).