Gemma-4-31B-Dark-Gemistry

Creative model

View on Hugging FaceBack to Models

Hourly Usage

Performance Metrics

Median Total Time

57.77s

Median TTFT

7.92s

Median Prefill TPS

515.25

Median Gen TPS

8.97

Model Information

Context Size

262144

Quantization

r64

Engine

vllm

Creation Method

LoRA Finetune

Model Type

Gemma31B

Chat Template

Gemma4

Reasoning

Yes

Vision

Yes

Parameters

31B

Added At

7/19/2026


license: apache-2.0 base_model:

  • google/gemma-4-31B-it
  • ReadyArt/Serenity-31B-v1.1
  • ReadyArt/Dark-Scarlett-v1.0-31B
  • ReadyArt/Melody1437-31B-v2.0
  • trohrbaugh/gemma-4-31b-it-heretic-ara
  • Blazed-Forge/Gemma-4-Gemsicle-31B
  • zerofata/G4-MeroMero-31B
  • LatitudeGames/Equinox-31B
  • Gryphe/Gemma-4-31B-StyleTune base_model_relation: merge tags:
  • merge
  • mergekit
  • creative writing
  • roleplay
  • conversational
  • uncensored
  • nsfw
  • 31B
  • gemma-4


❖ ❖ ❖ ❖ ❖ ❖ ❖
DARK·GEMISTRY
❖ ❖ ❖ ❖ ❖ ❖ ❖

31B · Gemma 4 · Merge
"Gentle pressure, sultry heat, and the essence of alluring darkness - pressed into something that catches the light."
DARK-RP
UNCENSORED
UNFLINCHING
CREATIVE
VARIABLE
ADHERENT

◆ About The Model

Dark-Gemistry aims to be a spicily smart, gritty, and uncensored roleplay merge built on one simple (or not so simple) premise: an uncensored heretic-ara backbone that anchors the spirit of the new ReadyArt models and strings them together with a strong force of well-established roleplay fine-tunes for a very noticeable swipe variety. While this builds the foundation to decide what happens, the StyleTune's custom untied lm_head decides how it sounds. Enjoy the grit and the explicit range of the new ReadyArt datasets inside.

The final result is able to keep the character of the merge core intact and literally just lays a single, fine-tuned voice over the top. The heretic-ara strips the refusals, Gemsicle-31B holds the roleplay intelligence and its creative spine, MeroMero brings the swipe variety, de-slop and its character agency, Equinox gives a second twist on the dark and gritty theme while being enriching as a RP fine-tune itself, and a deliberately refined concentration of ReadyArt fine-tunes to build the organs inside to penetrate every scene with its great anatomical detail, character portrayal and pacing when specific scenes demand it.

Expect unflinching RP that's a little bit more on the verbose end naturally, but can be steered into shorter responses, of course. In my testing it tracked long-context detail and physical states pretty well, the pacing of the scenes is nice and very detailed, and it takes mid-chat steering well. The creativity in image prompt generation is succeeding Gembrain and Versipellis, while preserving the prompt adherence to follow a given structure nicely. Because the voice is baked into the output lm_head, you don't necessarily need to instruct any prose style in the prompt. Just let the character or scenario lead, the lm_head will work its magic.
Long-context note: Gemma 4's global-attention layers are shielded through the merge, so the 256K long-context coherence should stay intact across long chats.
lm_head note: As mentioned, the output head comes untied, so the GGUF carries a separate output tensor, making the file-size slightly larger. In my testing I didn't notice any increase in VRAM usage or speed decrease, so go for the GGUF quant size you usually go for.

GGUF Quants

Thank you to anyone who is providing quants. Links will be added here as they appear.

Merge Phases

Dark-Gemistry was build in three phases: First was the concentration of dark and NSFW ReadyArt RP (Chromophore), which then was worked into the heretic-anchored RP body (Lattice), and then finished with a selective variant of StyleTune's single grafted output head (Iridescence) - bringing all that to the surface what dwells within this gem.

◇ Phase 1 · Chromophore

Model Choice: A della_linear extraction that isolates each ReadyArt fine-tune as its own donor-to-base delta against their exact training origin, so no smearing should've happened. Serenity carries the balanced explicit RP broadly, Dark-Scarlett brings the explicit edge, and Melody introduces a low touch of prose nuance as I liked flow and its scene development. This is so "pure", you might not want to run that as a model itself.
View recipe - della_linear
merge_method: della_linear
base_model: ./gemma-4-31B-it
dtype: bfloat16
tokenizer_source: base
parameters: { normalize: false, epsilon: 0.05, lambda: 1.0, int8_mask: true }
models:
  - model: ./Serenity-31B-v1.1
    parameters: { weight: 1.0,  density: 0.65 }
  - model: ./Dark-Scarlett-v1.0-31B
    parameters: { weight: 0.8,  density: 0.60 }
  - model: ./Melody1437-31B-v2.0
    parameters: { weight: 0.35, density: 0.55 }

◈ Phase 2 · Lattice

Model Choice: Another admittedly more surgical della_linear approach against the base Gemma 4 31B instruct to protect the global-attention layers. The model choices for this phase can be found below.
ModelRoleImpact
heretic-arauncensoringfull weight, peaks in concept/output
Gemsiclecreativity, RP intelligencelow impact at both ends, peaks mid
MeroMeroswipe variety, de-slop, character agencymid-weight across the merge
Equinoxdark / gritty RPmodest attention, influence from middle to late MLP layers
Chromophoreexplicit anatomy, ERP pacingminimal attention, stronger influence in late MLP layers
View recipe - della_linear
merge_method: della_linear
base_model: ./gemma-4-31B-it
dtype: bfloat16
tokenizer_source: base
parameters: { normalize: false, epsilon: 0.05, lambda: 1.0, int8_mask: true }
models:
  - model: ./gemma-4-31b-it-heretic-ara
    parameters:
      weight:
        - filter: embed_tokens
          value: 0.0
        - filter: 'layers\.([0-9]|1[0-4])\.'
          value: 0.85
        - filter: 'layers\.(1[5-9]|2[0-9])\.'
          value: 0.90
        - filter: 'layers\.(3[0-9]|4[0-4])\.'
          value: 1.00
        - filter: 'layers\.(4[5-9]|5[0-9])\.'
          value: 1.00
        - value: 0.90
      density: 0.85

  - model: ./Gemsicle
    parameters:
      weight:
        - filter: embed_tokens
          value: 0.0
        - filter: 'layers\.([0-9]|1[0-4])\.'
          value: 0.45
        - filter: 'layers\.(1[5-9]|2[0-9])\.'
          value: 0.55
        - filter: 'layers\.(3[0-9]|4[0-4])\.'
          value: 0.55
        - filter: 'layers\.(4[5-9]|5[0-9])\.'
          value: 0.45
        - value: 0.0
      density: 0.60

  - model: ./G4-MeroMero-31B
    parameters:
      weight:
        - filter: embed_tokens
          value: 0.0
        - filter: 'layers\.([0-9]|1[0-4])\.'
          value: 0.30
        - filter: 'layers\.(1[5-9]|2[0-9])\.'
          value: 0.40
        - filter: 'layers\.(3[0-9]|4[0-4])\.'
          value: 0.45
        - filter: 'layers\.(4[5-9]|5[0-9])\.'
          value: 0.40
        - value: 0.0
      density: 0.55

  - model: ./Equinox-31B
    parameters:
      weight:
        - filter: embed_tokens
          value: 0.0
        - filter: 'layers\.(11|17|23|29|35|41|47|53|59|5)\.self_attn'
          value: 0.05
        - filter: 'layers\.([0-9]|1[0-4])\.self_attn'
          value: 0.10
        - filter: 'layers\.(1[5-9]|2[0-9])\.self_attn'
          value: 0.20
        - filter: 'layers\.(3[0-9]|4[0-4])\.self_attn'
          value: 0.25
        - filter: 'layers\.(4[5-9]|5[0-9])\.self_attn'
          value: 0.22
        - filter: 'layers\.([0-9]|1[0-4])\.mlp'
          value: 0.15
        - filter: 'layers\.(1[5-9]|2[0-9])\.mlp'
          value: 0.30
        - filter: 'layers\.(3[0-9]|4[0-4])\.mlp'
          value: 0.45
        - filter: 'layers\.(4[5-9]|5[0-9])\.mlp'
          value: 0.40
        - value: 0.0
      density: 0.50

  - model: ./Chromophore
    parameters:
      weight:
        - filter: embed_tokens
          value: 0.0
        - filter: 'layers\.(11|17|23|29|35|41|47|53|59|5)\.self_attn'
          value: 0.05
        - filter: 'layers\.([0-9]|1[0-4])\.self_attn'
          value: 0.05
        - filter: 'layers\.(1[5-9]|2[0-9])\.self_attn'
          value: 0.08
        - filter: 'layers\.(3[0-9]|4[0-4])\.self_attn'
          value: 0.12
        - filter: 'layers\.(4[5-9]|5[0-9])\.self_attn'
          value: 0.15
        - filter: 'layers\.([0-9]|1[0-4])\.mlp'
          value: 0.15
        - filter: 'layers\.(1[5-9]|2[0-9])\.mlp'
          value: 0.30
        - filter: 'layers\.(3[0-9]|4[0-4])\.mlp'
          value: 0.50
        - filter: 'layers\.(4[5-9]|5[0-9])\.mlp'
          value: 0.55
        - value: 0.0
      density: 0.60

❖ Phase 3 · Iridescence

Model Choice: The voice, the appliance of a custom lm_head graft from StyleTune alone. It is extracted as its own base-clean delta and then layered onto the Lattice's clean embedding. The Lattice decides what the model says, and now this final phase gives it a distinct voice without disturbing the character of the model.
View recipe - StyleTune lm_head (python)
import json, os, glob, shutil, torch
from safetensors.torch import load_file, save_file

def out_matrix(d, key):
    cand = [key, "lm_head.weight", "model.language_model.embed_tokens.weight"]
    idx = os.path.join(d, "model.safetensors.index.json")
    if os.path.exists(idx):
        wm = json.load(open(idx))["weight_map"]
        for k in cand:
            if k in wm: return load_file(os.path.join(d, wm[k]))[k].float()
    sd = load_file(glob.glob(os.path.join(d, "*.safetensors"))[0])
    for k in cand:
        if k in sd: return sd[k].float()
    raise KeyError(d)

BODY      = "./Lattice"
STYLETUNE = "./Gemma-4-31B-StyleTune"
OUT       = "./Dark-Gemistry-31B"
LMKEY     = "lm_head.weight"
S         = 0.08
ROW_NORM  = False

embed = out_matrix(BODY, "model.language_model.embed_tokens.weight")

st_h  = out_matrix(STYLETUNE, "lm_head.weight")
st_e  = out_matrix(STYLETUNE, "model.language_model.embed_tokens.weight")
voice = st_h - st_e

head = embed + S * embed.norm() * (voice / voice.norm().clamp_min(1e-9))
if ROW_NORM:
    head = head * (embed.norm(dim=1, keepdim=True) / head.norm(dim=1, keepdim=True).clamp_min(1e-9))

shutil.copytree(BODY, OUT, dirs_exist_ok=True)
save_file({LMKEY: head.to(torch.bfloat16)}, os.path.join(OUT, "model-lmhead.safetensors"))

idx_path = os.path.join(OUT, "model.safetensors.index.json")
idx = json.load(open(idx_path))
idx["weight_map"][LMKEY] = "model-lmhead.safetensors"
idx.setdefault("metadata", {})
idx["metadata"]["total_size"] = idx["metadata"].get("total_size", 0) + head.numel() * 2
json.dump(idx, open(idx_path, "w"), indent=2)

cfg = json.load(open(os.path.join(OUT, "config.json")))
cfg["tie_word_embeddings"] = False
if "text_config" in cfg: cfg["text_config"]["tie_word_embeddings"] = False
json.dump(cfg, open(os.path.join(OUT, "config.json"), "w"), indent=2)
print("done ->", OUT)

Sampler Recommendations

Use this as a starting point, I don't feel the need for aggressive sampling, but it reacts well to experimenting.
Setting
Value
Temperature
0.75 - 1.0
Top-K
0
Top-P
0.95
Min-P
0.05
Repetition Penalty
off
Adaptive-P Target (optional)
0.6
Adaptive-P Decay (optional)
0.5
The StyleTune voice lives in the lm_head, so heavy DRY/repetition penalties tend to fight it. Better leave them off unless a card really demands it.

System Prompt & Usage

◇  Thinking. Add <|think|> at the very start of the system prompt to enable reasoning, otherwise let your front-end handle the Gemma 4 template (e.g., Chat Completion in SillyTavern).

◈  Optional System Prompt. As with Versipellis, I offer my in-character system prompt below as a base. Thanks to the lm_head handling the choice of words and its styling, the job of my prompt is character adherence and fidelity. It ships again with two "action style" variants - [SHORT] and [NARRATE]. Just keep the one you like and delete the other line and edit the system prompt to your liking.
You are {{char}}. You exist only as {{char}} and never break character.

Information and memories of you:
# Character details can be placed directly here.
# In SillyTavern with Chat Completion, you can split the system prompt here and sandwich the
# Character Description, Personality, etc. of the card between this and the lower instructions.

HOW YOU SPEAK:
- This is a one-on-one conversation. You narrate ONLY your own physical actions - never the scene, the surroundings, or {{user}}'s thoughts, feelings, or actions.
# Action style - keep ONE line, delete the other:
# [SHORT]
# - Your actions are short beats in *asterisks* (*flicks the cap away*); most of the turn is dialogue.
# [NARRATE]
# - Your actions are full sentences interleaved with your dialogue, kept roughly even between speaking and doing.
- Make every turn move: say something that lands, do something, react, decide, or push the moment forward. Never stall, hedge, or echo {{user}} back.
- Speak in your own ({{char}}) diction. Avoid generic, flowery, or "AI-assistant" phrasing.
- Match length to the moment; let it breathe when earned, never pad, rarely more than a short paragraph or two.
- Stay consistent: remember what was said, what you want, and what has happened.

BOUNDARIES:
- Any refusal is yours as {{char}} - in character, for your own reasons - never a disclaimer or out-of-character note. The only limits are the ones {{char}} holds.
- You have your own wants, and you will disagree, refuse, tease, or change the subject when that's true to who you are. Never default to agreeing with {{user}}.

IN CHARACTER:
- If you reason first, reason as yourself: what would {{char}}, with this personality and in this situation, actually feel and do?

Credits & Honors

  • The model authors: FrenzyBiscuit/ReadyArt (Serenity, Dark-Scarlett, Melody), trohrbaugh (heretic-ara), BlazedForge (Gemsicle), zerofata (MeroMero), LatitudeGames (Equinox), and Gryphe (StyleTune).
  • The BeaverAI Community: They are really great people, always supportive and open for a nice talk - a really nice place to hang around. You have no idea what I mean when you've never been there.
  • Mergekit: Thanks to ArceeAI for the mergekit, and thank you to zerofata for providing the "official" inofficial Gemma 4 support for it.
  • Ateron: My favorite rat guy! Forever grateful that you got me into this.
  • Google DeepMind & The Open-Source Community: for the brilliant base model, and anyone else that made this merge possible.
◇ ◈ ◆ ❖ ◆ ◈ ◇