28#include <unordered_map>
53void add_grammar_sampler(llama_sampler* chain,
54 const llama_vocab* vocab,
55 const std::string& grammar) {
56 if (grammar.empty()) {
return; }
57 llama_sampler* g = llama_sampler_init_grammar(
58 vocab, grammar.c_str(),
"root");
60 llama_sampler_chain_add(chain, g);
64 logger->info(
"Grammar sampler attached ({} bytes)", grammar.size());
66 logger->error(
"Grammar sampler init FAILED for root rule — output "
67 "will be UNCONSTRAINED. Grammar ({} bytes): {}",
68 grammar.size(), grammar);
82void add_logit_bias_sampler(llama_sampler* chain,
83 const llama_vocab* vocab,
84 const std::unordered_map<int32_t, float>& biases) {
85 if (biases.empty()) {
return; }
86 std::vector<llama_logit_bias> entries;
87 entries.reserve(biases.size());
88 for (
auto& [tok, val] : biases) {
89 entries.push_back({tok, val});
91 llama_sampler_chain_add(chain,
92 llama_sampler_init_logit_bias(
93 llama_vocab_n_tokens(vocab),
94 static_cast<int32_t
>(entries.size()),
108uint32_t resolve_dist_seed(
int caller_seed) {
109 return caller_seed < 0
111 :
static_cast<uint32_t
>(caller_seed);
124 : chain_(chain), ctx_(ctx) {}
133 llama_sampler_free(chain_);
145 if (chain_ ==
nullptr || ctx_ ==
nullptr) {
return -1; }
146 return llama_sampler_sample(chain_, ctx_, -1);
155 if (chain_ !=
nullptr) {
156 llama_sampler_reset(chain_);
168 llama_context* ctx,
const llama_vocab* vocab)
169 : ctx_(ctx), vocab_(vocab) {}
187 llama_sampler_chain_params chain_params =
188 llama_sampler_chain_default_params();
189 llama_sampler* chain = llama_sampler_chain_init(chain_params);
191 add_grammar_sampler(chain, vocab_, params.
grammar);
192 add_logit_bias_sampler(chain, vocab_, params.
logit_bias);
202 llama_sampler_chain_add(chain,
203 llama_sampler_init_penalties(
209 llama_sampler_chain_add(chain,
212 if (params.
top_k > 0) {
213 llama_sampler_chain_add(chain,
214 llama_sampler_init_top_k(params.
top_k));
216 if (params.
top_p < 1.0f) {
217 llama_sampler_chain_add(chain,
218 llama_sampler_init_top_p(params.
top_p, 1));
221 if (params.
min_p > 0.0f) {
222 llama_sampler_chain_add(chain,
223 llama_sampler_init_min_p(params.
min_p, 1));
226 llama_sampler_chain_add(chain,
227 llama_sampler_init_dist(resolve_dist_seed(params.
seed)));
229 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.