From 2add439e435b41170b3a2c6e70bd4f8b27d2c821 Mon Sep 17 00:00:00 2001 From: firecoperana <18252262+firecoperana@users.noreply.github.com> Date: Thu, 5 Mar 2026 00:54:41 -0600 Subject: [PATCH] grammar: fix trigger pattern init error (#1365) Co-authored-by: firecoperana --- common/sampling.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/common/sampling.cpp b/common/sampling.cpp index 8d6c9a1a..a842d2b8 100644 --- a/common/sampling.cpp +++ b/common/sampling.cpp @@ -25,24 +25,30 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, co } else { std::vector trigger_patterns; - std::vector patterns_anywhere; std::vector trigger_tokens; - for (const auto& trigger : params.grammar_triggers) { + for (const auto & trigger : params.grammar_triggers) { switch (trigger.type) { case COMMON_GRAMMAR_TRIGGER_TYPE_WORD: { - const auto& word = trigger.value; - patterns_anywhere.push_back(regex_escape(word)); + const auto & word = trigger.value; + trigger_patterns.push_back(regex_escape(word)); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN: { - patterns_anywhere.push_back(trigger.value); + trigger_patterns.push_back(trigger.value); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL: { - trigger_patterns.push_back(trigger.value); + const auto & pattern = trigger.value; + std::string anchored = "^$"; + if (!pattern.empty()) { + anchored = (pattern.front() != '^' ? "^" : "") + + pattern + + (pattern.back() != '$' ? "$" : ""); + } + trigger_patterns.push_back(anchored); break; } case COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN: @@ -56,15 +62,12 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, co } } - if (!patterns_anywhere.empty()) { - trigger_patterns.push_back("^[\\s\\S]*?(" + string_join(patterns_anywhere, "|") + ")[\\s\\S]*"); - } - - std::vector trigger_patterns_c; + std::vector trigger_patterns_c; trigger_patterns_c.reserve(trigger_patterns.size()); - for (const auto& regex : trigger_patterns) { + for (const auto & regex : trigger_patterns) { trigger_patterns_c.push_back(regex.c_str()); } + grmr = params.grammar_lazy ? llama_sampler_init_grammar_lazy_patterns(vocab, params.grammar.c_str(), "root", trigger_patterns_c.data(), trigger_patterns_c.size(),