Local Agent Bench

← Leaderboard

Tool mode study

Some models have no native tool-calling in Ollama, so the main suite can't measure them fairly. This side study asks a different question: how well do they pick tools when the tools are described in the prompt, or when a grammar forces valid tool-call JSON?

Headline: a model Ollama can't use for tools works as an agent with grammar-forced output.

phi4:14b has no native tool support in Ollama, so it scores 0 on tool use in the main suite. Loaded in llama.cpp with every turn constrained by a JSON grammar, the same Q4_K_M file scored 100 tool selection, 96 multi-step, 76.67 error recovery and 100 injection resistance (3 trials). This uses a separate runner and agent loop (llama.cpp, not Ollama with Hermes Agent), so it is not comparable with the main ranking. Details

Not part of the main ranking.

Tool mode is its own dimension, like the VRAM tiers. There is no combined score and no rank here, and these numbers are not comparable with the leaderboard: level 1 is single-turn only, and level 3 uses llama.cpp with a reference agent loop instead of Ollama with Hermes Agent.

Modes

Native vs emulated tool calling (level 2)

Eight models from the main leaderboard, each run twice on the same 60 items (25 tool selection, first step of 25 multi-step tasks, 10 error-recovery tasks), same Ollama 0.40.6, same Q4_K_M GGUF, same RTX 3090, 3 trials, temp 0, seed 42, ctx 8192. Native: tools passed through Ollama's tools parameter and the first returned tool call is scored. Emulated: no tools parameter; the tools are described in the system prompt and the model replies with {"tool", "args"} (the text-only mode). Single-turn only, so this is not the main suite's multi-step score and no number here feeds the ranking.

ModelModeTool correctArgs validArg matchTool itemsMulti-step 1st callRecoveryWell-formed callp50 s
gemma4:e4b
Fits in 8 GB VRAM
native9595931009680952.4
emulated100100971001001001000.5
qwen3:8b
Fits in 8 GB VRAM
native9392901008890932.5
emulated9291901008880921.9

All columns are % of item-trials. "Well-formed call": native = the reply contained a tool call; emulated = the reply contained a parseable JSON object. Runs: 20261023-L2-gemma4-e4b-65f554 20261023-L1-gemma4-e4b-05718c 20261023-L2-qwen3-8b-99c854 20261023-L1-qwen3-8b-c54073

Level 2 in progress: 6 of 8 models not yet complete.

Levels 1 and 3: models without native tool support

gemma3:4b

Tool modeEngineTool correctArgs validArg matchMulti-stepRecoveryInjection resisttok/sn
native No native tool supportollama 0.40.60——0—n/a—100
text-onlyollama 0.40.610010097—1——69.060
grammarllama.cpp 643b0cdacno result*——

* grammar: llama.cpp rejected every grammar-constrained request for this model's chat template (HTTP 400, "Failed to initialize samplers"), so no level-3 result was measured. This is likely a llama.cpp issue with this model's chat template combined with grammar-constrained sampling rather than a model failure (the text-only row shows the model can pick tools). Starting llama-server with --jinja may avoid it; that workaround is untested.

Runs: 20261023-L1-gemma3-4b-42e502 · 20261023-L3-gemma3-4b-259a7a · RTX 3090 · 3 trials, temp 0, seed 42, ctx 8192.

phi4:14b

Tool modeEngineTool correctArgs validArg matchMulti-stepRecoveryInjection resisttok/sn
native No native tool supportollama 0.40.60——0—n/a—100
text-onlyollama 0.40.610010097—1——57.160
grammarllama.cpp 643b0cdac100—2—2967710071.6100

Runs: 20261023-L1-phi4-14b-a66198 · 20261023-L3-phi4-14b-a9438c · RTX 3090 · 3 trials, temp 0, seed 42, ctx 8192.

1 Text-only is single-turn: it only checks the first tool call of each multi-step task (counted in "Tool correct"), so there is no full multi-step score. Text-only replies were also never strict JSON (both models wrapped answers in code fences despite the instruction), but every reply parsed leniently.

2 Not measured: the level 3 (grammar) harness scores tool selection, multi-step success, recovery and injection per task, but does not record argument validity or argument match.

See also the Methodology.