What it does
- Writes short English stories and fables with 1–6 numbered scenes.
- Accepts separate Name and About them fields for each main character.
- Tries to preserve requested names, setting details, important objects, and endings.
- Runs with Transformers, llama.cpp-compatible apps, or Core ML on Apple devices.
See it in action
Open SmolGPT-Fables Studio,
choose the model and number of scenes, then describe each character in their
own card. The Studio returns a clean story preview and a Markdown download.
Try a story
The easiest way to use the model is
SmolGPT-Fables Studio.
You do not need to write Markdown or learn a prompt format.
Story idea: A paper moth leads a mapmaker to a neighborhood that vanished from every map.
Genre: Cozy fantasy
Scenes: 4
Name: Mina Vale
About them: A careful apprentice mapmaker who wants credit for her work.
Name: Orin Reed
About them: A retired courier who remembers roads that no longer appear on maps.
Setting: A rain-bright canal city whose maps change at midnight.
Ending: Mina restores the neighborhood without exposing the people who protected it.
The expected output looks like this:
### Scene 01: The Map That Moved
Mina Vale's brass compass turned away from north and followed a paper moth
through the archive window.
### Scene 02: The Unwritten Road
Orin Reed recognized the vanished towpath while Mina checked each bridge
against the changing map.
This short excerpt shows the expected format. It is not an evaluated generation
or a promise that every response will use these words.
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "neonforestmist/smolgpt-fables"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype="auto",
)
messages = [
{
"role": "user",
"content": (
"Write a two-scene cozy fable about Mina Vale, a careful mapmaker, "
"and Orin Reed, a retired courier. Set it in a canal city at "
"midnight and end with Mina restoring a vanished neighborhood."
),
}
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, do_sample=False, max_new_tokens=700)
new_tokens = outputs[0, inputs["input_ids"].shape[1]:]
print(tokenizer.decode(new_tokens, skip_special_tokens=True))
Downloads
Table with columns: Pick, File, Size, Best for| Pick | File | Size | Best for |
|---|
| Standard | model.safetensors | 3.42 GB | Transformers and full model precision |
| Compact | SmolGPT-Fables-v1-Q4_K_M.gguf | 1.06 GB | Runtimes that support Q4_K_M GGUF models |
| Core ML | coreml/SmolGPT-Fables-v1-CoreML-INT4.mlpackage | 0.96 GB |
The evaluation results below apply to the standard Transformers model. The
GGUF version has not been evaluated separately. The Core ML package passed a
stateful prediction smoke test and matched the FP16 model's top token.
Use it in an Apple app
The Core ML package is stored in this repository so a SwiftUI project can stay
small. An app can download the package once, verify it with
coreml/coreml-checksums.sha256, compile it on the device, and cache it for
offline stories.
The package uses INT4 weights, a 2,048-token context, and a stateful key/value
cache. Its minimum deployment versions are iOS 18 and macOS 15.
How well it works
The Studio-focused check is strong on the behavior this interface needs:
Table with columns: Check, Result| Check | Result |
|---|
| Stories containing every requested full name | 60 / 60 |
| First name combined with the wrong surname | 0 |
| Studio behavior checks | All passed |
A stricter writing-quality suite passed every check on 32 of 60 stories. Its
lowest measured document-diversity score was 0.839416, just below the required
0.850000. The most common misses were incomplete causal resolution and scene
length. These measurements are useful signals, not guarantees for every story.
Known limits
- Names and requested scene counts are learned behavior, not hard guarantees.
- Longer stories can lose continuity or end weakly.
- The model can repeat phrases or flatten cultural nuance.
- It is English-focused and intended for short stories rather than factual advice.
- Review and edit generated writing before sharing it.
Training data
SmolGPT-Fables v1 was adapted from
HuggingFaceTB/SmolLM2-1.7B-Instruct
using the published
neonforestmist/smolgpt-markdown-stories
dataset. The synthetic and curated stories cover varied genres, settings,
character descriptions, required details, and endings.
The published BF16 artifact contains 1,711,376,384 parameters across 218 tensors.
It uses micro update 8 over adapter update 68 and the
smolgpt-fables-smollm3-chat-v5 prompt contract.
Table with columns: Artifact, SHA-256| Artifact | SHA-256 |
|---|
model.safetensors | 00d2c2b4b01ce0a13fbec5ba79f4fb843a751af2780e939ab431a092f1789207 |
training_manifest.json | 22b90db42797c891bb69ac526ff237ef973be05827722ae83d2e3fdb794702ea |
SmolGPT-Fables-v1-Q4_K_M.gguf | 6d4d38e9075bcae3cfe59ed37c0acc3425ad31296de7530611e63628424a7c35 |
| GGUF quantization manifest | 87da452fd6df5658b8e9f07844a84993f656ae1b3f580e560eba018a37cc5a2f |
| GGUF checksums file |
The GGUF file contains 218 tensors and is 1,055,609,376 bytes. It was converted
with llama.cpp commit aff6eb6e7503538fec1532dec2f584bc7a4a4e4d.
Strict-suite diagnostic occurrences:
Table with columns: Diagnostic, Count| Diagnostic | Count |
|---|
| Incomplete causal resolution | 17 |
| Scene length | 16 |
| Character-role retention | 1 |
| Required detail | 2 |
| Scene heading | 2 |
| Unresolved ending | 1 |
Character-name audit report SHA-256:
38a1ba15d6ae8545ae71a9953077d0626aba5c85ccf7f3844514bba04188f3a6.
License
Apache-2.0. Review the
SmolLM2-1.7B-Instruct model card
alongside this one when assessing intended use and limitations.