Skip to content
Ankit Aglawe
Parable· agent-trace fine-tune

Qwen/Qwen3-4B, fine-tuned on Claude Fable 5 agent traces

This is not Qwen's Qwen3-4B. It is that model trained on genuine agent session traces, and the single most useful thing it does is stop returning empty answers.

Parable fox mascot

Parable

AnkitAI/Parable-Qwen3-4B-Claude-Fable-5
4B parametersApache-2.05,512 downloads, checked 2026-07-27

Training data carries upstream terms: Fable-5 traces are AGPL-3.0, the terminal set is MIT, and both originate from third-party assistants whose terms may reach downstream use.

Qwen3-4B is a hybrid-thinking model: it can emit a <think> block before answering, and by default it does. This checkpoint is Qwen3-4B with a QLoRA adapter trained on genuine Claude Fable 5 and GPT-5.5 agent sessions, and the headline result is not a benchmark score. It is that the model answers.

The trap, written down because nothing on Hugging Face says it. Benchmarking the base Qwen3-4B in its default mode produces a score near zero. Not because the model is bad — because on ordinary prompts it spends the entire 3,500-token budget inside <think> and emits empty content. The final answer never arrives. Anyone comparing a fine-tune against that number will conclude their fine-tune is a triumph, and they will be measuring a truncation artifact. Diagnosing this cost six GPU-hours. The rule that came out of it: when the base is a hybrid-thinking model, match modes explicitly on every row, and run enable_thinking=false on both sides.

The same pathology reaches the fine-tune if you let it. v1 of this model inherited Qwen3's runaway thinking: on 7 of 34 ordinary prompts — write a retry function with exponential backoff, write a bash script that watches a log file — it burned the whole budget reasoning and returned nothing to the user. A 21% silent-failure rate in ordinary chat use, which is far worse than a few points of HumanEval, and invisible to every benchmark that only scores non-empty responses.

v2 fixes it at the data layer rather than at inference time. The training corpus applies the Qwen chat template with empty <think> blocks, so the model is trained non-thinking. The result: 0 of 34 empty answers, 140× less reasoning text (1,342 characters across the whole suite, against 187,581 for v1), and answers about half as long. Coding scores are unchanged within noise, so this is a reliability fix rather than a capability trade.

A useful side effect worth stating because it is cheap evidence the training actually reshaped generation: this fine-tune is mode-invariant. It scores 73.2/67.1 with thinking disabled and 72.6/67.1 with it enabled — it ignores the flag. The behaviour was removed, not suppressed, which is also why visible chain-of-thought is now something you have to ask for in the prompt rather than something the model volunteers.

Against the base model it trails by 3.6 HumanEval points, 73.2 against 76.8. That is the cost of specialising on agent traces rather than on raw function synthesis, and it is about a third of the regression the same recipe produces at 3B. The other side of that trade is still unevidenced: no agent benchmark has been run on this checkpoint, so the agent claim rests on held-out trace loss rather than on an agent-task measurement.

The numbers

Thinking disabled on every row, including both base rows — see above for why that matters. Same harness, greedy decoding, Q4_K_M builds, HumanEval+ via EvalPlus.

Basev1v2 (current)
Prompts answered (34-prompt suite)27/3434/34
HumanEval76.872.073.2
HumanEval+71.368.367.1
Held-out trace loss2.8461.876

Figures as reported on the model's own Hugging Face card and in the training lab notebook. Quoted here, not re-measured.

Builds

GGUF quantisations, for llama.cpp, Ollama and LM Studio. Sizes are exact file sizes from the Hugging Face API, not estimates. Q4_K_M is the one to take unless you have a reason.

QuantSizeNotes
Q4_K_M2.50 GBRecommended
Q5_K_M2.89 GBHigher quality
Q6_K3.31 GBNear-lossless
Q8_04.28 GBMaximum quality
F168.05 GBUnquantised

All quants: AnkitAI/Parable-Qwen3-4B-Claude-Fable-5-GGUF

Run it

Ollama
ollama run parable/qwen3-fable:4b
Python (llama-cpp-python)
from llama_cpp import Llama

llm = Llama.from_pretrained(
    repo_id="AnkitAI/Parable-Qwen3-4B-Claude-Fable-5-GGUF",
    filename="*Q4_K_M.gguf",
    n_ctx=8192,
)
out = llm.create_chat_completion(
    messages=[{"role": "user", "content": "Write a Python function that retries an HTTP request with exponential backoff."}],
    max_tokens=1200,
    temperature=0.3,
)
print(out["choices"][0]["message"]["content"])

LM Studio: lms get parable/qwen3-fable

Try others

Where to get it

Base model
Qwen/Qwen3-4B
Training data
parable-corpus-v2 (10.6k curated traces)