A parameter-efficient fine-tune of google/gemma-4-31B-it on agentic coding traces from Fable 5, designed to lift coding and tool-use performance without sacrificing the base model's vision capabilities — a common failure mode of coding fine-tunes.
Evaluation: HumanEval (164 Python problems), vLLM 0.22, T=0.1, thinking=off, batch generate. Identical result (92.7%) reproduced via vLLM server API with --reasoning-parser gemma4 at T=0.2.
Why it matters: We achieve this lift with only 0.20% of parameters trainable (61.2M / 31.27B) and without degrading multimodal vision — see Layer-Freezing Strategy below.
Most coding fine-tunes of multimodal models destroy the vision-language fusion learned during base pretraining. We avoid this by applying LoRA adapters only to the upper half of the transformer stack:
Result: image description quality on held-out samples matches the base model bit-for-bit, while coding pass@1 lifts +15.9 points. Trainable parameters cut nearly in half vs. naive full-layer LoRA (~122M → 61.2M).
Final training set: 308 conversation pairs after rigorous quality filtering.
Why so few? Quality-first curation. Each retained example is a complete tool-use conversation with verified outputs — full thinking traces, valid tool calls, and successful resolutions. In our ablations, this small high-signal set outperformed larger but noisier datasets (10K+ raw pairs) on both HumanEval and tool-use evaluations. The +15.9 point HumanEval lift is achieved on 308 examples, demonstrating that for post-training of strong base models, example quality dominates example count.
Preprocessing pipeline:
Filter to type == "message" records only
Group user–assistant message pairs by parentId
Apply Gemma 4 chat template with full thinking + tool-call structure
Completion-only loss masking: prompt → -100, only assistant response contributes to loss
Tool calls (type: "toolCall") — structured invocations with name + arguments
Text blocks (type: "text") — final response
⚙️ Prompt Loss Masking
Loss is computed only on assistant response tokens (thinking + tool calls + final text). Prompt tokens (system + user) are labeled -100, so the model is never penalized for failing to predict user input.
Small fine-tuning set: 308 examples. May not generalize to all coding domains; consider further fine-tuning on your domain.
Thinking-mode dependency: The model was trained with enable_thinking=True. Responses without thinking may be suboptimal — keep thinking on for production use.
Tool calls are JSON-serialized (not bound to a runtime). You provide the execution layer.
Inherits Gemma base limitations: factual recall errors, occasional hallucination — pair with retrieval for production knowledge tasks.
📈 Evaluation: HumanEval Details
Configurations tested:
Configuration
Pass@1
Engine
Settings
vLLM offline batch
92.7% (152/164)
vLLM 0.22
T=0.1, thinking=off, batch generate
vLLM server API
92.7% (152/164)
vLLM 0.22
T=0.2, thinking=off, --reasoning-parser gemma4
Google Official (base)
76.8%
(internal)
T=0.1, thinking=on, base gemma-4-31B-it
Failure analysis (12 / 164 failed)
Type
Count
Detail
Missing imports
8
re (4), math (3), decimal (1), hashlib (1) — model omits stdlib imports
Logical errors
4
Code compiles but fails test assertions
The missing-import failures suggest a remediable distillation artifact (Fable 5 traces often elide stdlib imports). A future revision will rebalance the dataset to retain explicit imports.
Methodology
Dataset: openai/openai_humaneval (164 problems)
System prompt: "You are a Python coding assistant. Return ONLY the completed function inside python ... ."
User prompt: "Complete this Python function: python\n{prompt}\n"
Verification: Standard prompt + body + test + check(entry_point) harness, 5s timeout
Thinking mode note
On vLLM, enable_thinking=True with --reasoning-parser gemma4 produces verbose thinking traces that can exceed the token budget, resulting in finish_reason=length and empty content. Google AI Studio API handles this correctly by separating thinking from the final answer. Benchmarks above use enable_thinking=False for reliable extraction. For interactive use, keep thinking on with a higher max_tokens budget (we recommend ≥ 1024).
1@misc{autotrust2026gemma4fable5,
2 title = {Gemma-4-31B-Fable-5-Distilled: Layer-Frozen LoRA Distillation
3 Preserving Multimodal Vision},
4 author = {{AutoTrust AI Lab} and Yu, Cloud},
5 year = {2026},
6 publisher = {Hugging Face},
7 howpublished = {\url{https://huggingface.co/autotrust/gemma4-31B-Fable-5-Distilled}},
8 note = {Contact: cloud.yu@autotrust.ai}
9}
🏛 About AutoTrust AI Lab
AutoTrust AI Lab builds open foundation models and agentic systems for scientific research and coding. Our flagship products are PaperGuru AI (agentic academic research) and the upcoming ScienceGuru.