28#include <unordered_map>
50void add_grammar_sampler(llama_sampler* chain,
51 const llama_vocab* vocab,
52 const std::string& grammar) {
53 if (grammar.empty()) {
return; }
54 llama_sampler* g = llama_sampler_init_grammar(
55 vocab, grammar.c_str(),
"root");
57 llama_sampler_chain_add(chain, g);
61 logger->info(
"Grammar sampler attached ({} bytes)", grammar.size());
63 logger->error(
"Grammar sampler init FAILED for root rule — output "
64 "will be UNCONSTRAINED. Grammar ({} bytes): {}",
65 grammar.size(), grammar);
79void add_logit_bias_sampler(llama_sampler* chain,
80 const llama_vocab* vocab,
81 const std::unordered_map<int32_t, float>& biases) {
82 if (biases.empty()) {
return; }
83 std::vector<llama_logit_bias> entries;
84 entries.reserve(biases.size());
85 for (
auto& [tok, val] : biases) {
86 entries.push_back({tok, val});
88 llama_sampler_chain_add(chain,
89 llama_sampler_init_logit_bias(
90 llama_vocab_n_tokens(vocab),
91 static_cast<int32_t
>(entries.size()),
105uint32_t resolve_dist_seed(
int caller_seed) {
106 return caller_seed < 0
108 :
static_cast<uint32_t
>(caller_seed);
121 : chain_(chain), ctx_(ctx) {}
130 llama_sampler_free(chain_);
142 if (chain_ ==
nullptr || ctx_ ==
nullptr) {
return -1; }
143 return llama_sampler_sample(chain_, ctx_, -1);
152 if (chain_ !=
nullptr) {
153 llama_sampler_reset(chain_);
165 llama_context* ctx,
const llama_vocab* vocab)
166 : ctx_(ctx), vocab_(vocab) {}
182 llama_sampler_chain_params chain_params =
183 llama_sampler_chain_default_params();
184 llama_sampler* chain = llama_sampler_chain_init(chain_params);
186 add_grammar_sampler(chain, vocab_, params.
grammar);
187 add_logit_bias_sampler(chain, vocab_, params.
logit_bias);
197 llama_sampler_chain_add(chain,
198 llama_sampler_init_penalties(
204 llama_sampler_chain_add(chain,
207 if (params.
top_k > 0) {
208 llama_sampler_chain_add(chain,
209 llama_sampler_init_top_k(params.
top_k));
211 if (params.
top_p < 1.0f) {
212 llama_sampler_chain_add(chain,
213 llama_sampler_init_top_p(params.
top_p, 1));
216 if (params.
min_p > 0.0f) {
217 llama_sampler_chain_add(chain,
218 llama_sampler_init_min_p(params.
min_p, 1));
221 llama_sampler_chain_add(chain,
222 llama_sampler_init_dist(resolve_dist_seed(params.
seed)));
224 return std::make_unique<LlamaCppSampler>(chain, ctx_);
LlamaCppSamplerFactory(llama_context *ctx, const llama_vocab *vocab)
Construct with borrowed context + vocab pointers.
std::unique_ptr< Sampler > create(const GenerationParams ¶ms) override
Build the v2.3.10 sampler chain from GenerationParams.
~LlamaCppSampler() override
Free the underlying llama.cpp sampler chain.
LlamaCppSampler(llama_sampler *chain, llama_context *ctx)
Construct with an already-built llama_sampler chain.
int32_t sample() override
Sample one token from the current logits via the wrapped chain.
void reset() override
Reset llama_sampler internal state.
Concrete llama.cpp Sampler + SamplerFactory (v2.3.10 seam impl).
spdlog initialization and logger access.
ENTROPIC_EXPORT std::shared_ptr< spdlog::logger > get(const std::string &name)
Get or create a named logger.
Activate model on GPU (WARM → ACTIVE).
Generation parameters for a single inference call.
std::string grammar
GBNF grammar string (empty = unconstrained)
std::unordered_map< int32_t, float > logit_bias
Per-token logit bias map (gh#23 MVP item 4).
float repeat_penalty
Repetition penalty.
float temperature
Sampling temperature.
float frequency_penalty
Frequency-penalty term in llama.cpp's penalties sampler (gh#23 MVP item 3).
float presence_penalty
Presence-penalty term in llama.cpp's penalties sampler (gh#23 MVP item 2).
float min_p
Min-p nucleus sampling threshold (gh#23 MVP item 1).
float top_p
Nucleus sampling threshold.
int seed
RNG seed for reproducible sampling.