CanIToolCall caniuse.com for tool calling

Mistral / Magistral / Ministral / Devstral ([TOOL_CALLS]) on ollama 7af39318

pass 100% strict pass 14 pass · 33 unsupported

Run

Engine
ollama 7af39318 (7af393188defd52d370464de0d2064649cab9b41)
Run
to
Platform
linux-x86_64, Python 3.12.3, canitoolcall 0.1.0.dev0
Strategies
one, special, token, rand:1:8, rand:2:8, rand:3:8, rand:4:8, rand:5:8 (normalization soft-v1); not counted for this engine: one, special, rand:1:8, rand:2:8, rand:3:8, rand:4:8, rand:5:8
Fixtures digest
a1e7b55367e195e8aa6e2ef746b2cc141b44f37caad0887ff8f30b104616f836 the fixture corpus used for this site matches the run
Engine details
{
  "go_version": "go1.26.0",
  "llama_cpp_build": "b11081",
  "llama_cpp_commit": "161755f",
  "pinned_version": "7af393188defd52d370464de0d2064649cab9b41",
  "runner": "llama-server token rendering (preserved_tokens) + model/parsers via server/routes.go flow",
  "tokens_per_step": "one"
}
Results file
data/ollama-7af39318.json

Checks

Per fixture, the worst result of each check over the non-streaming parse and every realistic chunking strategy.
CheckPassSoft FailErrorStrict pass rate
expected_match 14 0 0 0 100%
stream_equals_nonstream 14 0 0 0 100%
no_leakage 14 0 0 0 100%
arguments_json 13 0 0 0 100%
arguments_schema 13 0 0 0 100%
parallel_order 2 0 0 0 100%

2 fixture(s) failed only a synthetic strategy: char:* (which can split special tokens), or a multi-token strategy this engine never produces because its server streams one token per event (one, special, rand:1:8, rand:2:8, rand:3:8, rand:4:8, rand:5:8). These are listed below but never count toward the status.

Fixtures needing attention

pass mistral/llamacpp-ministral3-marker-in-reasoning

Synthetic strategies (not counted): expected_match@one fail, stream_equals_nonstream@one fail, no_leakage@one fail

Minimal repro

uv run canitoolcall run --engine ollama --fixtures fixtures/mistral/imported.jsonl --id mistral/llamacpp-ministral3-marker-in-reasoning --strategy token --observed all

Set up the engine first with scripts/engines/ollama.sh; this run used ollama 7af39318. The fixture is line 14 of fixtures/mistral/imported.jsonl.

The results file does not include the observed parses for this fixture.

Fixture

Provenance: engine_test, https://github.com/ggml-org/llama.cpp/blob/7fe450e19305b828c199d602c23a8337aaa1f03b/tests/test-chat.cpp#L2649-L2661. Tags: single-call, reasoning, x-marker-in-reasoning, x-v13-compact, x-think-special-token.

Raw output

[THINK]Let me think about [TOOL_CALLS]special_function[ARGS]{"arg1":1} and more[/THINK][TOOL_CALLS]special_function[ARGS]{"arg1": 1}

Expected parse

{
  "content": null,
  "reasoning_content": "Let me think about [TOOL_CALLS]special_function[ARGS]{\"arg1\":1} and more",
  "tool_calls": [
    {
      "arguments": {
        "arg1": 1
      },
      "name": "special_function"
    }
  ]
}
Fixture record (JSONL, ready to vendor into an engine's tests)
{"id": "mistral/llamacpp-ministral3-marker-in-reasoning", "family": "mistral", "models": ["mistralai/Ministral-3-14B-Reasoning-2512"], "spec_version": "0.1", "provenance": {"kind": "engine_test", "source_url": "https://github.com/ggml-org/llama.cpp/blob/7fe450e19305b828c199d602c23a8337aaa1f03b/tests/test-chat.cpp#L2649-L2661", "revision": "7fe450e19305b828c199d602c23a8337aaa1f03b", "license": "MIT", "generator": "scripts/fixtures/mistral/import_mistral.py", "attribution": "Copyright (c) 2023-2026 The ggml authors (MIT)."}, "tools": [{"type": "function", "function": {"name": "special_function", "parameters": {"type": "object", "properties": {"arg1": {"type": "integer", "description": "The arg."}}, "required": ["arg1"]}, "description": "I'm special"}}], "raw_output": "[THINK]Let me think about [TOOL_CALLS]special_function[ARGS]{\"arg1\":1} and more[/THINK][TOOL_CALLS]special_function[ARGS]{\"arg1\": 1}", "output_token_ids": [34, 12598, 1639, 3648, 2314, 1032, 9, 54332, 35214, 32, 19227, 2230, 1049, 2811, 1049, 1125, 1321, 2081, 35, 9, 54332, 35214, 32, 19227, 2230, 1049, 2811, 1032, 1049, 1125], "tokenizer": {"repo": "mistralai/Ministral-3-14B-Reasoning-2512", "revision": "51f9210f3cd20f3452a80d5819d15dc61cc50630", "mode": "mistral"}, "generation_prompt": "[/INST]", "thinking": true, "expected": {"content": null, "reasoning_content": "Let me think about [TOOL_CALLS]special_function[ARGS]{\"arg1\":1} and more", "tool_calls": [{"name": "special_function", "arguments": {"arg1": 1}}]}, "tags": ["single-call", "reasoning", "x-marker-in-reasoning", "x-v13-compact", "x-think-special-token"], "notes": "'fake tool call marker in reasoning'. Here the markers inside [THINK] are control-token ids (as a tokenizer that parses special tokens produces them): everything between [THINK] and [/THINK] is reasoning, and only the call after [/THINK] is a tool call."}
Parser configuration
{
  "chunking": "one llama-server event per token; Add(delta, false) per non-empty group, then Add('', true)",
  "detokenizer": "llama-server common_token_to_piece(special = id in preserved_tokens)",
  "eog_stop": "tokens after the first end-of-generation token are dropped (llama-server stops there)",
  "has_thinking_support": false,
  "legacy_template_parser": false,
  "llama_cpp_build": "b11081",
  "nonstream": "per-token events concatenated (routes.go writeChatResponse)",
  "ollama_commit": "7af393188defd52d370464de0d2064649cab9b41",
  "parser": "ministral",
  "parser_source": "Ollama library model config (registry.ollama.ai, fetched 2026-09-25): ministral-3, devstral-2",
  "preserved_tokens": [
    "[TOOL_CALLS]",
    "[THINK]",
    "[/THINK]",
    "[ARGS]"
  ],
  "think_effective": true,
  "think_requested": true,
  "tool_call_serialization": "openai.ToToolCalls",
  "vocab_gguf": "mistralai--Ministral-3-14B-Reasoning-2512.vocab.gguf",
  "vocab_gguf_converter_llama_cpp_commit": "a25c9865fe03c954c93fd755b5d79ae86ba99750",
  "vocab_gguf_revision": "51f9210f3cd20f3452a80d5819d15dc61cc50630",
  "vocab_gguf_revision_matches_tokenizer": true,
  "vocab_gguf_sha256": "dde7ffb069c74ec4a86cf5a0ed23f6bad5e1e62d7a1936abf8fb6997d614e4dd"
}
pass mistral/llamacpp-ministral3-reasoning-call

Synthetic strategies (not counted): expected_match@one fail, stream_equals_nonstream@one fail, no_leakage@one fail

Minimal repro

uv run canitoolcall run --engine ollama --fixtures fixtures/mistral/imported.jsonl --id mistral/llamacpp-ministral3-reasoning-call --strategy token --observed all

Set up the engine first with scripts/engines/ollama.sh; this run used ollama 7af39318. The fixture is line 12 of fixtures/mistral/imported.jsonl.

The results file does not include the observed parses for this fixture.

Fixture

Provenance: engine_test, https://github.com/ggml-org/llama.cpp/blob/7fe450e19305b828c199d602c23a8337aaa1f03b/tests/test-chat.cpp#L2615-L2622. Tags: single-call, reasoning, numeric-arguments, x-v13-compact, x-think-special-token.

Raw output

[THINK]I'm
thinking[/THINK][TOOL_CALLS]special_function[ARGS]{"arg1":1}

Expected parse

{
  "content": null,
  "reasoning_content": "I'm\nthinking",
  "tool_calls": [
    {
      "arguments": {
        "arg1": 1
      },
      "name": "special_function"
    }
  ]
}
Fixture record (JSONL, ready to vendor into an engine's tests)
{"id": "mistral/llamacpp-ministral3-reasoning-call", "family": "mistral", "models": ["mistralai/Ministral-3-14B-Reasoning-2512"], "spec_version": "0.1", "provenance": {"kind": "engine_test", "source_url": "https://github.com/ggml-org/llama.cpp/blob/7fe450e19305b828c199d602c23a8337aaa1f03b/tests/test-chat.cpp#L2615-L2622", "revision": "7fe450e19305b828c199d602c23a8337aaa1f03b", "license": "MIT", "generator": "scripts/fixtures/mistral/import_mistral.py", "attribution": "Copyright (c) 2023-2026 The ggml authors (MIT)."}, "tools": [{"type": "function", "function": {"name": "special_function", "parameters": {"type": "object", "properties": {"arg1": {"type": "integer", "description": "The arg."}}, "required": ["arg1"]}, "description": "I'm special"}}], "raw_output": "[THINK]I'm\nthinking[/THINK][TOOL_CALLS]special_function[ARGS]{\"arg1\":1}", "output_token_ids": [34, 1073, 4525, 1010, 1411, 34053, 35, 9, 54332, 35214, 32, 19227, 2230, 1049, 2811, 1049, 1125], "tokenizer": {"repo": "mistralai/Ministral-3-14B-Reasoning-2512", "revision": "51f9210f3cd20f3452a80d5819d15dc61cc50630", "mode": "mistral"}, "generation_prompt": "[/INST]", "thinking": true, "expected": {"content": null, "reasoning_content": "I'm\nthinking", "tool_calls": [{"name": "special_function", "arguments": {"arg1": 1}}]}, "tags": ["single-call", "reasoning", "numeric-arguments", "x-v13-compact", "x-think-special-token"]}
Parser configuration
{
  "chunking": "one llama-server event per token; Add(delta, false) per non-empty group, then Add('', true)",
  "detokenizer": "llama-server common_token_to_piece(special = id in preserved_tokens)",
  "eog_stop": "tokens after the first end-of-generation token are dropped (llama-server stops there)",
  "has_thinking_support": false,
  "legacy_template_parser": false,
  "llama_cpp_build": "b11081",
  "nonstream": "per-token events concatenated (routes.go writeChatResponse)",
  "ollama_commit": "7af393188defd52d370464de0d2064649cab9b41",
  "parser": "ministral",
  "parser_source": "Ollama library model config (registry.ollama.ai, fetched 2026-09-25): ministral-3, devstral-2",
  "preserved_tokens": [
    "[TOOL_CALLS]",
    "[THINK]",
    "[/THINK]",
    "[ARGS]"
  ],
  "think_effective": true,
  "think_requested": true,
  "tool_call_serialization": "openai.ToToolCalls",
  "vocab_gguf": "mistralai--Ministral-3-14B-Reasoning-2512.vocab.gguf",
  "vocab_gguf_converter_llama_cpp_commit": "a25c9865fe03c954c93fd755b5d79ae86ba99750",
  "vocab_gguf_revision": "51f9210f3cd20f3452a80d5819d15dc61cc50630",
  "vocab_gguf_revision_matches_tokenizer": true,
  "vocab_gguf_sha256": "dde7ffb069c74ec4a86cf5a0ed23f6bad5e1e62d7a1936abf8fb6997d614e4dd"
}

Unsupported fixtures

The adapter declined these fixtures because this engine version has no parser for the family or model.