RP Chat
Ratings reflect this model as run on Arli AI.
Gemma-4-31B-LuneLight is a text generation model available on Arli AI. It offers 31B parameters, 262K token context, reasoning support, vision input. Recommended use: RP Chat. Run it through the OpenAI-compatible chat completions API with unlimited requests and zero-log privacy.
View on Hugging FaceBack to ModelsInput (24H)
0
Output (24H)
0
Input (7D)
0
Output (7D)
0
Typical Total Time
30.47s
Typical TTFT
7.48s
Typical Input TPS
1661.81
Typical Output TPS
14.72
Context Size
262144
Quantization
r128 on FP8
Engine
vllm
Creation Method
Finetune
Model Class
Gemma-4-31B - LoRA
Chat Template
Gemma4
Reasoning
Yes
Vision
Yes
Parameters
31B
Added At
10/31/2026
Gemma-4-31B-LuneLight is available through an OpenAI-compatible chat completions endpoint. Point any OpenAI SDK at https://api.arliai.com/v1, pass Gemma-4-31B-LuneLight as the model, and requests are served without logging.
cURL
curl https://api.arliai.com/v1/chat/completions \
-H "Authorization: Bearer $ARLIAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Gemma-4-31B-LuneLight",
"messages": [{"role": "user", "content": "Hello!"}]
}'Python
from openai import OpenAI
client = OpenAI(
base_url="https://api.arliai.com/v1",
api_key="YOUR_ARLIAI_API_KEY",
)
response = client.chat.completions.create(
model="Gemma-4-31B-LuneLight",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)See the text generation docs for every parameter, or read the quick start guide to make your first request.
license: apache-2.0 base_model:
Wasn't really planning on doing another Gemma model, but was getting really sick of GLM and Mimo so decided to mess around with some smaller models again for a change of pace. This is a finetune on top of Scotoma 2, a finetune by Aes Sedai that got rid of a couple annoying writing tics Gemma 4 31B has.
It's pretty different in terms of approach from my other models. I use nothing but GRPO and DPO for this model, with no SFT at all. I'm pretty burnt on dataset wrangling and it was a fun experiment to try and come up with reward functions to guide Gemma towards writing better itself.
Just going by my personal evaluation suite, I think this model hit those goals. The intelligence hasn't taken a hit from Scotoma 2 which it was based on and I definitely prefer the writing.
Supports both thinking and non thinking, I personally prefer to use it with thinking enabled.
| Stock Gemma 4 | Mero Mero v2 | Scotoma 2 | LuneLight | |
|---|---|---|---|---|
| AI slop & writing tics (per 1k words, lower is better) ↓ | ||||
| Gemma 4 tics (total) | 40.8 | 31.1 | 34.7 | 22.2 |
| ↳ Cliché phrases ("breath hitches", "scent of") | 22.9 | 16.0 | 19.7 | 11.3 |
| ↳ Overused words ("shimmering", "echoing") | 17.9 | 15.1 | 15.0 | 10.9 |
| "Not X, but Y" phrasing | 3.3 | 2.1 | 0.6 | 0.5 |
| Adjective stacks ("thick, suffocating cloud") | 7.0 | 4.7 | 0.3 | 0.3 |
| Repeated sentence starters ("She… She… She…") | 12.8 | 15.1 | 12.4 | 7.8 |
| General AI slop (EQ-Bench) | 22.5 | 20.6 | 21.7 | 15.8 |
| Roleplay consistency (error rate, lower is better) ↓ | ||||
| Coherence & spatial errors (multi-turn) | 12.1% | 16.5% | 16.0% | 16.7% |
| ↳ Thinking off | 13.3% ± 1.5 | 15.2% ± 1.6 | 16.4% ± 1.7 | 17.3% ± 1.7 |
| ↳ Thinking on | 11.1% ± 1.3 | 17.6% ± 1.6 | 15.7% ± 1.5 | 16.2% ± 1.5 |
| User impersonation (impersonation-bait set) | 3.1% | 4.2% | 2.5% | 2.9% |
| Length (average Gemma 4 tokens) | ||||
| Thinking block (thinking on) | 448 | 485 | 398 | 410 |
| Reply, thinking on | 350 | 335 | 304 | 309 |
| Reply, thinking off | 304 | 314 | 272 | 275 |
| General capabilities (thinking off) ↑ | ||||
| IFEval | 89.8% | 90.2% | 90.8% | 91.5% |
| GSM8K | 96.7% | 97.0% | 96.7% | 96.7% |
| MMLU-Pro | 84.6% | 85.5% | 84.6% | 84.6% |
Creation Process: GRPO > DPO
Stage 1 — GRPO.
The five terms are multiplied, so the model is encourage to not over optimize for any one aspect of the reward. The highest rewards can only be met in a response that satisfies every reward.
Out-of-character notes are removed along with stat blocks, message headers etc. For the length and language checks, HTML, markdown, zero-width characters and Zalgo marks are stripped and look-alike Cyrillic or Greek letters are mapped back to Latin.
A reply scores 0 if it:
With thinking on, the first 600 thinking words are free. After that the score falls smoothly, reaching 0 at 1,200 words.
Tense normalisation. To avoid *most* of the problems with comparing different types of AI and human written text, it's normalized where possible ("drops" and "dropped" both become "drop").
Mining the dictionary. Every pair of content words that appear within five words of each other in the model's replies is summed. A pair has to appear across at least 5% of scenarios and then pass two tests:
The dictionary ends up with four kinds of entries:
Comparing against human writing. Everything above is weighted by how much more the model uses it than humans do. Anything the model uses at twice the human rate or less is dropped, which leaves normal phrases, templates and words like "eyes closed" or "head shakes" alone. Above that, the penalty grows with the gap.
Scoring a reply. Each reply is scanned for pairs, frames, stacked adjectives ("a thick, suffocating cloud") and excess words. A longer cliché like "heart hammering against ribs" counts once instead of once for every pair inside it. When a reply hits the same hub word several times, the strongest hit counts in full and each extra hit counts for less, using BM25 saturation (Robertson & Walker 1994). Importantly, because the reward looks primarily at pairs / frames / hubs, the model is not punished when it uses a slop word in a new way (i.e. The scent was strong is allowed vs the scent of ozone which gets punished). The total is measured per 1,000 words.
Negation. This catches "not X, but Y" emphasis: a negation such as "not", "never" or "n't" followed within 12 words by a contrast such as "but", "rather", "instead", a dash or semicolon, or a next sentence starting with "Instead". Guards skip interrupted speech and asides. The patterns the model uses 12× to 82× more than humans add to the slop score.
Calibration. Phrase and negation hits are added into one slop density and a single curve is applied. Up to the human 75th percentile, slop scores 1. Above it the score decays exponentially, at a rate set so a typical base-model reply scores 0.4 while the densest human writing still scores at least 0.8.
A bonus for everyday expressions like "at least", "one of" and "as soon as" that humans use and the model avoids. Just looks for 2 and 3 word phrases that are widespread across forum RP threads and sources, also common in other human writing, and used at least 2.5× more by humans than by the model. Phrases with past tense verbs, personal pronouns or scene-specific nouns were removed so the list works in any scene and tense, and overlapping phrases were merged.
Each phrase counts once per reply and is weighted by how rarely the model being trained uses it, so phrases it learns give rewards can't be abused. Credit is measured per 1,000 words and reaches full marks at the human 25th percentile. A reply with none scores 0.70, and replies under 40 words are left at 1.
Dialogue is removed and the first word of each narration sentence is taken as its opener. One leading word like "Then" or "Slowly," is skipped first so it can't hide a "He… He… He…" chain. Two measures are taken:
Both are free up to the human 75th percentile and reach the full penalty at the base model's 90th percentile. The worse of the two sets the score, down to 0.75. Replies with fewer than 5 narration sentences get the human average of 0.96, so dropping narration isn't a way around the check.
Same idea as negation, regex checks whether the reply's dialogue or short italic thoughts copy the user's last message. Before matching, stutters and repeated letters are collapsed, contractions are expanded and "I" and "you" are treated as the same, so "You're crazy" echoed as "I'm crazy?" still counts. Character names, titles, lines the user asked the character to say and replies like "I love you too" are ignored.
Then echoing is split into a few types depending on what check caught it. Models tend to only overuse a few types of echoing, so only those types are punished
Stage 2 — DPO.
After GRPO I liked the model, but I noticed it had found a few gaps in my reward suite. "as soon as" got pushed a bit too successfully, going from barely used to x43 human rate and "leaning" becoming overused. I also wanted the model to be more aware of the scene so I got Gemma to write a hint for itself of was anyone watching / nearby and is there anything in the way. Two vague questions that the answers was then placed into the system prompt during generation and removed after and rejected pairs then generated without the hint. Even doing only 30 steps of DPO, the model appears to have learnt the idea well and was notably more spatially aware than before and the two phrases it had found were reduced.
| GRPO | DPO | |
|---|---|---|
| Learning rate | 8e-6 | 5e-6 |
| Scheduler | Constant | Constant |
| Batch size | 128 (16 prompts × 8) | 32 pairs |
| Loss type | Dr. GRPO | DPO + 0.2 × SFT |
| Beta | 0.02 | 0.1 |
| Grad clip | 0.2 | 0.5 |
| LoRA rank / alpha | 32 / 32, rsLoRA | 32 / 32, rsLoRA |
| Steps | 90 | 30 |