The model-name detector treated every Qwen model as a Qwen3, falling
into the qwen3_xml parser:
if (n.includes('qwen3') && n.includes('coder')) return 'qwen3_coder';
if (n.includes('qwen')) return 'qwen3_xml'; // catches qwen2.5 too
qwen3_xml is the parser for Qwen3 reasoning/instruct models. Qwen2.5
(and Qwen2, Qwen1.5) ship with hermes-style tool calling, so the
qwen3_xml parser never recognises their tool calls — they leak through
as plain text in the assistant reply and the agent silently fails to
execute anything.
Reproduces with:
vllm serve Qwen/Qwen2.5-Coder-14B-Instruct-AWQ ... \
--enable-auto-tool-choice --tool-call-parser qwen3_xml
→ ask the agent to call any tool → JSON shows up in chat, no call runs.
Fix the ordering:
qwen3 + coder → qwen3_coder
qwen3 → qwen3_xml
qwen → hermes (Qwen2.5 / Qwen2 / Qwen1.5)
Verified against the model matrix:
Qwen2.5-Coder-14B-Instruct-AWQ → hermes
Qwen2.5-7B-Instruct → hermes
Qwen3-8B → qwen3_xml
Qwen3-32B → qwen3_xml
Qwen3-Coder-30B-A3B → qwen3_coder
Qwen2-72B-Instruct → hermes
Qwen1.5-7B-Chat → hermes