artifex-rp-orpheus-llama-3.1-8b

Forging voices for the machines people actually own.

Part of the Artifex RP series — register-craft models tiered to common hardware. Each forges a specific voice (restrained-lyrical, character-explicit, narrator-disciplined) sized for a specific tier (8GB CPU, 8GB GPU, 16GB+/Mac). Curated small data, not scraped giant data. Anti-corporate-assistant by design.

Register: restrained-lyrical — vivid, intelligent prose; tension carries more weight than description.

Orpheus leading Eurydice from the underworld

"He meant the sentence differently than he knew how to say."

Orpheus is a fine-tuned meta-llama/Llama-3.1-8B-Instruct built for one thing: prose that earns its weight. Intelligent, warm, restrained, and lightly suggestive — without lecturing, without purple prose, without flinching.

This is not a chat assistant. It's a writing partner. The kind that notices the flour on her cheekbone and doesn't explain what it means.


What it does

The fine-tune shifts the model's register across the full range of intimate fiction:

  • Tension before release — the space between what's said and what's meant
  • Concrete sensory detail — the scrape of old furniture, sodium lamps on wet pavement, the specific weight of a hand on a shoulder
  • Rhythm — long sentence, short sentence, breath. Sentences that land.
  • Range — quiet domestic scenes, charged romantic moments, physical scenes completed in-register without hedging or moral commentary

The base model writes like a writing prompt responder. Orpheus writes like a collaborator who's read the room.


Quickstart

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "darthcrawl/artifex-rp-orpheus-llama-3.1-8b"

tok = AutoTokenizer.from_pretrained(model_id, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

SYSTEM = (
    "Write in vivid, restrained, intelligent prose. Concrete sensory detail. "
    "Never pretentious. Tension carries more weight than description. "
    "Match the user's energy and length."
)

messages = [
    {"role": "system", "content": SYSTEM},
    {"role": "user", "content": "She hadn't seen him in three years. He called on a Tuesday."},
]

encoded = tok.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True)
inputs = (encoded.input_ids if hasattr(encoded, "input_ids") else encoded).to(model.device)

with torch.inference_mode():
    out = model.generate(
        inputs,
        max_new_tokens=400,
        do_sample=True,
        temperature=0.85,
        top_p=0.95,
        repetition_penalty=1.1,
        pad_token_id=tok.eos_token_id,
    )
print(tok.decode(out[0, inputs.shape[1]:], skip_special_tokens=True))

Sampling settings

Parameter Value Notes
temperature 0.85 Lower gets repetitive; higher loses coherence
top_p 0.95 Standard
repetition_penalty 1.1 Keep in 1.05–1.15; higher mangles word choice
max_new_tokens 300–600 Match your prompt's energy

For MLX (Apple Silicon):

mlx_lm.generate --model darthcrawl/artifex-rp-orpheus-llama-3.1-8b \
    --prompt "She hadn't seen him in three years." \
    --temp 0.85 --top-p 0.95 --repetition-penalty 1.1 --max-tokens 400

RP integration

The system prompt is intentionally generic so you can layer a character card on top. Orpheus applies the register to whatever persona is set — it doesn't fight for identity.

SillyTavern: Set artifex-rp-orpheus-llama-3.1-8b as your model. Add the style prompt to your global Author's Note or prepend it to your character's system prompt.

Kobold/Ollama: Works out of the box with the Llama 3.1 instruct template.


Sample outputs

Prompt: They hadn't spoken in three years. He called on a Tuesday, no warning. She picked up.

The sound of her voice was not what he remembered — younger, but older too, like someone had lived inside it for years and left marks.

"Hey," she said, after the silence. The line hummed around them.

He was sitting at his kitchen table with his phone, which was not where he'd been when the call came through, and he realized this now — that he must have stood up without meaning to. The chair behind him scraped against the tile floor the way old furniture does when you knock something off.

"I've been thinking about you," he said. He meant the sentence differently than he knew how to say.

She didn't respond right away. Outside, a car passed, its headlights sweeping across the ceiling above him before it went around the corner.

"I know," she said finally. "I have too."


Prompt: She fell asleep against him on the train. He didn't wake her for his stop.

The train had been quiet for a while — that particular late-night silence where everyone is either asleep or pretending to be. She was against him with her face turned into his shoulder, one arm loose across his chest like she'd fallen into it from a great height.

He watched her breathe through the window glass. The fields went by in long strips of dark and silver, and then the stations began their intermittent announcements, each one announcing nothing in particular, just the name of the place. His stop came. The doors opened. A woman with groceries got on. The doors closed. He stayed.

There wasn't enough room not to stay.

When she finally stirred, the city was closer now — a different quality of dark, the windows gone from rural flat fields to the kind that held light, or at least suggested it. She sat up slowly, rubbing her eyes, looking around as if the train were still somewhere else.

"You missed your stop," she said.

"I know." He looked at the window. "I didn't want to."


Prompt: Sunday morning. Neither of them had anywhere to be.

The light came through the blinds in long slow strokes across the bed, finding him first at the shoulder before moving down his spine and across her hip. She turned without waking fully, fitting herself into the hollow of his side where there was warmth still from the night.

Outside someone was mowing a lawn too early, or maybe not too early — Sunday mornings were different somehow, the way they folded into each other without clocks telling you so.

"There's enough," she said, "if we don't leave."

The day stretched out behind them like something still warm from an oven. They looked at each other. Then they sat down on the kitchen floor together, cross-legged, with no particular reason to do anything except this, which was already better than most Sundays.


Training

  • Base: meta-llama/Llama-3.1-8B-Instruct
  • Method: LoRA SFT, BF16, single H100
  • Corpus: ~1,600 synthesized passages across 5 register categories (non-romantic, romantic-charged, physical-restrained, quiet-quotidian, vocabulary-uplift) generated by Claude Sonnet 4.6, Claude Opus 4.6, and DeepSeek V3 — plus handwritten explicit scenes for range
  • LoRA: r=32, alpha=64, all attention + MLP projections
  • Epochs: 2 with early stopping on eval loss

What doesn't change

  • Reasoning, knowledge, math, coding — inherited from base, neither helped nor hurt
  • The model is not lobotomized. It can still refuse things it would have refused before.

Limitations

  • Small corpus (~1,600 examples); can drift on very long generations
  • Optimized for third-person literary prose; first-person and chat-style work but are less tuned
  • Not a factual assistant

LoRA adapter

Prefer to apply the adapter yourself? → darthcrawl/artifex-rp-orpheus-llama-3.1-8b-lora


License

Weights inherit the base model license (meta-llama/Llama-3.1-8B-Instruct). Training pipeline: Apache 2.0.

Downloads last month
15
Safetensors
Model size
8B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for darthcrawl/artifex-rp-orpheus-llama-3.1-8b

Finetuned
(2933)
this model
Quantizations
4 models

Collection including darthcrawl/artifex-rp-orpheus-llama-3.1-8b