]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
llama: fix error on bad grammar (#12628)
authorJohannes Gäßler <redacted>
Fri, 28 Mar 2025 17:08:52 +0000 (18:08 +0100)
committerGitHub <redacted>
Fri, 28 Mar 2025 17:08:52 +0000 (18:08 +0100)
common/sampling.cpp
include/llama.h
src/llama-sampling.cpp

index baf22066dca157b2db6543b614baa7c43e6d3c15..1735b650183c83fffa1e7414e0c7b07da911c0b9 100644 (file)
@@ -208,6 +208,9 @@ struct common_sampler * common_sampler_init(const struct llama_model * model, co
                                                         trigger_patterns_c.data(), trigger_patterns_c.size(),
                                                         trigger_tokens.data(), trigger_tokens.size())
              :      llama_sampler_init_grammar(vocab, params.grammar.c_str(), "root");
+        if (!grmr) {
+            return nullptr;
+        }
     }
 
     auto * result = new common_sampler {
index 25a9f82784df24d7f238b2556fcddc664c492e7a..c66a23709dbf9c5e8d9e485d9d8bf1cc0d78c08c 100644 (file)
@@ -1265,6 +1265,10 @@ extern "C" {
                                float   tau,
                                float   eta);
 
+    /// @details Intializes a GBNF grammar, see grammars/README.md for details.
+    /// @param vocab The vocabulary that this grammar will be used with.
+    /// @param grammar_str The production rules for the grammar, encoded as a string. Returns an empty grammar if empty. Returns NULL if parsing of grammar_str fails.
+    /// @param grammar_root The name of the start symbol for the grammar.
     LLAMA_API struct llama_sampler * llama_sampler_init_grammar(
             const struct llama_vocab * vocab,
                           const char * grammar_str,
index c25977ca3a35c9879af75a6aabdd6bf92e3e1c50..d14979850285dbebe5320fb119d7e7736b16c11a 100644 (file)
@@ -1477,6 +1477,7 @@ static struct llama_sampler * llama_sampler_grammar_clone(const struct llama_sam
     const auto * ctx = (const llama_sampler_grammar *) smpl->ctx;
 
     auto * result = llama_sampler_init_grammar_impl(ctx->vocab, nullptr, nullptr, false, nullptr, 0, nullptr, 0, nullptr, 0);
+    GGML_ASSERT(result);
 
     // copy the state
     {
@@ -1548,6 +1549,10 @@ static struct llama_sampler * llama_sampler_init_grammar_impl(
             /* .grammar_root = */ grammar_root,
             /* .grammar      = */ llama_grammar_init_impl(vocab, grammar_str, grammar_root, lazy, trigger_patterns, num_trigger_patterns, trigger_tokens, num_trigger_tokens),
         };
+        if (!ctx->grammar) {
+            delete ctx;
+            return nullptr;
+        }
     } else {
         *ctx = {
             /* .vocab        = */ vocab,