alt.freeweights.text / Smaug-Humanizer
From: abacusai <huggingface.co/abacusai>Newsgroups: alt.freeweights.textSubject:

Smaug-Humanizer

Date: 2026-11-15Commit: 0266647Signed: 2DC28CC7B26A283B ✓

Text generation model with 12B parameters. Safetensors weights, 24.0 GB in all. Published by abacusai under Apache-2.0.

12B params24.0GBSmaug-Humanizersafetensorspermissive
FactsParams12BSize24.0 GBFormatssafetensorsTasktext generationLicenseApache-2.0From sourcepermissive
$ fw get abacusai/Smaug-Humanizer
# manifest sha256 260265f1ac18… · 24.0 GB · 18 files
$ fw verify ./Smaug-Humanizer abacusai/Smaug-Humanizer
From sourceHosted (signed)abacusai/Smaug-HumanizerLast check: 2026-11-15 03:40 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Fine-tune of gemma-4-12B.

Works with

Overview

Size
24.0 GB
Weights
23.9 GB (safetensors)
Parameters
12B
Formats
safetensors
Task
text generation
License
Apache-2.0 (permissive)
Files
18, each with a sha256
Publisher
abacusai
Added
2026-11-15
Section
alt.freeweights.text
Lineage

Original release from the publisher.

Base model: google/gemma-4-12B

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:40 UTCpassed

Model card

From the publisher at commit 0266647. Shown as plain text with links; images open at the publisher.

Image: Smaug Humanizer


Homepage Hugging Face

License

1. Model Introduction#

Smaug Humanizer rewrites AI-generated text so that it reads as if a person wrote it. It keeps the facts, numbers, names and layout of the input, and changes the wording, rhythm and voice. It is a 12B model, fine-tuned by Abacus.AI from gemma-4-12B.

2. Model Summary#

Base modelgoogle/gemma-4-12B (pretrained model, not instruction-tuned)
Parameters12B
Precisionbf16
Input / outputAI-written text / the same text rewritten in a human voice
Best input lengthup to about 500 words per call (see Limitations)
TrainingSFT on 3,676 rewrite pairs, then 200 steps of GRPO
Recommended samplingtemperature 1.0, top_p 0.95, top_k 64
Blog postSmaug Humanizer: An open-weight 12B humanizer
GGUFabacusai/Smaug-Humanizer-GGUF
LicenseApache 2.0

3. Training#

Image: Smaug Humanizer training pipeline

Stage 1: SFT#

We start from human text written in 2021 or earlier, so we know a person wrote it. An LLM rewrites each passage in its own style, which gives an AI text x for every human text h. The model learns the reverse direction, from x back to h.

When asked to rewrite a passage, LLMs often change only a few words, and a model trained on such pairs learns to make the same light edits. So we keep a pair only if it passes all of our filters:

  • A real rewrite: a deterministic check drops pairs where too many of the human sentences survive in x.
  • The same layout: a deterministic check requires the same paragraph and line breaks in x and h.
  • The same facts: an LLM judge checks that x keeps every fact, number, name and quote of h and adds nothing.

We ended up with 3,676 pairs, and train a LoRA (r = 64, α = 128) on gemma-4-12B for 2 epochs. Most of the gain came from this stage: cleaner pairs helped more than anything we did later. RL adds a smaller gain on top. We measured each step on a held-out set of AI-written texts that the model never saw in training. Pangram, a commercial AI-text detector, scored how human each rewrite reads, and an LLM judge scored its faithfulness to the input.

Stage 2: RL#

The reward. Each prompt x comes with its own human text h, the passage that x was made from. A rewrite y earns reward for being close to h and far from x:

$$ r(y) = k(y, h) - k(y, x), \qquad k(a, b) = \exp\!\left(-\gamma\,\lVert e(a) - e(b) \rVert^2\right) $$

Here e(·) is a text embedder and γ = 0.262. Because h and x carry the same content, the difference between the two terms is mostly style: the rewrite gains reward when it moves away from its AI draft and toward the way a person wrote the same thing. Our blog post shows how this kernel similarity reward follows from an MMD objective.

The gates. The reward alone does not protect the facts: a rewrite that leaves out a detail is also further from its AI draft. So each sample must also pass five deterministic gates:

  • Numbers: every number in the input is in the rewrite.
  • Layout: the rewrite has the same paragraph and line breaks as the input.
  • Length: the rewrite is 0.7 to 1.4 times as long as the input.
  • Script: the rewrite does not switch to another alphabet.
  • Spelling: the rewrite does not have more unknown or misspelled words than normal human text.

A sample that fails any gate gets the lowest raw reward in its group of 8, taken over all 8 samples:

$$ \tilde r(y_i) = \begin{cases} r(y_i) & \text{if } y_i \text{ passes every gate} \\ \min_j r(y_j) & \text{otherwise} \end{cases} $$

Optimization. For each prompt the policy samples a group of 8 rewrites, and GRPO uses the group-normalized advantage

$$ A_i = \frac{\tilde r(y_i) - \operatorname{mean}_j \tilde r(y_j)}{\operatorname{std}_j \tilde r(y_j)} $$

with a KL penalty to the SFT model.

SettingValue
Start point and KL referencethe Stage 1 SFT model
Prompts2,000 AI texts with their human originals
Steps200
Group size8
Learning rate3e-5, linear decay
KL coefficient β0.05
LoRAr = 64, α = 128
Max completion1,024 tokens

Image: The kernel similarity reward rises during GRPO

We stop at 200 steps on purpose. When we ran the same reward for 400 steps, the reward kept climbing, but the rewrites got worse.

4. Generations#

Each input is a chatbot answer on a fictional or general topic, the right column is a Smaug Humanizer rewrite of it

| A backgrounder on local election recounts (gpt-6-sol)

| Input: Pangram 100% AI Image: Pangram scores the input as 100% AI | Smaug Humanizer: Pangram 100% human Image: Pangram scores the rewrite as 100% human

| A personal essay about baking bread (gpt-6-sol)

| Input: Pangram 100% AI Image: Pangram scores the input as 100% AI | Smaug Humanizer: Pangram 100% human Image: Pangram scores the rewrite as 100% human

| An explainer on the phases of the Moon (gemini-3.8-flash)

| Input: Pangram 100% AI Image: Pangram scores the input as 100% AI | Smaug Humanizer: Pangram 100% human Image: Pangram scores the rewrite as 100% human

5. Usage#

The model takes one user turn with this prompt:

PROMPT = """Rewrite the AI-written text below so that it reads as if a person wrote it, in a person's own voice, wording and rhythm.

Keep every fact, number, name and quote. Keep the structure and the language of the text. Output only the rewritten text.

Text:
{text}"""
vLLM#
vllm serve abacusai/Smaug-Humanizer --language-model-only --dtype bfloat16 --max-model-len 8192
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")

response = client.chat.completions.create(
    model="abacusai/Smaug-Humanizer",
    messages=[{"role": "user", "content": PROMPT.format(text=text)}],
    temperature=1.0,
    top_p=0.95,
    stop=["<end_of_turn>"],
    extra_body={"top_k": 64},
)
print(response.choices[0].message.content.strip())
Transformers#
from transformers import AutoModelForImageTextToText, AutoTokenizer

model_id = "abacusai/Smaug-Humanizer"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype="bfloat16", device_map="auto")

messages = [{"role": "user", "content": PROMPT.format(text=text)}]
input_ids = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt",
).to(model.device)

output_ids = model.generate(
    input_ids,
    max_new_tokens=8192,
    tokenizer=tokenizer,  # needed for the <end_of_turn> stop string in generation_config.json
)
completion = tokenizer.decode(output_ids[0][input_ids.shape[1]:], skip_special_tokens=True)
print(completion.split("<end_of_turn>")[0].strip())  # generate() stops at <end_of_turn> but keeps it in the output
llama.cpp (GGUF)#

GGUF files for llama.cpp, Ollama and LM Studio are in abacusai/Smaug-Humanizer-GGUF. Q8_0 fits a 16 GB GPU, and Q4_K_M runs on an 8 GB GPU or a laptop.

llama-server -hf abacusai/Smaug-Humanizer-GGUF:Q4_K_M -ngl 99 -c 8192 --port 8080

Use the same prompt and sampling, and add <end_of_turn> as a stop string.

Sampling parameters#
  • temperature: 1.0
  • top_p: 0.95
  • top_k: 64
  • stop: ["<end_of_turn>"]. Required: the model ends its turn with the text <end_of_turn>, not with <eos>.

6. Limitations#

  • Long texts are harder. A detector judges the whole document, so every part has to pass. Split long inputs at paragraph breaks into chunks of about 500 words, rewrite each chunk, and join them with a blank line.
  • Mostly English. Other languages work, but less well.
  • Some rewrites are still flagged. Smaug Humanizer turns many texts that detectors score as AI into text they score as human, but not every time. Pangram still flags some rewrites, more often for long texts. Sample a few rewrites and pick one if it matters.
  • Read the output. The gates cover numbers and layout, but a rewrite can still change a detail. Check anything you publish.

7. License#

Apache 2.0, the same license as the base model, gemma-4-12B.

8. Citation#

@misc{abacusai2026smaughumanizer,
  title  = {Smaug Humanizer},
  author = {Abacus.AI},
  year   = {2026},
  url    = {https://huggingface.co/abacusai/Smaug-Humanizer}
}

9. Contact Us#

If you have any questions, please reach out at Abacus.AI.

Files

18 files · 24.0 GBWeights 23.9 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 18 files with their sha256
FileSizesha256
.gitattributes2.19 KBaf417ad46ee61e6ac75ec778c1573c9dcfebffb90cf8005a360305b19dbab580
LICENSE11.4 KBcfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30
README.md10.8 KB2fc175a2422867bf8c61ee4738e8fa23b5bddf2347264fe178435d365d5daea2
chat_template.jinja223 B464c779844a5eaebebe42b03c8f3e3aa04374e8f198663e9fc6dec40f8c40ebf
config.json4.38 KB14f38c5492ffc9cbcdf808647ca0c025bb5b9b4eb737526347134d500ace6098
figures/examples/bread_input_pangram.png495 KB841560a97a391d5d4f7371c21ad90c354635504924a272db06dbc61a7990f600
figures/examples/bread_output_pangram.png475 KBc107c854cd805044c783da18859ac3a53a7424159343e61a32f8730377a202cb
figures/examples/moon_input_pangram.png573 KBc9029e42baef3b1e444c08b5a1efc65a6f2feddd290e5e3ecf96868fe1bb2e4b
figures/examples/moon_output_pangram.png580 KBe4aaac46aa0139117f6193799122a9eefcb6347a4034722d3cf2549d790e3bde
figures/examples/recount_input_pangram.png592 KB15238083f6ac20ccb1e2f375ce69582317962e6763649ee7ab13c4c5df86b7da
figures/examples/recount_output_pangram.png552 KB403ccec0996718254412530dbab975dbb09ad805153c728589e623bf274e5d37
figures/smaug_humanizer_method.png263 KB1fc29b2446708908690316bf52ef321e66f96c6ac1b84c34bcdbafb1b25c88bd
figures/smaug_humanizer_reward_curve.png301 KB09a51a8d8f6ba422a558097851f067f10e6fadeed4acdb41074e9ea4f214e005
generation_config.json277 B1e357d4ae6deffdc73456508338d80d53207bedf2011e6e7a45f573bd050e595
model.safetensors23.9 GBc877a5052a1007a56d2a8c0a61fb3407cda34c0a33c3627ac96010816bc30cbd
processor_config.json1.38 KB6b938e76555b3e9946890770e1abcd442a4718f34041a58e8139dc8ad34545c9
tokenizer.json32.2 MB12bac982b793c44b03d52a250a9f0d0b666813da566b910c24a6da0695fd11e6
tokenizer_config.json1.48 KB94413a660cdd703eaf6460f6fe50af071decfbad21e683c1600ef0a41137e1c2
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
02666472db pinned now2026-11-15 03:40 UTC18 files · 24.0 GB

Use it

$ fw get abacusai/Smaug-Humanizer
# manifest sha256 260265f1ac18… · 24.0 GB · 18 files
$ fw verify ./Smaug-Humanizer abacusai/Smaug-Humanizer
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/abacusai/Smaug-Humanizer.json --dir ./Smaug-Humanizer $ python3 fw.py verify ./Smaug-Humanizer ./abacusai__Smaug-Humanizer.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download abacusai/Smaug-Humanizer --revision 02666472dbbe7bf1d9ed0abbf684f640e0346f06 --local-dir ./Smaug-Humanizer
transformersLoad the weights in Python.
import os os.environ["HF_ENDPOINT"] = "https://freeweights.allternit.com" from transformers import AutoModelForCausalLM, AutoTokenizer tok = AutoTokenizer.from_pretrained("abacusai/Smaug-Humanizer", revision="02666472dbbe7bf1d9ed0abbf684f640e0346f06") model = AutoModelForCausalLM.from_pretrained("abacusai/Smaug-Humanizer", revision="02666472dbbe7bf1d9ed0abbf684f640e0346f06", device_map="auto")
vLLMServe an OpenAI-compatible API.
$ HF_ENDPOINT=https://freeweights.allternit.com vllm serve abacusai/Smaug-Humanizer --revision 02666472dbbe7bf1d9ed0abbf684f640e0346f06

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
LICENSE
Text sha256
cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: abacusai <huggingface.co/abacusai>Newsgroups: alt.freeweights.textSubject: Smaug-HumanizerDate: 2026-11-15Commit: 0266647Signed: 2DC28CC7B26A283B ✓
Upstream
abacusai/Smaug-Humanizer
Pinned commit
02666472dbbe7bf1d9ed0abbf684f640e0346f06
Manifest
Smaug-Humanizer.json · .minisig
Manifest sha256
260265f1ac18d90765dfb0a1d3644e9273a1d8196d1a6c30d9d1f7dc8b7c88a9
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:40 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/abacusai/Smaug-Humanizer.json $ curl -O https://freeweights.allternit.com/manifests/abacusai/Smaug-Humanizer.json.minisig $ minisign -Vm Smaug-Humanizer.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

google/gemma-4-12B · this model is a finetune of it

1 model in the catalog name this one as their parent.

Quantizations
1
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download abacusai/Smaug-Humanizer
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. Smaug-Humanizer.json. Provenance. Takedown history: none.

Variants

1 quantized or adapter build of Smaug-Humanizer. Each has its own license check and page.

From: laion <huggingface.co/laion>Subject: a2-rl-e2egit_large-50-32B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-large-15-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_e2egit-v2-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_pymethods2test-large-80-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_exp_rpt_unitsyn-python-large-10-8B
From: laion <huggingface.co/laion>Subject: a3-rl-DCAgent_mix_h2_language_proportional-65-8B