Skip to content

Commit 5d43b72

Browse files
author
Olivier Chafik
committed
add llama_grammar_trigger_pattern
1 parent e6e9c13 commit 5d43b72

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

src/llama-grammar.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,14 +1050,16 @@ struct llama_grammar * llama_grammar_init_impl(
10501050
} while (true);
10511051

10521052
std::vector<llama_token> vec_trigger_tokens;
1053-
std::vector<std::pair<std::string, std::regex>> vec_trigger_patterns;
1053+
std::vector<llama_grammar_trigger_pattern> vec_trigger_patterns;
10541054
for (size_t i = 0; i < num_trigger_tokens; i++) {
10551055
GGML_ASSERT(trigger_tokens != nullptr);
10561056
vec_trigger_tokens.push_back(trigger_tokens[i]);
10571057
}
10581058
for (size_t i = 0; i < num_trigger_patterns; i++) {
10591059
GGML_ASSERT(trigger_patterns != nullptr);
1060-
vec_trigger_patterns.emplace_back(trigger_patterns[i], trigger_patterns[i]);
1060+
auto & trigger = vec_trigger_patterns.back();
1061+
trigger.pattern = trigger_patterns[i];
1062+
trigger.regex = std::regex(trigger.pattern);
10611063
}
10621064

10631065
// Important: vec_rules has to be moved here, not copied, because stacks contains
@@ -1085,7 +1087,7 @@ void llama_grammar_free_impl(struct llama_grammar * grammar) {
10851087
}
10861088

10871089
struct llama_grammar * llama_grammar_clone_impl(const struct llama_grammar & grammar) {
1088-
llama_grammar * result = new llama_grammar {
1090+
auto * result = new llama_grammar {
10891091
grammar.vocab,
10901092
grammar.rules,
10911093
grammar.stacks,
@@ -1172,8 +1174,8 @@ void llama_grammar_accept_impl(struct llama_grammar & grammar, llama_token token
11721174
grammar.trigger_buffer += piece;
11731175

11741176
std::smatch match;
1175-
for (const auto & [_, regex] : grammar.trigger_patterns) {
1176-
if (std::regex_match(grammar.trigger_buffer, match, regex)) {
1177+
for (const auto & trigger_pattern : grammar.trigger_patterns) {
1178+
if (std::regex_match(grammar.trigger_buffer, match, trigger_pattern.regex)) {
11771179
grammar.awaiting_trigger = false;
11781180
// get from the first match to the end of the string
11791181
auto constrained_str = grammar.trigger_buffer.substr(match.position(1));

src/llama-grammar.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ struct llama_grammar_parser {
106106
void print(FILE * file);
107107
};
108108

109+
struct llama_grammar_trigger_pattern {
110+
std::string pattern;
111+
std::regex regex;
112+
};
113+
109114
struct llama_grammar {
110115
// note: allow null vocab for testing (not great)
111116
const llama_vocab * vocab;
@@ -123,7 +128,7 @@ struct llama_grammar {
123128
bool awaiting_trigger = false; // Initialized to true for lazy grammars only
124129
std::string trigger_buffer; // Output buffered by lazy grammar. Will be cleared once trigger is found.
125130
std::vector<llama_token> trigger_tokens; // Tokens that trigger a lazy grammar, or tokens to force printing of (even if special).
126-
std::vector<std::pair<std::string, std::regex>>
131+
std::vector<llama_grammar_trigger_pattern>
127132
trigger_patterns; // Regular expressions that trigger a lazy grammar. Must be a full match of the entire generated
128133
// string, and the grammar will be given the string from the first match group onwards.
129134

src/llama-sampling.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,8 +1461,8 @@ static void llama_sampler_grammar_reset(struct llama_sampler * smpl) {
14611461

14621462
std::vector<const char *> trigger_patterns_c;
14631463
trigger_patterns_c.reserve(ctx->grammar->trigger_patterns.size());
1464-
for (auto & [pattern, _] : ctx->grammar->trigger_patterns) {
1465-
trigger_patterns_c.push_back(pattern.c_str());
1464+
for (auto & trigger_pattern : ctx->grammar->trigger_patterns) {
1465+
trigger_patterns_c.push_back(trigger_pattern.pattern.c_str());
14661466
}
14671467

14681468
auto * grammar_new = llama_grammar_init_impl(ctx->grammar->vocab, ctx->grammar_str.c_str(), ctx->grammar_root.c_str(),

0 commit comments

Comments
 (0)