Coverage Report

Created: 2026-07-16 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/llama.cpp/common/common.h
Line
Count
Source
1
// Various helper functions and utilities
2
3
#pragma once
4
5
#include "llama-cpp.h"
6
7
#include "ggml-opt.h"
8
#include "ggml.h"
9
10
#include <set>
11
#include <sstream>
12
#include <string>
13
#include <string_view>
14
#include <vector>
15
#include <map>
16
#include <algorithm>
17
#include <fstream>
18
19
#if defined(_WIN32) && !defined(_WIN32_WINNT)
20
#define _WIN32_WINNT 0x0A00
21
#endif
22
23
#ifdef _WIN32
24
#define DIRECTORY_SEPARATOR '\\'
25
#else
26
0
#define DIRECTORY_SEPARATOR '/'
27
#endif // _WIN32
28
29
#define COM_DBG(fmt, ...) LOG_DBG("cmn  %12.*s: " fmt, 12, __func__, __VA_ARGS__)
30
0
#define COM_TRC(fmt, ...) LOG_TRC("cmn  %12.*s: " fmt, 12, __func__, __VA_ARGS__)
31
0
#define COM_INF(fmt, ...) LOG_INF("cmn  %12.*s: " fmt, 12, __func__, __VA_ARGS__)
32
0
#define COM_WRN(fmt, ...) LOG_WRN("cmn  %12.*s: " fmt, 12, __func__, __VA_ARGS__)
33
0
#define COM_ERR(fmt, ...) LOG_ERR("cmn  %12.*s: " fmt, 12, __func__, __VA_ARGS__)
34
#define COM_CNT(fmt, ...) LOG_CNT(""              fmt,               __VA_ARGS__)
35
36
#define die(msg)          do { fputs("error: " msg "\n", stderr);                exit(1); } while (0)
37
#define die_fmt(fmt, ...) do { fprintf(stderr, "error: " fmt "\n", __VA_ARGS__); exit(1); } while (0)
38
39
struct common_time_meas {
40
    common_time_meas(int64_t & t_acc, bool disable = false);
41
    ~common_time_meas();
42
43
    const int64_t t_start_us;
44
45
    int64_t & t_acc;
46
};
47
48
struct common_adapter_lora_info {
49
    std::string path;
50
    float scale;
51
52
    std::string task_name;
53
    std::string prompt_prefix;
54
55
    struct llama_adapter_lora * ptr;
56
};
57
58
using llama_tokens = std::vector<llama_token>;
59
60
struct common_control_vector_load_info;
61
62
//
63
// CPU utils
64
//
65
66
struct common_cpu_params {
67
    int      n_threads                   = -1;
68
    bool     cpumask[GGML_MAX_N_THREADS] = {false}; // CPU affinity mask.
69
    bool     mask_valid                  = false;   // Default: any CPU
70
    enum ggml_sched_priority  priority   = GGML_SCHED_PRIO_NORMAL;  // Scheduling prio : (0 - normal, 1 - medium, 2 - high, 3 - realtime)
71
    bool     strict_cpu                  = false;   // Use strict CPU placement
72
    uint32_t poll                        = 50;      // Polling (busywait) level (0 - no polling, 100 - mostly polling)
73
};
74
75
int32_t common_cpu_get_num_physical_cores();
76
int32_t common_cpu_get_num_math();
77
78
//
79
// Common params
80
//
81
82
enum llama_example {
83
    LLAMA_EXAMPLE_BATCHED,
84
    LLAMA_EXAMPLE_DEBUG,
85
    LLAMA_EXAMPLE_COMMON,
86
    LLAMA_EXAMPLE_SPECULATIVE,
87
    LLAMA_EXAMPLE_COMPLETION,
88
    LLAMA_EXAMPLE_CLI,
89
    LLAMA_EXAMPLE_EMBEDDING,
90
    LLAMA_EXAMPLE_PERPLEXITY,
91
    LLAMA_EXAMPLE_RETRIEVAL,
92
    LLAMA_EXAMPLE_PASSKEY,
93
    LLAMA_EXAMPLE_IMATRIX,
94
    LLAMA_EXAMPLE_BENCH,
95
    LLAMA_EXAMPLE_SERVER,
96
    LLAMA_EXAMPLE_CVECTOR_GENERATOR,
97
    LLAMA_EXAMPLE_EXPORT_LORA,
98
    LLAMA_EXAMPLE_MTMD,
99
    LLAMA_EXAMPLE_LOOKUP,
100
    LLAMA_EXAMPLE_PARALLEL,
101
    LLAMA_EXAMPLE_TTS,
102
    LLAMA_EXAMPLE_DIFFUSION,
103
    LLAMA_EXAMPLE_FINETUNE,
104
    LLAMA_EXAMPLE_FIT_PARAMS,
105
    LLAMA_EXAMPLE_RESULTS,
106
    LLAMA_EXAMPLE_EXPORT_GRAPH_OPS,
107
    LLAMA_EXAMPLE_DOWNLOAD,
108
    LLAMA_EXAMPLE_TOKENIZE,
109
110
    LLAMA_EXAMPLE_COUNT,
111
};
112
113
enum common_sampler_type {
114
    COMMON_SAMPLER_TYPE_NONE        = 0,
115
    COMMON_SAMPLER_TYPE_DRY         = 1,
116
    COMMON_SAMPLER_TYPE_TOP_K       = 2,
117
    COMMON_SAMPLER_TYPE_TOP_P       = 3,
118
    COMMON_SAMPLER_TYPE_MIN_P       = 4,
119
  //COMMON_SAMPLER_TYPE_TFS_Z       = 5,
120
    COMMON_SAMPLER_TYPE_TYPICAL_P   = 6,
121
    COMMON_SAMPLER_TYPE_TEMPERATURE = 7,
122
    COMMON_SAMPLER_TYPE_XTC         = 8,
123
    COMMON_SAMPLER_TYPE_INFILL      = 9,
124
    COMMON_SAMPLER_TYPE_PENALTIES   = 10,
125
    COMMON_SAMPLER_TYPE_TOP_N_SIGMA = 11,
126
    COMMON_SAMPLER_TYPE_ADAPTIVE_P  = 12,
127
};
128
129
// dimensionality reduction methods, used by cvector-generator
130
enum dimre_method {
131
    DIMRE_METHOD_PCA,
132
    DIMRE_METHOD_MEAN,
133
};
134
135
enum common_conversation_mode {
136
    COMMON_CONVERSATION_MODE_DISABLED = 0,
137
    COMMON_CONVERSATION_MODE_ENABLED  = 1,
138
    COMMON_CONVERSATION_MODE_AUTO     = 2,
139
};
140
141
enum common_grammar_trigger_type {
142
    COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN,
143
    COMMON_GRAMMAR_TRIGGER_TYPE_WORD,
144
    COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN,
145
    COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL,
146
};
147
148
struct common_grammar_trigger {
149
    common_grammar_trigger_type type;
150
    std::string value;
151
    llama_token token = LLAMA_TOKEN_NULL;
152
};
153
154
enum common_params_sampling_config : uint64_t {
155
    COMMON_PARAMS_SAMPLING_CONFIG_SAMPLERS        = 1 << 0,
156
    COMMON_PARAMS_SAMPLING_CONFIG_TOP_K           = 1 << 1,
157
    COMMON_PARAMS_SAMPLING_CONFIG_TOP_P           = 1 << 2,
158
    COMMON_PARAMS_SAMPLING_CONFIG_MIN_P           = 1 << 3,
159
    COMMON_PARAMS_SAMPLING_CONFIG_XTC_PROBABILITY = 1 << 4,
160
    COMMON_PARAMS_SAMPLING_CONFIG_XTC_THRESHOLD   = 1 << 5,
161
    COMMON_PARAMS_SAMPLING_CONFIG_TEMP            = 1 << 6,
162
    COMMON_PARAMS_SAMPLING_CONFIG_PENALTY_LAST_N  = 1 << 7,
163
    COMMON_PARAMS_SAMPLING_CONFIG_PENALTY_REPEAT  = 1 << 8,
164
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT        = 1 << 9,
165
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT_TAU    = 1 << 10,
166
    COMMON_PARAMS_SAMPLING_CONFIG_MIROSTAT_ETA    = 1 << 11,
167
};
168
169
enum common_speculative_type {
170
    COMMON_SPECULATIVE_TYPE_NONE,          // no speculative decoding
171
    COMMON_SPECULATIVE_TYPE_DRAFT_SIMPLE,  // standalone draft model speculative decoding
172
    COMMON_SPECULATIVE_TYPE_DRAFT_EAGLE3,  // Eagle3 speculative decoding
173
    COMMON_SPECULATIVE_TYPE_DRAFT_MTP,     // Multi-token prediction
174
    COMMON_SPECULATIVE_TYPE_DRAFT_DFLASH,  // DFlash speculative decoding
175
    COMMON_SPECULATIVE_TYPE_NGRAM_SIMPLE,  // simple self-speculative decoding based on n-grams
176
    COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K,   // self-speculative decoding with n-gram keys only
177
    COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K4V, // self-speculative decoding with n-gram keys and 4 m-gram values
178
    COMMON_SPECULATIVE_TYPE_NGRAM_MOD,
179
    COMMON_SPECULATIVE_TYPE_NGRAM_CACHE,   // self-speculative decoding with 3-level n-gram cache
180
    COMMON_SPECULATIVE_TYPE_COUNT          // number of types, unknown type
181
};
182
183
// Grammar type enumeration
184
enum common_grammar_type {
185
    COMMON_GRAMMAR_TYPE_NONE,           // no grammar set
186
    COMMON_GRAMMAR_TYPE_USER,           // user-provided GBNF (--grammar / "grammar" API field)
187
    COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT,  // auto-generated from JSON schema (--json-schema / "json_schema" API field)
188
    COMMON_GRAMMAR_TYPE_TOOL_CALLS,     // auto-generated by chat template parser for function calling
189
};
190
191
// Grammar variant struct with type and grammar string
192
struct common_grammar {
193
    common_grammar_type type = COMMON_GRAMMAR_TYPE_NONE;
194
    std::string grammar;
195
196
    // Default constructor - no grammar
197
    common_grammar() = default;
198
199
    // Constructor with type and grammar string
200
0
    common_grammar(common_grammar_type t, std::string g) : type(t), grammar(std::move(g)) {
201
0
        GGML_ASSERT(type != COMMON_GRAMMAR_TYPE_NONE || !grammar.empty());
202
0
    }
203
204
    // Check if a grammar is set
205
0
    bool empty() const { return type == COMMON_GRAMMAR_TYPE_NONE || grammar.empty(); }
206
};
207
208
// Returns the raw grammar string, or empty string if no grammar is set.
209
0
inline const std::string & common_grammar_value(const common_grammar & g) {
210
0
    return g.grammar;
211
0
}
212
213
// Returns true when the generation_prompt should be prefilled into the grammar sampler.
214
// Only output-format and tool-call grammars need prefill; user-supplied grammars must not be prefilled.
215
0
inline bool common_grammar_needs_prefill(const common_grammar & g) {
216
0
    return g.type == COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT
217
0
        || g.type == COMMON_GRAMMAR_TYPE_TOOL_CALLS;
218
0
}
219
220
// sampling parameters
221
struct common_params_sampling {
222
    uint32_t seed = LLAMA_DEFAULT_SEED; // the seed used to initialize llama_sampler
223
224
    int32_t n_prev             = 64;     // number of previous tokens to remember
225
    int32_t n_probs            = 0;      // if greater than 0, output the probabilities of top n_probs tokens.
226
    int32_t min_keep           = 0;      // 0 = disabled, otherwise samplers should return at least min_keep tokens
227
    int32_t top_k              = 40;     // <= 0 to use vocab size
228
    float   top_p              = 0.95f;  // 1.0 = disabled
229
    float   min_p              = 0.05f;  // 0.0 = disabled
230
    float   xtc_probability    = 0.00f;  // 0.0 = disabled
231
    float   xtc_threshold      = 0.10f;  // > 0.5 disables XTC
232
    float   typ_p              = 1.00f;  // typical_p, 1.0 = disabled
233
    float   temp               = 0.80f;  // <= 0.0 to sample greedily, 0.0 to not output probabilities
234
    float   dynatemp_range     = 0.00f;  // 0.0 = disabled
235
    float   dynatemp_exponent  = 1.00f;  // controls how entropy maps to temperature in dynamic temperature sampler
236
    int32_t penalty_last_n     = 64;     // last n tokens to penalize (0 = disable penalty, -1 = context size)
237
    float   penalty_repeat     = 1.00f;  // 1.0 = disabled
238
    float   penalty_freq       = 0.00f;  // 0.0 = disabled
239
    float   penalty_present    = 0.00f;  // 0.0 = disabled
240
    float   dry_multiplier     = 0.0f;   // 0.0 = disabled;      DRY repetition penalty for tokens extending repetition:
241
    float   dry_base           = 1.75f;  // 0.0 = disabled;      multiplier * base ^ (length of sequence before token - allowed length)
242
    int32_t dry_allowed_length = 2;      // tokens extending repetitions beyond this receive penalty
243
    int32_t dry_penalty_last_n = -1;     // how many tokens to scan for repetitions (0 = disable penalty, -1 = context size)
244
    float   adaptive_target    = -1.0f;  // select tokens near this probability (valid range 0.0 to 1.0; negative = disabled)
245
    float   adaptive_decay     = 0.90f;  // EMA decay for adaptation; history ≈ 1/(1-decay) tokens (0.0 - 0.99)
246
    int32_t mirostat           = 0;      // 0 = disabled, 1 = mirostat, 2 = mirostat 2.0
247
    float   top_n_sigma        = -1.00f; // -1.0 = disabled
248
    float   mirostat_tau       = 5.00f;  // target entropy
249
    float   mirostat_eta       = 0.10f;  // learning rate
250
    bool    ignore_eos         = false;
251
    bool    no_perf            = false;  // disable performance metrics
252
    bool    timing_per_token   = false;
253
254
    uint64_t user_sampling_config = 0; // bitfield to track user-specified samplers
255
256
    std::vector<std::string> dry_sequence_breakers = {"\n", ":", "\"", "*"};     // default sequence breakers for DRY
257
258
    std::vector<enum common_sampler_type> samplers = {
259
        COMMON_SAMPLER_TYPE_PENALTIES,
260
        COMMON_SAMPLER_TYPE_DRY,
261
        COMMON_SAMPLER_TYPE_TOP_N_SIGMA,
262
        COMMON_SAMPLER_TYPE_TOP_K,
263
        COMMON_SAMPLER_TYPE_TYPICAL_P,
264
        COMMON_SAMPLER_TYPE_TOP_P,
265
        COMMON_SAMPLER_TYPE_MIN_P,
266
        COMMON_SAMPLER_TYPE_XTC,
267
        COMMON_SAMPLER_TYPE_TEMPERATURE,
268
    };
269
270
    common_grammar              grammar;      // optional grammar constraint (user / output-format / tool-calls)
271
    bool                                grammar_lazy = false;
272
    std::vector<common_grammar_trigger> grammar_triggers; // optional triggers (for lazy grammars)
273
    std::set<llama_token>               preserved_tokens;
274
275
    std::vector<llama_logit_bias> logit_bias;     // logit biases to apply
276
    std::vector<llama_logit_bias> logit_bias_eog; // pre-calculated logit biases for EOG tokens
277
278
    // The assistant generation prompt already prefilled into the prompt.
279
    // Fed to the grammar sampler (to advance past pre-existing tokens) and used
280
    // to determine the reasoning budget sampler's initial state.
281
    // Only applied when the grammar is of output-format or tool-calls type.
282
    std::string generation_prompt;
283
284
    // reasoning budget sampler parameters
285
    // these are populated by the server/CLI based on chat template params
286
    int32_t                  reasoning_budget_tokens   = -1;   // -1 = disabled, >= 0 = token budget
287
    std::vector<llama_token> reasoning_budget_start;           // start tag token sequence
288
    std::vector<llama_token> reasoning_budget_end;             // end tag token sequence
289
    std::vector<llama_token> reasoning_budget_forced;          // forced sequence (message + end tag)
290
    std::string              reasoning_budget_message;         // message injected before end tag when budget exhausted
291
    bool                     reasoning_control = false;        // create the budget sampler on demand so reasoning can be ended at runtime
292
293
    bool backend_sampling = false;
294
295
0
    bool has_logit_bias() const {
296
0
        return !logit_bias.empty();
297
0
    }
298
299
    // print the parameters into a string
300
    std::string print() const;
301
};
302
303
struct common_params_model {
304
    std::string path        = ""; // model local path
305
    std::string url         = ""; // model url to download
306
    std::string hf_repo     = ""; // HF repo
307
    std::string hf_file     = ""; // HF file
308
    std::string docker_repo = ""; // Docker repo
309
310
0
    std::string get_name() const {
311
0
        if (!hf_repo.empty()) {
312
0
            return hf_repo;
313
0
        }
314
0
        if (!docker_repo.empty()) {
315
0
            return docker_repo;
316
0
        }
317
0
        return path;
318
0
    }
319
320
0
    bool empty() const {
321
0
        return get_name().empty();
322
0
    }
323
};
324
325
// draft-model-based speculative decoding parameters
326
struct common_params_speculative_draft {
327
    int32_t n_max = 3; // maximum number of tokens to draft during speculative decoding
328
    int32_t n_min = 0; // minimum number of draft tokens to use for speculative decoding
329
330
    float p_split = 0.1f; // speculative decoding split probability
331
    float p_min   = 0.0f; // minimum speculative decoding probability (greedy)
332
333
    bool backend_sampling = true; // offload draft sampling to the backend (default: on)
334
335
    common_params_model mparams;
336
337
    llama_context * ctx_tgt = nullptr;
338
    llama_context * ctx_dft = nullptr;
339
340
    int32_t n_gpu_layers = -1; // number of layers to store in VRAM for the draft model (-1 - use default)
341
342
    ggml_type cache_type_k = GGML_TYPE_F16; // KV cache data type for the K
343
    ggml_type cache_type_v = GGML_TYPE_F16; // KV cache data type for the V
344
345
    common_cpu_params cpuparams;
346
    common_cpu_params cpuparams_batch;
347
348
    std::vector<ggml_backend_dev_t> devices; // devices to use for offloading
349
350
    std::vector<llama_model_tensor_buft_override> tensor_buft_overrides;
351
};
352
353
struct common_params_speculative_ngram_mod {
354
    int32_t n_match = 24;
355
356
    int32_t n_max = 64;
357
    int32_t n_min = 48;
358
};
359
360
struct common_params_speculative_ngram_map {
361
    uint16_t size_n   = 12; // ngram size for lookup
362
    uint16_t size_m   = 48; // mgram size for speculative tokens
363
    uint16_t min_hits = 1;  // minimum hits at ngram/mgram lookup for mgram to be proposed
364
};
365
366
struct common_params_speculative_ngram_cache {
367
    std::string lookup_cache_static;  // path of static ngram cache file for lookup decoding
368
    std::string lookup_cache_dynamic; // path of dynamic ngram cache file for lookup decoding
369
};
370
371
struct common_params_speculative {
372
    std::vector<enum common_speculative_type> types = { COMMON_SPECULATIVE_TYPE_NONE };
373
374
    // used by Simple, MTP, Eagle3, etc. - all methods that require some kind of draft model
375
    common_params_speculative_draft draft;
376
377
    common_params_speculative_ngram_mod ngram_mod;
378
    common_params_speculative_ngram_map ngram_simple;
379
    common_params_speculative_ngram_map ngram_map_k;
380
    common_params_speculative_ngram_map ngram_map_k4v;
381
382
    common_params_speculative_ngram_cache ngram_cache;
383
384
0
    bool has_dft() const {
385
0
        return !draft.mparams.empty();
386
0
    }
387
388
0
    uint32_t need_n_rs_seq() const {
389
0
        bool needs_rs_seq = std::any_of(types.begin(), types.end(), [&](auto t) {
390
0
            return t == COMMON_SPECULATIVE_TYPE_DRAFT_MTP || t == COMMON_SPECULATIVE_TYPE_DRAFT_EAGLE3 || t == COMMON_SPECULATIVE_TYPE_DRAFT_DFLASH;
391
0
        });
392
393
0
        return needs_rs_seq ? draft.n_max : 0u;
394
0
    }
395
};
396
397
struct common_params_vocoder {
398
    struct common_params_model model;
399
400
    std::string speaker_file; // speaker file path
401
402
    bool use_guide_tokens = false; // enable guide tokens to improve TTS accuracy
403
};
404
405
struct common_params_diffusion {
406
    int32_t steps         = 128;
407
    bool    visual_mode   = false;
408
409
    float   eps           = 0;        // epsilon for timesteps
410
    int32_t block_length  = 0;        // block length for generation
411
412
    int32_t algorithm     = 4;        // default algorithm: low-confidence
413
    float   alg_temp      = 0.0f;     // algorithm temperature
414
415
    float   cfg_scale     = 0;        // classifier-free guidance scale
416
    bool    add_gumbel_noise = false; // add gumbel noise to the logits if temp > 0.0
417
};
418
419
// reasoning API response format (not to be confused as chat template's reasoning format)
420
// only used by server
421
enum common_reasoning_format {
422
    COMMON_REASONING_FORMAT_NONE,
423
    COMMON_REASONING_FORMAT_AUTO,            // Same as deepseek, using `message.reasoning_content`
424
    COMMON_REASONING_FORMAT_DEEPSEEK_LEGACY, // Extract thinking tag contents and return as `message.reasoning_content`, or leave inline in <think> tags in stream mode
425
    COMMON_REASONING_FORMAT_DEEPSEEK,        // Extract thinking tag contents and return as `message.reasoning_content`, including in streaming deltas.
426
    // do not extend this enum unless you absolutely have to
427
    // in most cases, use COMMON_REASONING_FORMAT_AUTO
428
    // see: https://github.com/ggml-org/llama.cpp/pull/15408
429
};
430
431
432
struct lr_opt {
433
    float    lr0          = 1e-5; // learning rate at first epoch
434
    float    lr_min       = -1;
435
    float    decay_epochs = -1;   // if >0, the learning rate starts at lr0 and decays to lr_min after this many epochs
436
    float    scale_epoch  = 0;
437
    float    wd           = 0;
438
    unsigned epochs       = 2;
439
440
    unsigned epoch; // set by optimizer outer (epochs) loop
441
    // learning rate decay - constant LR per epoch only for now
442
    float get_lr(float e) const;
443
0
    float get_lr() const { return get_lr(epoch); }
444
    // must call after arg parse, before get_lr
445
    void init();
446
};
447
448
struct ggml_opt_optimizer_params common_opt_lr_pars(void * userdata);
449
450
struct common_params {
451
    int32_t n_predict             =    -1; // max. number of new tokens to predict, -1 == no limit
452
    int32_t n_ctx                 =     0; // context size, 0 == context the model was trained with
453
    int32_t n_batch               =  2048; // logical batch size for prompt processing (must be >=32 to use BLAS)
454
    int32_t n_ubatch              =   512; // physical batch size for prompt processing (must be >=32 to use BLAS)
455
    int32_t n_keep                =     0; // number of tokens to keep from initial prompt
456
    int32_t n_chunks              =    -1; // max number of chunks to process (-1 = unlimited)
457
    int32_t n_parallel            =     1; // number of parallel sequences to decode
458
    int32_t n_sequences           =     1; // number of sequences to decode
459
    int32_t n_outputs_max         =     0; // max outputs in a batch (0 = n_batch)
460
    int32_t grp_attn_n            =     1; // group-attention factor
461
    int32_t grp_attn_w            =   512; // group-attention width
462
    int32_t n_print               =    -1; // print token count every n tokens (-1 = disabled)
463
    float   rope_freq_base        =  0.0f; // RoPE base frequency
464
    float   rope_freq_scale       =  0.0f; // RoPE frequency scaling factor
465
    float   yarn_ext_factor       = -1.0f; // YaRN extrapolation mix factor
466
    float   yarn_attn_factor      = -1.0f; // YaRN magnitude scaling factor
467
    float   yarn_beta_fast        = -1.0f; // YaRN low correction dim
468
    float   yarn_beta_slow        = -1.0f; // YaRN high correction dim
469
    int32_t yarn_orig_ctx         =     0; // YaRN original context length
470
471
    // offload params
472
    std::vector<ggml_backend_dev_t> devices; // devices to use for offloading
473
474
    int32_t n_gpu_layers       = -1;    // number of layers to store in VRAM, -1 is auto, <= -2 is all
475
    int32_t main_gpu           = 0;     // the GPU that is used for scratch and small tensors
476
    float   tensor_split[128]  = {0};   // how split tensors should be distributed across GPUs
477
    bool    fit_params         = true;  // whether to fit unset model/context parameters to free device memory
478
    bool    fit_params_print   = false; // print the estimated required memory to run the model
479
    int32_t fit_params_min_ctx = 4096;  // minimum context size to set when trying to reduce memory use
480
481
    // margin per device in bytes for fitting parameters to free memory:
482
    std::vector<size_t> fit_params_target = std::vector<size_t>(llama_max_devices(), 1024 * 1024*1024);
483
484
    enum llama_split_mode split_mode = LLAMA_SPLIT_MODE_LAYER; // how to split the model across GPUs
485
486
    common_cpu_params cpuparams;
487
    common_cpu_params cpuparams_batch;
488
489
    ggml_backend_sched_eval_callback cb_eval = nullptr;
490
    void * cb_eval_user_data                 = nullptr;
491
492
    ggml_numa_strategy numa = GGML_NUMA_STRATEGY_DISABLED;
493
494
    enum llama_rope_scaling_type rope_scaling_type = LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED;
495
    enum llama_pooling_type      pooling_type      = LLAMA_POOLING_TYPE_UNSPECIFIED; // pooling type for embeddings
496
    enum llama_attention_type    attention_type    = LLAMA_ATTENTION_TYPE_UNSPECIFIED; // attention type for embeddings
497
    enum llama_flash_attn_type   flash_attn_type   = LLAMA_FLASH_ATTN_TYPE_AUTO; // whether to use Flash Attention
498
499
    struct common_params_sampling    sampling;
500
    struct common_params_speculative speculative;
501
    struct common_params_vocoder     vocoder;
502
    struct common_params_diffusion   diffusion;
503
504
    struct common_params_model model;
505
506
    std::set<std::string> model_alias;     // model aliases                                                 // NOLINT
507
    std::set<std::string> model_tags;      // model tags (informational, not used for routing)              // NOLINT
508
    std::string hf_token             = ""; // HF token (aka bearer token)                                   // NOLINT
509
    std::string prompt               = "";                                                                  // NOLINT
510
    std::string system_prompt        = "";                                                                  // NOLINT
511
    std::string prompt_file          = ""; // store the external prompt file name                           // NOLINT
512
    std::string path_prompt_cache    = ""; // path to file for saving/loading prompt eval state             // NOLINT
513
    std::string input_prefix         = ""; // string to prefix user inputs with                             // NOLINT
514
    std::string input_suffix         = ""; // string to suffix user inputs with                             // NOLINT
515
    std::string logits_file          = ""; // file for saving *all* logits                                  // NOLINT
516
    std::string path_prompts_log_dir = ""; // directory with logged prompts                                 // NOLINT
517
518
    // llama-debug specific options
519
    std::string logits_output_dir = "data"; // directory for saving logits output files                     // NOLINT
520
    bool        save_logits       = false;  // whether to save logits to files                              // NOLINT
521
    std::vector<std::string> tensor_filter; // filter tensor names for debug output (regex)                 // NOLINT
522
523
    std::vector<std::string> in_files;   // all input files
524
    std::vector<std::string> antiprompt; // strings upon which more user input is prompted (a.k.a. reverse prompts)
525
    std::vector<llama_model_kv_override> kv_overrides;
526
    std::vector<llama_model_tensor_buft_override> tensor_buft_overrides;
527
528
    bool lora_init_without_apply = false; // only load lora to memory, but do not apply it to ctx (user can manually apply lora later using llama_adapter_lora_apply)
529
    std::vector<common_adapter_lora_info> lora_adapters; // lora adapter path with user defined scale
530
531
    std::vector<common_control_vector_load_info> control_vectors; // control vector with user defined scale
532
533
    int32_t verbosity                  = 3;  // LOG_LEVEL_INFO
534
    int32_t control_vector_layer_start = -1; // layer range for control vector
535
    int32_t control_vector_layer_end   = -1; // layer range for control vector
536
    bool    offline                    = false;
537
538
    int32_t ppl_stride      = 0;     // stride for perplexity calculations. If left at 0, the pre-existing approach will be used.
539
    int32_t ppl_output_type = 0;     // = 0 -> ppl output is as usual, = 1 -> ppl output is num_tokens, ppl, one per line
540
                                     //                                       (which is more convenient to use for plotting)
541
                                     //
542
    bool   hellaswag        = false; // compute HellaSwag score over random tasks from datafile supplied in prompt
543
    size_t hellaswag_tasks  = 400;   // number of tasks to use when computing the HellaSwag score
544
545
    bool   winogrande       = false; // compute Winogrande score over random tasks from datafile supplied in prompt
546
    size_t winogrande_tasks = 0;     // number of tasks to use when computing the Winogrande score. If 0, all tasks will be computed
547
548
    bool   multiple_choice  = false;  // compute TruthfulQA score over random tasks from datafile supplied in prompt
549
    size_t multiple_choice_tasks = 0; // number of tasks to use when computing the TruthfulQA score. If 0, all tasks will be computed
550
551
    bool   kl_divergence    = false; // compute KL divergence
552
553
    bool check             = false; // check rather than generate results for llama-results
554
555
    bool usage             = false; // print usage
556
    bool completion        = false; // print source-able completion script
557
    bool use_color         = false; // use color to distinguish generations and inputs
558
    bool special           = false; // enable special token output
559
    bool interactive       = false; // interactive mode
560
    bool interactive_first = false; // wait for user input immediately
561
    bool prompt_cache_all  = false; // save user input and generations to prompt cache
562
    bool prompt_cache_ro   = false; // open the prompt cache read-only and do not update it
563
564
    bool escape            = true;  // escape "\n", "\r", "\t", "\'", "\"", and "\\"
565
    bool multiline_input   = false; // reverse the usage of `\`
566
    bool simple_io         = false; // improves compatibility with subprocesses and limited consoles
567
    bool cont_batching     = true;  // insert new sequences for decoding on-the-fly
568
    bool no_perf           = false; // disable performance metrics
569
    bool show_timings      = true;  // show timing information on CLI
570
    bool ctx_shift         = false; // context shift on infinite text generation
571
    bool swa_full          = false; // use full-size SWA cache (https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055)
572
    bool kv_unified        = false; // enable unified KV cache
573
574
    bool input_prefix_bos  = false; // prefix BOS to user inputs, preceding input_prefix
575
    bool use_mmap          = true;  // enable mmap to use filesystem cache
576
    bool use_direct_io     = false; // read from disk without buffering
577
    bool use_mlock         = false; // use mlock to keep model in memory
578
    bool verbose_prompt    = false; // print prompt tokens before generation
579
    bool display_prompt    = true;  // print prompt before generation
580
    bool no_kv_offload     = false; // disable KV offloading
581
    bool warmup            = true;  // warmup run
582
    bool check_tensors     = false; // validate tensor data
583
    bool no_op_offload     = false; // globally disable offload host tensor operations to device
584
    bool no_extra_bufts    = false; // disable extra buffer types (used for weight repacking)
585
    bool no_host           = false; // bypass host buffer allowing extra buffers to be used
586
587
    bool single_turn       = false; // single turn chat conversation
588
589
    ggml_type cache_type_k = GGML_TYPE_F16; // KV cache data type for the K
590
    ggml_type cache_type_v = GGML_TYPE_F16; // KV cache data type for the V
591
592
    common_conversation_mode conversation_mode = COMMON_CONVERSATION_MODE_AUTO;
593
594
    // multimodal models (see tools/mtmd)
595
    struct common_params_model mmproj;
596
    bool mmproj_use_gpu = true;     // use GPU for multimodal model
597
    bool no_mmproj = false;         // explicitly disable multimodal model
598
    std::vector<std::string> image; // path to image file(s) ; TODO: change the name to "media"
599
    int image_min_tokens = -1;
600
    int image_max_tokens = -1;
601
    int mtmd_batch_max_tokens = 1024;
602
603
    // finetune
604
    struct lr_opt lr;
605
    enum ggml_opt_optimizer_type optimizer = GGML_OPT_OPTIMIZER_TYPE_ADAMW;
606
    float val_split = 0.05f; // fraction of the data used for the validation set
607
608
    // embedding
609
    bool embedding         = false; // get only sentence embedding
610
    int32_t embd_normalize = 2;     // normalisation for embeddings (-1=none, 0=max absolute int16, 1=taxicab, 2=euclidean, >2=p-norm)
611
    std::string embd_out   = "";    // empty = default, "array" = [[],[]...], "json" = openai style, "json+" = same "json" + cosine similarity matrix
612
    std::string embd_sep   = "\n";  // separator of embeddings
613
    std::string cls_sep    = "\t";  // separator of classification sequences
614
615
    // server params
616
    int32_t port                = 8080;          // server listens on this network port
617
    bool    reuse_port          = false;         // allow multiple sockets to bind to the same port
618
    int32_t timeout_read        = 3600;          // http read timeout in seconds
619
    int32_t timeout_write       = timeout_read;  // http write timeout in seconds
620
    int32_t sse_ping_interval   = 30;            // SSE ping interval in seconds
621
    int32_t n_threads_http      = -1;    // number of threads to process HTTP requests (TODO: support threadpool)
622
    int32_t n_cache_reuse       = 0;     // min chunk size to reuse from the cache via KV shifting
623
    bool    cache_prompt        = true;  // whether to enable prompt caching
624
    bool    cache_idle_slots    = true;  // save and clear idle slots upon starting a new task
625
    int32_t n_ctx_checkpoints   = 32;    // max number of context checkpoints per slot
626
    int32_t checkpoint_min_step = 8192;  // minimum spacing between context checkpoints
627
    int32_t cache_ram_mib       = 8192;  // -1 = no limit, 0 - disable, 1 = 1 MiB, etc.
628
629
    std::string hostname      = "127.0.0.1";
630
    std::string public_path   = "";                                                                         // NOLINT
631
    std::string api_prefix    = "";                                                                         // NOLINT
632
    std::string chat_template = "";                                                                         // NOLINT
633
    bool use_jinja = true;                                                                                  // NOLINT
634
635
    // server CORS params
636
    std::string cors_origins = "*";
637
    std::string cors_methods = "GET, POST, DELETE, OPTIONS";
638
    std::string cors_headers = "*";
639
    bool cors_credentials = true;
640
    bool cors_origins_explicit = false; // for --agent option
641
642
    bool enable_chat_template = true;
643
    bool force_pure_content_parser = false;
644
    common_reasoning_format reasoning_format = COMMON_REASONING_FORMAT_DEEPSEEK;
645
    int enable_reasoning = -1; // -1 = auto, 0 = disable, 1 = enable
646
    bool prefill_assistant = true; // if true, any trailing assistant message will be prefilled into the response
647
    int sleep_idle_seconds = -1;   // if >0, server will sleep after this many seconds of idle time
648
649
    std::vector<std::string> api_keys;
650
651
    std::string ssl_file_key  = "";                                                                         // NOLINT
652
    std::string ssl_file_cert = "";                                                                         // NOLINT
653
654
    std::map<std::string, std::string> default_template_kwargs;
655
656
    // CLI params
657
    std::string server_base; // if set, connect to this server instead of starting a new one
658
659
    // UI configs
660
    bool ui = true;
661
    bool ui_mcp_proxy = false;
662
    std::string ui_config_json;
663
664
    // "advanced" endpoints are disabled by default for better security
665
    bool endpoint_slots   = true;
666
    bool endpoint_props   = false; // only control POST requests, not GET
667
    bool endpoint_metrics = false;
668
669
    // enable built-in tools
670
    std::vector<std::string> server_tools;
671
672
    // router server configs
673
    std::string models_dir    = "";     // directory containing models for the router server
674
    std::string models_preset = "";     // directory containing model presets for the router server
675
    int models_max = 4;                 // maximum number of models to load simultaneously
676
    bool models_autoload = true;        // automatically load models when requested via the router server
677
    std::string models_preset_hf = "";  // show a warning about remote presets on router loaded (if not empty)
678
679
    bool log_json = false;
680
681
    std::string slot_save_path;
682
    std::string media_path; // path to directory for loading media files
683
684
    float slot_prompt_similarity = 0.1f;
685
686
    // batched-bench params
687
    bool is_pp_shared   = false;
688
    bool is_tg_separate = false;
689
690
    std::vector<int32_t> n_pp;
691
    std::vector<int32_t> n_tg;
692
    std::vector<int32_t> n_pl;
693
694
    // retrieval params
695
    std::vector<std::string> context_files; // context files to embed
696
697
    int32_t chunk_size = 64; // chunk size for context embedding
698
699
    std::string chunk_separator = "\n"; // chunk separator for context embedding
700
701
    // passkey params
702
    int32_t n_junk = 250; // number of times to repeat the junk text
703
    int32_t i_pos  = -1;  // position of the passkey in the junk text
704
705
    // imatrix params
706
    int32_t n_out_freq  = 10; // output the imatrix every n_out_freq iterations
707
    int32_t n_save_freq =  0; // save the imatrix every n_save_freq iterations
708
    int32_t i_chunk     =  0; // start processing from this chunk
709
    int8_t  imat_dat    =  0; // whether the legacy imatrix.dat format should be output (gguf <= 0 < dat)
710
711
    bool process_output  = false; // collect data for the output tensor
712
    bool compute_ppl     = true;  // whether to compute perplexity
713
    bool show_statistics = false; // show imatrix statistics per tensor
714
    bool parse_special   = false; // whether to parse special tokens during imatrix tokenization
715
716
    // cvector-generator params
717
    int n_pca_batch = 100;
718
    int n_pca_iterations = 1000;
719
    dimre_method cvector_dimre_method = DIMRE_METHOD_PCA;
720
    std::string cvector_positive_file = "tools/cvector-generator/positive.txt";
721
    std::string cvector_negative_file = "tools/cvector-generator/negative.txt";
722
723
    bool spm_infill = false; // suffix/prefix/middle pattern for infill
724
725
    // batched-bench params
726
    bool batched_bench_output_jsonl = false;
727
728
    // tokenize params
729
    bool tokenize_ids        = false; // if true, only print the token IDs
730
    bool tokenize_stdin      = false; // if true, read the prompt from stdin
731
    bool tokenize_no_bos     = false; // if true, do not add the BOS token
732
    bool tokenize_show_count = false; // if true, print the total token count
733
734
    // common params
735
    std::string out_file; // output filename for all example programs
736
    // optional callback for model loading progress and cancellation:
737
    // called with a progress value between 0.0 and 1.0.
738
    // return false from callback to abort model loading or true to continue
739
    llama_progress_callback load_progress_callback = NULL;
740
    void *                  load_progress_callback_user_data = NULL;
741
    bool no_alloc = false; // Don't allocate model buffers
742
};
743
744
// call once at the start of a program if it uses libcommon
745
// initializes the logging system and prints info about the build
746
void common_init();
747
748
void common_params_print_info(const common_params & params, bool print_devices = true);
749
std::string common_params_get_system_info(const common_params & params);
750
751
bool parse_cpu_range(const std::string & range, bool(&boolmask)[GGML_MAX_N_THREADS]);
752
bool parse_cpu_mask(const std::string & mask, bool(&boolmask)[GGML_MAX_N_THREADS]);
753
void postprocess_cpu_params(common_cpu_params & cpuparams, const common_cpu_params * role_model = nullptr);
754
bool set_process_priority(enum ggml_sched_priority prio);
755
756
//
757
// String utils
758
//
759
760
#ifdef __GNUC__
761
#    if defined(__MINGW32__) && !defined(__clang__)
762
#        define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
763
#    else
764
#        define LLAMA_COMMON_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
765
#    endif
766
#else
767
#    define LLAMA_COMMON_ATTRIBUTE_FORMAT(...)
768
#endif
769
770
LLAMA_COMMON_ATTRIBUTE_FORMAT(1, 2)
771
std::string string_format(const char * fmt, ...);
772
773
std::string string_strip(const std::string & str);
774
std::string string_get_sortable_timestamp();
775
std::string string_lcs(std::string_view a, std::string_view b);
776
777
std::string string_join(const std::vector<std::string> & values, const std::string & separator);
778
std::vector<std::string> string_split(const std::string & str, const std::string & delimiter);
779
std::string string_repeat(const std::string & str, size_t n);
780
781
void string_replace_all(std::string & s, const std::string & search, const std::string & replace);
782
783
std::string regex_escape(const std::string & s);
784
785
template<class T>
786
static std::vector<T> string_split(const std::string & str, char delim) {
787
    static_assert(!std::is_same<T, std::string>::value, "Please use the specialized version for std::string");
788
    std::vector<T> values;
789
    std::istringstream str_stream(str);
790
    std::string token;
791
    while (std::getline(str_stream, token, delim)) {
792
        T value;
793
        std::istringstream token_stream(token);
794
        token_stream >> value;
795
        values.push_back(value);
796
    }
797
    return values;
798
}
799
800
template<>
801
inline std::vector<std::string> string_split<std::string>(const std::string & str, char delim)
802
0
{
803
0
    std::vector<std::string> parts;
804
0
    size_t begin_pos = 0;
805
0
    size_t delim_pos = str.find(delim);
806
0
    while (delim_pos != std::string::npos) {
807
0
        std::string part = str.substr(begin_pos, delim_pos - begin_pos);
808
0
        parts.emplace_back(part);
809
0
        begin_pos = delim_pos + 1;
810
0
        delim_pos = str.find(delim, begin_pos);
811
0
    }
812
0
    parts.emplace_back(str.substr(begin_pos));
813
0
    return parts;
814
0
}
Unexecuted instantiation: json-schema-to-grammar.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: common.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: log.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: sampling.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
Unexecuted instantiation: reasoning-budget.cpp:std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > string_split<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char)
815
816
// remove when moving to c++20
817
0
inline bool string_starts_with(std::string_view str, std::string_view prefix) {
818
0
    return str.size() >= prefix.size() &&
819
0
           str.compare(0, prefix.size(), prefix) == 0;
820
0
}
821
822
// remove when moving to c++20
823
0
inline bool string_starts_with(std::string_view str, char prefix) {
824
0
    return !str.empty() && str.front() == prefix;
825
0
}
826
827
// remove when moving to c++20
828
0
inline bool string_ends_with(std::string_view str, std::string_view suffix) {
829
0
    return str.size() >= suffix.size() &&
830
0
           str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
831
0
}
832
833
0
inline bool string_remove_suffix(std::string & str, std::string_view suffix) {
834
0
    if (string_ends_with(str, suffix)) {
835
0
        str.resize(str.size() - suffix.size());
836
0
        return true;
837
0
    }
838
0
    return false;
839
0
}
840
841
0
inline size_t string_find_partial_stop(std::string_view str, std::string_view stop) {
842
0
    if (!str.empty() && !stop.empty()) {
843
0
        const size_t max_len = std::min(str.size(), stop.size());
844
0
        const char last_char = str.back();
845
0
        for (size_t len = max_len; len > 0; --len) {
846
0
            if (stop[len - 1] == last_char) {
847
0
                if (string_ends_with(str, stop.substr(0, len))) {
848
0
                    return str.size() - len;
849
0
                }
850
0
            }
851
0
        }
852
0
    }
853
0
    return std::string::npos;
854
0
}
855
856
bool string_parse_kv_override(const char * data, std::vector<llama_model_kv_override> & overrides);
857
void string_process_escapes(std::string & input);
858
859
std::string string_from(bool value);
860
std::string string_from(const std::vector<int> & values);
861
std::string string_from(const struct llama_context * ctx, const std::vector<llama_token> & tokens);
862
std::string string_from(const struct llama_context * ctx, const struct llama_batch & batch);
863
864
bool glob_match(const std::string & pattern, const std::string & str);
865
866
//
867
// Filesystem utils
868
//
869
870
bool fs_validate_filename(const std::string & filename, bool allow_subdirs = false);
871
bool fs_create_directory_with_parents(const std::string & path);
872
bool fs_is_directory(const std::string & path);
873
874
std::string fs_get_cache_directory();
875
std::string fs_get_cache_file(const std::string & filename);
876
877
struct common_file_info {
878
    std::string path;
879
    std::string name;
880
    size_t      size = 0; // in bytes
881
    bool        is_dir = false;
882
};
883
std::vector<common_file_info> fs_list(const std::string & path, bool include_directories);
884
885
// fs open, also handle UTF8 on Windows
886
std::ifstream fs_open_ifstream(const std::string & fname, std::ios_base::openmode mode);
887
888
//
889
// TTY utils
890
//
891
892
// Auto-detect if colors can be enabled based on terminal and environment
893
bool tty_can_use_colors();
894
895
//
896
// Model utils
897
//
898
899
struct common_sampler;
900
901
// note: defines the model, context, samplers, ets. lifetimes
902
struct common_init_result {
903
    common_init_result(common_params & params, bool model_only = false);
904
    ~common_init_result();
905
906
    llama_model * model();
907
    llama_context * context();
908
909
    common_sampler * sampler(llama_seq_id seq_id);
910
    void reset_samplers();
911
912
    std::vector<llama_adapter_lora_ptr> & lora();
913
914
private:
915
    struct impl;
916
    std::unique_ptr<impl> pimpl;
917
};
918
919
using common_init_result_ptr = std::unique_ptr<common_init_result>;
920
921
common_init_result_ptr common_init_from_params(common_params & params, bool model_only = false);
922
923
struct llama_model_params     common_model_params_to_llama  (      common_params & params);
924
struct llama_context_params   common_context_params_to_llama(const common_params & params);
925
struct ggml_threadpool_params ggml_threadpool_params_from_cpu_params(const common_cpu_params & params);
926
927
// clear LoRA adapters from context, then apply new list of adapters
928
void common_set_adapter_lora(struct llama_context * ctx, std::vector<common_adapter_lora_info> & lora);
929
930
// model endpoint from env
931
std::string common_get_model_endpoint();
932
933
//
934
// Context utils
935
//
936
937
enum common_context_seq_rm_type {
938
    COMMON_CONTEXT_SEQ_RM_TYPE_NO           = 0, // seq_rm not supported (e.g. no memory module)
939
    COMMON_CONTEXT_SEQ_RM_TYPE_PART         = 1, // can seq_rm partial sequences
940
    COMMON_CONTEXT_SEQ_RM_TYPE_FULL         = 2, // can seq_rm full sequences only
941
    COMMON_CONTEXT_SEQ_RM_TYPE_RS = 3, // can seq_rm partial sequences, bounded by n_rs_seq
942
};
943
944
// check if the llama_context can remove sequences
945
// note: clears the memory of the context
946
common_context_seq_rm_type common_context_can_seq_rm(llama_context * ctx);
947
948
// aborts execution on failure
949
void common_context_seq_rm (llama_context * ctx, llama_seq_id seq_id, llama_pos p0, llama_pos p1);
950
void common_context_seq_add(llama_context * ctx, llama_seq_id seq_id, llama_pos p0, llama_pos p1, llama_pos delta);
951
void common_context_seq_cp (llama_context * ctx, llama_seq_id seq_id_src, llama_seq_id seq_id_dst, llama_pos p0, llama_pos p1);
952
953
//
954
// Batch utils
955
//
956
957
void common_batch_clear(struct llama_batch & batch);
958
959
void common_batch_add(
960
                 struct llama_batch & batch,
961
                        llama_token   id,
962
                          llama_pos   pos,
963
    const std::vector<llama_seq_id> & seq_ids,
964
                               bool   logits);
965
966
// decodes a single batch of tokens for a prompt and manages session tokens
967
//
968
// Note: We save state before the last token so that we can replay it to ensure
969
// compatibility with all memory types. Recurrent/hybrid models cannot remove
970
// tokens from memory, so this approach works across all model architectures.
971
bool common_prompt_batch_decode(
972
              struct llama_context * ctx,
973
    const std::vector<llama_token> & all_tokens,
974
                               int   n_new,
975
                               int & n_past,
976
                               int   n_batch,
977
                  std::string_view   state_path,
978
                              bool   save_state);
979
980
// replays the last token after loading state to regenerate logits
981
// used after loading session state to ensure the sampling context has valid logits
982
bool common_replay_last_token(struct llama_context * ctx, llama_token last_token, int32_t pos);
983
984
//
985
// Vocab utils
986
//
987
988
// tokenizes a string into a vector of tokens
989
// should work similar to Python's `tokenizer.encode`
990
std::vector<llama_token> common_tokenize(
991
  const struct llama_context * ctx,
992
           const std::string & text,
993
                        bool   add_special,
994
                        bool   parse_special = false);
995
996
std::vector<llama_token> common_tokenize(
997
    const struct llama_vocab * vocab,
998
           const std::string & text,
999
                        bool   add_special,
1000
                        bool   parse_special = false);
1001
1002
// tokenizes a token into a piece, optionally renders special/control tokens
1003
// should work similar to Python's `tokenizer.id_to_piece`
1004
std::string common_token_to_piece(
1005
        const struct llama_context * ctx,
1006
                       llama_token   token,
1007
                       bool          special = true);
1008
1009
std::string common_token_to_piece(
1010
          const struct llama_vocab * vocab,
1011
                       llama_token   token,
1012
                       bool          special = true);
1013
1014
// detokenizes a vector of tokens into a string
1015
// should work similar to Python's `tokenizer.decode`
1016
// optionally renders special/control tokens
1017
std::string common_detokenize(
1018
            const struct llama_context * ctx,
1019
        const std::vector<llama_token> & tokens,
1020
                                  bool   special = true);
1021
1022
std::string common_detokenize(
1023
              const struct llama_vocab * vocab,
1024
        const std::vector<llama_token> & tokens,
1025
                                  bool   special = true);
1026
1027
//
1028
// Embedding utils
1029
//
1030
1031
// TODO: replace embd_norm with an enum
1032
void common_embd_normalize(const float * inp, float * out, int n, int embd_norm);
1033
1034
float common_embd_similarity_cos(const float * embd1, const float * embd2, int n);
1035
1036
//
1037
// Control vector utils
1038
//
1039
1040
struct common_control_vector_data {
1041
    int n_embd;
1042
1043
    // stores data for layers [1, n_layer] where n_layer = data.size() / n_embd
1044
    std::vector<float> data;
1045
};
1046
1047
struct common_control_vector_load_info {
1048
    float strength;
1049
1050
    std::string fname;
1051
};
1052
1053
// Load control vectors, scale each by strength, and add them together.
1054
// On error, returns {-1, empty}
1055
common_control_vector_data common_control_vector_load(const std::vector<common_control_vector_load_info> & load_infos);
1056
1057
//
1058
// Split utils
1059
//
1060
1061
namespace {
1062
1063
const char * const LLM_KV_SPLIT_NO            = "split.no";
1064
const char * const LLM_KV_SPLIT_COUNT         = "split.count";
1065
const char * const LLM_KV_SPLIT_TENSORS_COUNT = "split.tensors.count";
1066
1067
}
1068
1069
//
1070
// MoE utils
1071
//
1072
1073
const char * const LLM_FFN_EXPS_REGEX = "\\.ffn_(up|down|gate|gate_up)_(ch|)exps";
1074
1075
0
inline std::string llm_ffn_exps_block_regex(int idx) {
1076
0
    return string_format("blk\\.%d%s", idx, LLM_FFN_EXPS_REGEX);
1077
0
}
1078
1079
0
inline llama_model_tensor_buft_override llm_ffn_exps_cpu_override() {
1080
0
    return { LLM_FFN_EXPS_REGEX, ggml_backend_cpu_buffer_type() };
1081
0
}
1082
1083
//
1084
// training utils
1085
//
1086
1087
ggml_opt_dataset_t common_opt_dataset_init(struct llama_context * ctx, const std::vector<llama_token> & tokens, int64_t stride);
1088
1089
// "adamw" or "sgd" (case insensitive)
1090
enum ggml_opt_optimizer_type common_opt_get_optimizer(const char *);
1091
1092
//
1093
// prompt utils
1094
//
1095
1096
struct common_prompt_checkpoint {
1097
    int64_t n_tokens;
1098
1099
    // (optional) id of the task that created the checkpoint
1100
    int id_task = -1;
1101
1102
    llama_pos pos_min;
1103
    llama_pos pos_max;
1104
1105
    std::vector<uint8_t> data_tgt;
1106
    std::vector<uint8_t> data_dft;
1107
1108
    // (optional) speculative-decoding implementation state stashed with the checkpoint
1109
    // (e.g. eagle3's deferred-boundary g_embd row)
1110
    std::vector<uint8_t> data_spec;
1111
1112
    size_t size() const;
1113
1114
    bool empty() const;
1115
    void clear();
1116
1117
    void update_pos(
1118
            int64_t n_tokens,
1119
            llama_pos pos_min,
1120
            llama_pos pos_max);
1121
1122
    void update_tgt(
1123
            llama_context * ctx,
1124
            llama_seq_id seq_id,
1125
            llama_state_seq_flags flags);
1126
1127
    void update_dft(
1128
            llama_context * ctx,
1129
            llama_seq_id seq_id,
1130
            llama_state_seq_flags flags);
1131
1132
    void load_tgt(
1133
            llama_context * ctx,
1134
            llama_seq_id seq_id,
1135
            llama_state_seq_flags flags) const;
1136
1137
    void load_dft(
1138
            llama_context * ctx,
1139
            llama_seq_id seq_id,
1140
            llama_state_seq_flags flags) const;
1141
1142
    void clear_tgt();
1143
    void clear_dft();
1144
};