9#include <llama/llama.h>
10#include <json-schema-to-grammar.h>
12#include <nlohmann/json.hpp>
50 "[grammar::from_json_schema] Converting JSON schema (%zu bytes)",
55 common_json schema = common_json::parse(schema_json);
58 "json_schema_to_grammar");
63 std::string grammar = json_schema_to_grammar(schema,
false);
65 if (grammar.empty()) {
68 throw std::runtime_error(
"Grammar conversion produced empty result");
72 "[grammar::from_json_schema] Generated GBNF grammar (%zu bytes)",
76 }
catch (
const common_json_error &e) {
77 std::string errorMsg = std::string(
"JSON parse error: ") + e.what();
79 throw std::runtime_error(errorMsg);
80 }
catch (
const std::exception &e) {
81 std::string errorMsg =
82 std::string(
"Grammar conversion failed: ") + e.what();
84 throw std::runtime_error(errorMsg);
109 const std::string &grammar_str,
110 const std::string &root_rule =
"root") {
116 if (grammar_str.empty()) {
128 "(grammar: %zu bytes, root: %s)",
129 grammar_str.size(), root_rule.c_str());
131 llama_sampler *sampler =
132 llama_sampler_init_grammar(vocab, grammar_str.c_str(), root_rule.c_str());
136 "llama_sampler_init_grammar returned null");
160 const llama_model *model,
161 const std::string &grammar_str,
162 const std::vector<std::string> &trigger_patterns,
163 const std::vector<llama_token> &trigger_tokens,
164 const std::string &root_rule =
"root") {
170 if (grammar_str.empty()) {
171 LLOYAL_LOG_DEBUG(
"[grammar::init_lazy_sampler] ERROR: grammar_str is empty");
177 LLOYAL_LOG_DEBUG(
"[grammar::init_lazy_sampler] ERROR: get_vocab returned null");
181 std::vector<const char *> patterns_c;
182 patterns_c.reserve(trigger_patterns.size());
183 for (
const auto &p : trigger_patterns) patterns_c.push_back(p.c_str());
186 "(grammar: %zu bytes, %zu patterns, %zu tokens, root: %s)",
187 grammar_str.size(), trigger_patterns.size(),
188 trigger_tokens.size(), root_rule.c_str());
190 llama_sampler *sampler = llama_sampler_init_grammar_lazy_patterns(
191 vocab, grammar_str.c_str(), root_rule.c_str(),
192 patterns_c.data(), patterns_c.size(),
193 trigger_tokens.data(), trigger_tokens.size());
197 "llama_sampler_init_grammar_lazy_patterns returned null");
220 llama_sampler *cloned = llama_sampler_clone(smpl);
223 LLOYAL_LOG_DEBUG(
"[grammar::clone_sampler] ERROR: llama_sampler_clone failed");
238 llama_sampler_free(smpl);
250inline void apply(llama_sampler* smpl, llama_token_data_array* cur_p) {
252 llama_sampler_apply(smpl, cur_p);
264inline void accept(llama_sampler* smpl, llama_token token) {
266 llama_sampler_accept(smpl, token);
#define LLOYAL_LOG_DEBUG(...)
liblloyal - Common definitions and logging
void free_sampler(llama_sampler *smpl)
Free a grammar sampler.
llama_sampler * clone_sampler(llama_sampler *smpl)
Clone a grammar sampler (for fork/branching).
llama_sampler * init_sampler(const llama_model *model, const std::string &grammar_str, const std::string &root_rule="root")
Initialize a grammar sampler from GBNF grammar string.
llama_sampler * init_lazy_sampler(const llama_model *model, const std::string &grammar_str, const std::vector< std::string > &trigger_patterns, const std::vector< llama_token > &trigger_tokens, const std::string &root_rule="root")
Initialize a lazy grammar sampler from GBNF grammar string.
std::string from_json_schema(const std::string &schema_json)
Convert JSON schema to GBNF (Grammar BNF) format.
void accept(llama_sampler *smpl, llama_token token)
Accept a token into grammar state.
void apply(llama_sampler *smpl, llama_token_data_array *cur_p)
Apply grammar constraint to candidates.
const llama_vocab * get_vocab(const llama_model *model)
Get vocabulary from model.
Text Tokenization Operations.