Prism Roleplay 1 Small
A frontier character-roleplay model, distilled from GLM 5.2 and Nemotron-3-Nano into Qwen3-8B
Overview
Prism Roleplay 1 Small is a character-roleplay and immersive-dialogue model, fine-tuned via LoRA on Qwen3-8B using a distilled dataset generated by a mixed teacher pool: GLM 5.2 and NVIDIA Nemotron-3-Nano. It's built to fully embody a described character — staying in voice, in scene, and in character — across persona embodiment, multi-character scenes, emotional nuance, dialogue-heavy exchanges, and prose-heavy narration, without ever slipping into a generic "AI assistant" register.
Part of the Prism family of creative and roleplay models.
Training
- Base model:
mlx-community/Qwen3-8B-4bit - Teacher models: GLM 5.2 and NVIDIA Nemotron-3-Nano (via NVIDIA NIM), mixed for stylistic diversity — 2,332 examples from GLM 5.2, 1,168 from Nemotron-3-Nano
- Dataset: 3,500 examples across 10 categories — character cards, scene continuations, multi-character scenes, dialogue-heavy exchanges, prose-heavy narration, emotional conflict, user-action reactions, in-character worldbuilding, group banter, and format shifts
- Method: LoRA fine-tuning (rank 8, 16 layers), 9,000 iterations
- Best validation loss: 1.377 (down from 3.453 at the start of training)
Evaluation — the roleplay quality gain
A held-out base-vs-tuned comparison (20 fresh scenarios, one per category, generated through both the untouched base model and the base+LoRA adapter) shows a dramatic, measurable improvement:
| Metric | Base Qwen3-8B | Prism Roleplay 1 Small |
|---|---|---|
| Leaked planning/reasoning text | 20/20 (100%) | 0/20 (0%) |
| Avg 4-gram repetition ratio | 0.0172 | 0.0062 |
| High-repetition outputs (>0.15) | 1/20 | 0/20 |
The base model's biggest failure mode was breaking character entirely: Qwen3's native reasoning trace (<think>...</think>) leaked its full internal planning into every single response — "Okay, the user wants a character card for... Let me break down the requirements" — before the actual roleplay content even began. Prism Roleplay's LoRA training taught the model to suppress that leak completely (an empty, correctly-closed <think></think> block followed immediately by clean in-character content) in 100% of held-out samples, while also cutting repetition roughly 3x. This is the core behavior the distillation set out to fix, and it transferred cleanly.
Example (character card, isekai/portal fantasy, melancholic tone — "a mysterious stranger who won't reveal their real name"):
Base: "Okay, the user wants a character card for an isekai/portal fantasy roleplay with a melancholic tone. The character is a mysterious stranger who won't reveal their real name. Let me break down the requirements. First, the character card needs a name, physical description..." — the whole response is the model narrating its plan to itself.
Prism Roleplay: "Name: No Name Given. Physical Description: A tall, gaunt figure wrapped in a threadbare charcoal coat that seems to absorb candlelight. Their face is obscured by a hood, but the sharp, pale eyes beneath it betray a weary intelligence..." — straight into a complete, well-formed character card.
Formats available
This repo includes both:
| Format | File | Notes |
|---|---|---|
| MLX (4-bit) | model.safetensors + config | For Apple Silicon via mlx-lm |
| GGUF (Q4_K_M) | prism_roleplay_1_small_Q4_K_M.gguf | For llama.cpp and compatible runtimes (LM Studio, Ollama, etc.) |
Usage — MLX
from mlx_lm import load, generate
model, tokenizer = load("VertexAGI/prism-roleplay-1-small")
prompt = "You are a stoic mercenary with a hidden soft side, sitting in a candlelit tavern on a stormy night. The user just sat down across from you."
messages = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
response = generate(model, tokenizer, prompt=text, max_tokens=400)
print(response)
Usage — GGUF (llama.cpp)
Qwen3's chat template only suppresses its reasoning trace when the runtime explicitly signals non-thinking mode. mlx-lm does this automatically; with llama.cpp you need -rea off (or --reasoning off), otherwise the model will emit a visible <think>...</think> reasoning block before its in-character response, even though the underlying trained behavior is identical:
llama-cli -hf VertexAGI/prism-roleplay-1-small -m prism_roleplay_1_small_Q4_K_M.gguf -st -rea off -sys "You are a master roleplay writer generating training examples for a character-roleplay AI. Given a scenario, fully embody the described character and write an immersive, in-character response. Stay completely in character. Never write as an AI assistant. Never break the fourth wall or add out-of-character notes." -p "You are a stoic mercenary with a hidden soft side, sitting in a candlelit tavern on a stormy night. The user just sat down across from you."
System prompt
For best results, use the system prompt the model was trained with:
You are a master roleplay writer generating training examples for a character-roleplay AI. Given a scenario, fully embody the described character and write an immersive, in-character response. Stay completely in character. Never write as an AI assistant. Never break the fourth wall or add out-of-character notes.
Limitations
This is an 8B-parameter model fine-tuned via LoRA on a moderately sized (3,500-example) dataset — it's capable but not infallible. Like any distilled model it inherits some of its teachers' stylistic tendencies, and very long multi-turn roleplay sessions may drift more than a full fine-tune would. Treat outputs as a strong starting point, not a guaranteed-perfect final one.
License
Apache 2.0, inherited from the Qwen3 base model.