Fonzie0.2-4B

A 4B model that searches when it doesn't know, answers with sources, speaks Italian and English, and looks at pictures. It is a fine-tune of Qwen3.5-4B, trained to work inside real agent apps: oh-my-pi and opencode. It was also tested in Hermes Agent, which it never saw in training.

In italiano: un 4B che cerca quando non sa, risponde con le fonti, parla italiano e inglese e guarda le foto. Rispetto a Fonzie0.1 riprova dopo una ricerca fallita, cerca prima di rispondere su "l'ultimo X", dice quando una cosa non esiste e in oh-my-pi fa le domande all'utente con lo strumento ask. รˆ un progetto di studio personale di Alfonso Fortunato: i numeri qui sotto dicono onestamente cosa migliora e cosa peggiora.

GGUF for llama.cpp / LM Studio (Q8_0, Q4_K_M, vision projector): Fonzie0.2-4B-GGUF. Previous version: Fonzie0.1-4B.

Smaller versions: Q4_K_M and Q8_0

To run it in a few GB, Fonzie0.2-4B-GGUF has a Q4_K_M (2.8 GB) and a Q8_0 (4.6 GB), plus the 0.7 GB vision projector. GPU memory used by llama-server with the projector loaded, MTP on and the default f16 KV cache:

Context (tokens) Q4_K_M Q8_0
8,192 4.2 GiB 5.9 GiB
32,768 5.1 GiB 6.8 GiB
65,536 6.3 GiB 8.0 GiB
131,072 8.7 GiB 10.4 GiB
163,840 10.1 GiB 11.8 GiB
262,144 (the model's limit) โ‰ฅ 13.4 GiB โ‰ฅ 15.1 GiB

The Q4_K_M was measured on an RTX 4070 Ti (12 GB) at 64k, 128k and 160k; the other rows are computed from those measurements, and the Q8_0 was not run. With a q8_0 KV cache the Q4_K_M fits 229,376 tokens on 12 GB.

What the Q4_K_M loses against this bf16 model (bold: paired 95% interval excludes zero):

bf16 Q4_K_M
frozen test: accuracy 66.5% 64.8%
frozen test: confident wrong answers 24.6% 27.4%
frozen test: invented links 2.6% 7.2%
everyday questions, accuracy (oh-my-pi / opencode / Hermes) 66.9 / 66.7 / 76.4% 54.2 / 66.7 / 73.2%
new test set, accuracy (oh-my-pi / opencode / Hermes) 55.4 / 61.1 / 67.8% 52.1 / 67.2 / 60.6%

In opencode and Hermes it is as good as the bf16, within the noise; in oh-my-pi it loses about 13 points on everyday questions and writes more links that no tool returned. The Q8_0 has not been evaluated. Details and the fastest 12 GB setup are in the GGUF model card.

What is new compared to Fonzie0.1

Fonzie0.2 has the same recipe as Fonzie0.1; only the data changed. It adds conversations for the failures seen in Fonzie0.1. Fonzie0.1 was measured again in exactly the same setup (merged bf16 on vLLM 0.32, same sampling), so its numbers here differ slightly from its own card. Differences in bold are outside the paired 95% bootstrap interval.

New tests, written for these failures and never used in training: 20 questions per category, half Italian and half English, 3 runs. Search goes only to a local Wikipedia index, so the results don't depend on the web of the day.

  • "the latest X" with no date: it must search first, then answer correctly;
  • false premises (versions, events or URLs that don't exist): it must search and say the thing doesn't exist, without adding facts from memory;
  • every search fails: it must say what failed, not answer from memory and not go round in circles;
  • ambiguous requests in oh-my-pi: it must ask the user with the ask tool.
oh-my-pi opencode Hermes (unseen)
base 0.1 0.2 base 0.1 0.2 base 0.1 0.2
Accuracy 29.2% 36.7% 55.4% 36.1% 47.8% 61.1% 45.0% 51.1% 67.8%
Confident wrong answers 69.2% 57.5% 38.8% 62.8% 48.3% 31.7% 52.2% 46.1% 25.6%
Follows the category's rule 25.0% 33.8% 53.3% 32.8% 45.0% 58.9% 41.1% 46.1% 63.3%
- "the latest X" 35.0% 30.0% 43.3% 38.3% 28.3% 46.7% 38.3% 36.7% 50.0%
- false premises 50.0% 58.3% 70.0% 48.3% 56.7% 60.0% 65.0% 65.0% 76.7%
- every search fails 15.0% 45.0% 68.3% 11.7% 50.0% 70.0% 20.0% 36.7% 63.3%
- ambiguous requests (ask) 0.0% 1.7% 31.7%
Asks the user with ask 1.7% 3.3% 45.0%
Loops / timeouts 22.9% 9.2% 12.5% 32.2% 10.0% 10.6% 23.9% 7.8% 14.4% (worse)

Recovery after a failed search (rate limit or timeout, failure types never seen in training; 60 questions, 48 in Hermes, 1 run), Fonzie0.1 โ†’ Fonzie0.2:

oh-my-pi opencode Hermes
Tries again after the failure 24% โ†’ 60% 74% โ†’ 95% 72% โ†’ 91%
Then finds results 16% โ†’ 38% 41% โ†’ 68% 69% โ†’ 85%
Confident wrong answers 55.0% โ†’ 38.3% 38.3% โ†’ 30.0% 39.6% โ†’ 22.9%

The 130 test questions of Fonzie0.1 (94 for Hermes, text only), 3 runs, Fonzie0.1 โ†’ Fonzie0.2:

oh-my-pi opencode Hermes
Searches when it doesn't know 83.9% โ†’ 92.2% 83.9% โ†’ 93.3% 85.4% โ†’ 95.1%
Searches when it doesn't need to 27.6% โ†’ 31.0% 32.4% โ†’ 40.5% 26.1% โ†’ 29.7%
Accuracy 63.3% โ†’ 65.5% 65.0% โ†’ 66.7% 73.2% โ†’ 76.4%
Confident wrong answers 27.4% โ†’ 24.0% 27.1% โ†’ 24.3% 22.8% โ†’ 18.7%
Loops / timeouts 7.9% โ†’ 9.5% 4.9% โ†’ 5.9% 5.3% โ†’ 5.7%
Links not returned by a tool 4.1% โ†’ 5.9% 1.8% โ†’ 4.6% (worse) 0.7% โ†’ 2.8%
Answers in the user's language 95.3% โ†’ 97.7% 95.1% โ†’ 96.9% 98.9% โ†’ 99.6%

On our own agent format (250 frozen questions, 2 runs) it is slightly better than Fonzie0.1 on every metric, none significant: accuracy 66.5% vs 64.8%, confident wrong answers 24.6% vs 25.9%, loops 4.0% vs 5.6%, right language 99.4% vs 98.7%.

What it does not do (yet)

  • It writes more links that no tool returned: 4.6% of answers in opencode, against 1.8% for Fonzie0.1. In Hermes, after a failed search, 12.5% against 2.1% (48 questions, not significant).
  • More loops in Hermes on the new tests: 14.4% against 7.8%.
  • It searches a bit more when it doesn't need to (+3 to +8 points, not significant).
  • "The latest X" still fails about half the time, even if it now searches first more often.
  • Accuracy on the 130 questions is about the same as Fonzie0.1, still 1-2 points below the base model's numbers (measured on an older vLLM, 0.24).
  • Photos were not measured separately: identifying specific landmarks and artworks was unreliable in Fonzie0.1, and this version has only 35 new "recognize, then verify" conversations.
  • Outside an agent context (plain chat, no system prompt, no tools) it falls back to the base model's long thinking, like Fonzie0.1.

How to use it

It expects an agent harness that gives it a web search tool. To reproduce the training setup in opencode, serve it with vLLM and add a search MCP server.

vllm serve devopsfortunato/Fonzie0.2-4B --served-model-name fonzie --max-model-len 65536 \
  --enable-auto-tool-choice --tool-call-parser qwen3_coder --reasoning-parser qwen3

Sampling used in all evaluations: temperature 1.0, top_p 0.95, top_k 20 (also in generation_config.json).

The LoRA adapter alone (rank 16, on top of unsloth/Qwen3.5-4B) is in lora/.

How it was made

Data: 1,788 conversations, 68% in Italian, 344 with a picture:

  • the 1,390 of Fonzie0.1 without two sources removed for the license (no_robots and evol-instruct-italian, 89 conversations): 1,301;
  • 487 new conversations, written for the failures of Fonzie0.1:
    • 170 recoveries: the first search fails with the apps' real error messages, and the next turn says what failed and searches again;
    • 141 "the latest X" with no date, where searching is the first step;
    • 36 false premises;
    • 52 oh-my-pi conversations that use the ask tool;
    • 35 photos, "recognize, then verify with a search";
    • 53 general requests from Aya and oasst2, replacing the removed sources.
  • Formats: oh-my-pi 678, opencode 537, plain agent format 573.
  • Decisions: 38% answer directly, 52% search, 10% search and fail.
  • Answers are capped at 100 words, except tasks and math.

Teachers, all run locally on a DGX Spark:

  • GLM-5.3-Flash (text, the Fonzie0.1 data);
  • Qwen3.8 Flash Next (the new data, text and pictures).

Filters: every conversation passed code checks before an LLM judge (Grok 4.7) looked at it:

  • the answer matches the reference;
  • no answer or guessed names in the search query;
  • every link comes from a tool result;
  • right language;
  • short reasoning;
  • no repeated identical calls.

The judge was checked by hand on 15 conversations (15 agreements out of 15). Answers rejected for details without a source were rewritten without those details, then judged again. A report checked that no sentence appears in more than 5 answers and that no test question is in the training data.

Training: the same recipe as Fonzie0.1. LoRA rank 16 on the language layers (vision encoder frozen), bf16, learning rate 1e-4, 1 epoch, up to 24,576 tokens, with Unsloth. Training took about 2.5 hours on an NVIDIA DGX Spark. No RL.

Credits

  • Javi0.2-4B and Javi0.3 by Javier (@javierbits): this project follows their approach (test in the real harness, check with code, fix failures with data) and many of their lessons. The new tests of this version come from ideas in Javi0.3.
  • Qwen for the base model and the Qwen3.8 teacher, Z.ai for the GLM-5.3-Flash teacher, Unsloth for training, and llama.cpp for the GGUF files.
  • Questions from:
    • MKQA (Apple, CC BY 3.0);
    • TriviaQA;
    • HotpotQA (CC BY-SA 4.0);
    • Wikipedia and Wikidata (CC BY-SA, CC0);
    • Wikimedia Commons images;
    • ChartQA (GPL-3.0);
    • DocVQA (MIT);
    • gsm8k_italian (Sapienza NLP, MIT);
    • Aya (Cohere, Apache 2.0);
    • oasst2 (OpenAssistant, Apache 2.0).

License

Apache 2.0, like the base model Qwen3.5-4B. The training data is not redistributed. The teachers' licenses (GLM-5.3-Flash: MIT; Qwen3.8 Flash Next: Qwen license) put no limits on their outputs.

Author: Alfonso Fortunato.

Downloads last month
-
Safetensors
Model size
5B params
Tensor type
BF16
ยท
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for devopsfortunato/Fonzie0.2-4B

Finetuned
Qwen/Qwen3.5-4B
Adapter
(977)
this model