What
Our tool-call parser surface is the healthy axis of the recipe audit — 40
registered names covering 82 of 90 --tool-call-parser uses (91%) across the
157 official recipes. This issue closes the gap against upstream.
Corrected against the registries (2026-08-13)
An earlier revision of this issue listed six names from recipe usage alone,
without diffing the two registries. Doing that diff changes the answer.
Upstream vllm/tool_parsers/__init__.py at the pin 5559679 registers 43
names; our factory (src/vllm/entrypoints/openai/tool_parsers/abstract.cpp)
registers 40. Exactly five are upstream-only:
| Name |
Recipe uses |
Note |
openai |
2 |
gpt-oss-120b / -20b |
inkling |
2 |
Inkling, Inkling-Small |
minimax_m3 |
1 |
MiniMax-M3 |
cohere_command3 |
0 |
not found by the recipe sweep — a real mirror gap the audit could not see |
cohere_command4 |
0 |
same |
And three names the recipes DO reference are in neither registry, so they are
post-pin and land with the next pin advance — not portable now:
nemotron_json (1 use), kimi_k3 (1), ling3 (1).
The earlier revision put nemotron_json in the portable group. It is not in
upstream at the pin, and it is not in ours; nothing in either registry mentions
nemotron at all.
Two lessons this correction carries: recipe demand is not a registry, and a gap
list built from usage misses everything users have not asked for yet — which is
how cohere_command3/4 stayed invisible.
Blocker: the row understates what already exists
TOOLS-PARSER-BREADTH reads:
Qwen-Coder XML, Mistral, pythonic, and remaining parsers · Our code: - ·
Our tests/evidence: - · INVENTORIED
All three parsers it names by title are implemented — qwen3_coder, mistral
and pythonic are all in the factory, alongside 37 others. The row records none
of it.
This is the same shape SAMPLE-REASONING carried before its W0 spike ("the seam
shipped under da933828 but this row was never advanced"). The row must be
backfilled to reality before it can be advanced, or the change will look like it
delivers 40 parsers when it delivers five.
Scope
- W0 — backfill
TOOLS-PARSER-BREADTH to the landed surface: 40 registered
names, the factory and autodetect anchors, and the existing tests. State moves
off INVENTORIED to what the evidence backs. Write the planned
specs/tool-parser-breadth.md, which does not exist yet.
- W1 — the three with recipe demand:
openai, inkling, minimax_m3.
- W2 — complete the mirror:
cohere_command3, cohere_command4.
- Deferred, recorded here so they are not rediscovered:
nemotron_json,
kimi_k3, ling3 at the next pin advance.
Each parser is a direct text port with its upstream test ported and the upstream
revision anchor recorded, registered in abstract.cpp, added to the detect.cpp
marker table only where the family has a template-stable literal (read that file's
ORDER MATTERS comment first), with the name count in docs/USAGE.md:878 updated
in the same change.
Found while auditing recipes.vllm.ai coverage.
What
Our tool-call parser surface is the healthy axis of the recipe audit — 40
registered names covering 82 of 90
--tool-call-parseruses (91%) across the157 official recipes. This issue closes the gap against upstream.
Corrected against the registries (2026-08-13)
An earlier revision of this issue listed six names from recipe usage alone,
without diffing the two registries. Doing that diff changes the answer.
Upstream
vllm/tool_parsers/__init__.pyat the pin5559679registers 43names; our factory (
src/vllm/entrypoints/openai/tool_parsers/abstract.cpp)registers 40. Exactly five are upstream-only:
openaiinklingminimax_m3cohere_command3cohere_command4And three names the recipes DO reference are in neither registry, so they are
post-pin and land with the next pin advance — not portable now:
nemotron_json(1 use),kimi_k3(1),ling3(1).The earlier revision put
nemotron_jsonin the portable group. It is not inupstream at the pin, and it is not in ours; nothing in either registry mentions
nemotronat all.Two lessons this correction carries: recipe demand is not a registry, and a gap
list built from usage misses everything users have not asked for yet — which is
how
cohere_command3/4stayed invisible.Blocker: the row understates what already exists
TOOLS-PARSER-BREADTHreads:All three parsers it names by title are implemented —
qwen3_coder,mistraland
pythonicare all in the factory, alongside 37 others. The row records noneof it.
This is the same shape
SAMPLE-REASONINGcarried before its W0 spike ("the seamshipped under
da933828but this row was never advanced"). The row must bebackfilled to reality before it can be advanced, or the change will look like it
delivers 40 parsers when it delivers five.
Scope
TOOLS-PARSER-BREADTHto the landed surface: 40 registerednames, the factory and autodetect anchors, and the existing tests. State moves
off
INVENTORIEDto what the evidence backs. Write the plannedspecs/tool-parser-breadth.md, which does not exist yet.openai,inkling,minimax_m3.cohere_command3,cohere_command4.nemotron_json,kimi_k3,ling3at the next pin advance.Each parser is a direct text port with its upstream test ported and the upstream
revision anchor recorded, registered in
abstract.cpp, added to thedetect.cppmarker table only where the family has a template-stable literal (read that file's
ORDER MATTERS comment first), with the name count in
docs/USAGE.md:878updatedin the same change.
Found while auditing
recipes.vllm.aicoverage.