From ba360efe1f574ebae727aad64112d18ecedca85a Mon Sep 17 00:00:00 2001 From: Aldehir Rojas Date: Tue, 11 Aug 2026 10:58:54 -0500 Subject: [PATCH] chat : tighten bare function parsing for Qwen models (#26793) --- common/chat.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/common/chat.cpp b/common/chat.cpp index 6cbf23b505..01053ddde8 100644 --- a/common/chat.cpp +++ b/common/chat.cpp @@ -1166,6 +1166,16 @@ static common_chat_params common_chat_params_init_qwen3_coder(const common_chat_ data.prompt += data.generation_prompt; } + std::vector tool_call_starts = { "" }; + + // Match complete opener for Qwen3-Coder models that occasionally omit the + // starting . The model may hallucinate a tool name, but it is preferable over + // constraining on + foreach_function(inputs.tools, [&](const json & tool) { + const std::string name = tool.at("function").at("name"); + tool_call_starts.push_back(""); + }); + auto parser = build_chat_peg_parser([&](common_chat_peg_builder & p) { auto generation_prompt = p.literal(GEN_PREFIX); @@ -1238,7 +1248,7 @@ static common_chat_params common_chat_params_init_qwen3_coder(const common_chat_ auto tool_calls = p.trigger_rule("tool-call-root", p.repeat(calls, min_calls, 1)); return generation_prompt + - (reasoning << p.content(p.until_one_of({ "", "" }, - // Trigger on "