From c6c4f7c41f2ebb8db91db3193244be7cecb1515e Mon Sep 17 00:00:00 2001 From: ExtReMLapin <3909752+ExtReMLapin@users.noreply.github.com> Date: Mon, 11 Aug 2025 18:21:59 +0200 Subject: [PATCH] Update chat.cpp to support (at least) qwen3 + tool_choice = required --- common/chat.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/common/chat.cpp b/common/chat.cpp index b1a1218ca2..7ac3686e12 100644 --- a/common/chat.cpp +++ b/common/chat.cpp @@ -1586,8 +1586,9 @@ static common_chat_params common_chat_params_init_hermes_2_pro(const common_chat } if (!inputs.tools.is_null()) { + auto supports_thinking = tmpl.source().find("") != std::string::npos && data.thinking_forced_open == false; // (content)?({"name": "foo", "arguments": {"a": 1}})* - data.grammar_lazy = inputs.tool_choice != COMMON_CHAT_TOOL_CHOICE_REQUIRED; + data.grammar_lazy = inputs.tool_choice != COMMON_CHAT_TOOL_CHOICE_REQUIRED || supports_thinking; data.grammar = build_grammar([&](const common_grammar_builder & builder) { std::vector tool_rules; std::vector tool_call_alts; @@ -1639,9 +1640,19 @@ static common_chat_params common_chat_params_init_hermes_2_pro(const common_chat tool_call_alts.push_back( "( \"```\\n\" | \"```json\\n\" | \"```xml\\n\" ) space " + wrappable_tool_call + " space \"```\" space "); auto tool_call = builder.add_rule("tool_call", string_join(tool_call_alts, " | ")); - builder.add_rule("root", + if (supports_thinking) + { + builder.add_rule("thinking", "\"\" [^\\x00]* \"\" space"); + builder.add_rule("root", + "(thinking)? space " + + (inputs.parallel_tool_calls ? "(" + tool_call + ")+" : tool_call)); + } + else + { + builder.add_rule("root", std::string(data.thinking_forced_open ? "( \"\" space )? " : "") + (inputs.parallel_tool_calls ? "(" + tool_call + ")+" : tool_call)); + } // Trigger on some common known "good bad" outputs (only from the start and with a json that's about a specific argument name to avoid false positives) data.grammar_triggers.push_back({ COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL,