1#pragma once
2
3#include "llama.h"
4
5#include <string>
6#include <vector>
7#include <memory>
8
9// pre-tokenization types
10enum llama_vocab_pre_type {
11 LLAMA_VOCAB_PRE_TYPE_DEFAULT = 0,
12 LLAMA_VOCAB_PRE_TYPE_LLAMA3 = 1,
13 LLAMA_VOCAB_PRE_TYPE_DEEPSEEK_LLM = 2,
14 LLAMA_VOCAB_PRE_TYPE_DEEPSEEK_CODER = 3,
15 LLAMA_VOCAB_PRE_TYPE_FALCON = 4,
16 LLAMA_VOCAB_PRE_TYPE_MPT = 5,
17 LLAMA_VOCAB_PRE_TYPE_STARCODER = 6,
18 LLAMA_VOCAB_PRE_TYPE_GPT2 = 7,
19 LLAMA_VOCAB_PRE_TYPE_REFACT = 8,
20 LLAMA_VOCAB_PRE_TYPE_COMMAND_R = 9,
21 LLAMA_VOCAB_PRE_TYPE_STABLELM2 = 10,
22 LLAMA_VOCAB_PRE_TYPE_QWEN2 = 11,
23 LLAMA_VOCAB_PRE_TYPE_OLMO = 12,
24 LLAMA_VOCAB_PRE_TYPE_DBRX = 13,
25 LLAMA_VOCAB_PRE_TYPE_SMAUG = 14,
26 LLAMA_VOCAB_PRE_TYPE_PORO = 15,
27 LLAMA_VOCAB_PRE_TYPE_CHATGLM3 = 16,
28 LLAMA_VOCAB_PRE_TYPE_CHATGLM4 = 17,
29 LLAMA_VOCAB_PRE_TYPE_VIKING = 18,
30 LLAMA_VOCAB_PRE_TYPE_JAIS = 19,
31 LLAMA_VOCAB_PRE_TYPE_TEKKEN = 20,
32 LLAMA_VOCAB_PRE_TYPE_SMOLLM = 21,
33 LLAMA_VOCAB_PRE_TYPE_CODESHELL = 22,
34 LLAMA_VOCAB_PRE_TYPE_BLOOM = 23,
35 LLAMA_VOCAB_PRE_TYPE_GPT3_FINNISH = 24,
36 LLAMA_VOCAB_PRE_TYPE_EXAONE = 25,
37 LLAMA_VOCAB_PRE_TYPE_CHAMELEON = 26,
38 LLAMA_VOCAB_PRE_TYPE_MINERVA = 27,
39 LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM = 28,
40 LLAMA_VOCAB_PRE_TYPE_GPT4O = 29,
41 LLAMA_VOCAB_PRE_TYPE_SUPERBPE = 30,
42 LLAMA_VOCAB_PRE_TYPE_TRILLION = 31,
43 LLAMA_VOCAB_PRE_TYPE_BAILINGMOE = 32,
44 LLAMA_VOCAB_PRE_TYPE_LLAMA4 = 33,
45 LLAMA_VOCAB_PRE_TYPE_PIXTRAL = 34,
46 LLAMA_VOCAB_PRE_TYPE_SEED_CODER = 35,
47 LLAMA_VOCAB_PRE_TYPE_HUNYUAN = 36,
48 LLAMA_VOCAB_PRE_TYPE_KIMI_K2 = 37,
49 LLAMA_VOCAB_PRE_TYPE_HUNYUAN_DENSE = 38,
50 LLAMA_VOCAB_PRE_TYPE_GROK_2 = 39,
51 LLAMA_VOCAB_PRE_TYPE_GRANITE_DOCLING = 40,
52 LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2 = 41,
53 LLAMA_VOCAB_PRE_TYPE_AFMOE = 42,
54 LLAMA_VOCAB_PRE_TYPE_SOLAR_OPEN = 43,
55 LLAMA_VOCAB_PRE_TYPE_YOUTU = 44,
56 LLAMA_VOCAB_PRE_TYPE_EXAONE_MOE = 45,
57 LLAMA_VOCAB_PRE_TYPE_QWEN35 = 46,
58};
59
60struct LLM_KV;
61struct llama_model_loader;
62
63struct llama_vocab {
64 struct token_data {
65 std::string text;
66 float score;
67 llama_token_attr attr;
68 };
69
70 llama_vocab();
71 ~llama_vocab();
72
73 void load(llama_model_loader & ml, const LLM_KV & kv);
74
75 std::string get_tokenizer_model() const;
76 std::string get_tokenizer_pre() const;
77
78 enum llama_vocab_type get_type() const;
79 enum llama_vocab_pre_type get_pre_type() const;
80
81 uint32_t n_tokens() const;
82 uint32_t n_token_types() const;
83
84 std::string type_name() const;
85
86 bool is_normal (llama_token id) const;
87 bool is_unknown (llama_token id) const;
88 bool is_control (llama_token id) const;
89 bool is_byte (llama_token id) const;
90 bool is_user_defined(llama_token id) const;
91 bool is_unused (llama_token id) const;
92 bool is_eog (llama_token id) const;
93
94 uint8_t token_to_byte(llama_token id) const;
95 llama_token byte_to_token(uint8_t ch) const;
96
97 llama_token text_to_token(const std::string & text) const;
98
99 const token_data & get_token_data(llama_token id) const;
100
101 const char * token_get_text (llama_token id) const;
102 float token_get_score(llama_token id) const;
103 llama_token_attr token_get_attr (llama_token id) const;
104
105 llama_token token_bos() const;
106 llama_token token_eos() const;
107 llama_token token_eot() const;
108 llama_token token_eom() const;
109 llama_token token_unk() const;
110 llama_token token_sep() const;
111 llama_token token_nl () const;
112 llama_token token_pad() const;
113 llama_token token_mask() const;
114
115 llama_token token_prefix() const;
116 llama_token token_middle() const;
117 llama_token token_suffix() const;
118
119 llama_token token_fim_pre() const;
120 llama_token token_fim_suf() const;
121 llama_token token_fim_mid() const;
122 llama_token token_fim_pad() const;
123 llama_token token_fim_rep() const;
124 llama_token token_fim_sep() const;
125
126 bool get_add_space_prefix () const;
127 bool get_add_bos () const;
128 bool get_add_eos () const;
129 bool get_add_sep () const;
130 bool get_ignore_merges () const;
131 bool get_clean_spaces () const;
132 bool get_remove_extra_whitespaces () const;
133 bool get_escape_whitespaces () const;
134 bool get_treat_whitespace_as_suffix() const;
135
136 int max_token_len() const;
137
138 int find_bpe_rank(const std::string & token_left, const std::string & token_right) const;
139 std::vector<std::string> get_bpe_merges() const;
140
141 std::vector<char> get_precompiled_charsmap() const;
142
143 int32_t tokenize(
144 const char * text,
145 int32_t text_len,
146 llama_token * tokens,
147 int32_t n_tokens_max,
148 bool add_special,
149 bool parse_special) const;
150
151 std::vector<llama_token> tokenize(
152 const std::string & raw_text,
153 bool add_special,
154 bool parse_special = false) const;
155
156 // does not write null-terminator to buf
157 int32_t token_to_piece(
158 llama_token token,
159 char * buf,
160 int32_t length,
161 int32_t lstrip,
162 bool special) const;
163
164 // use cached data
165 const std::string & token_to_piece(llama_token token) const;
166
167 int32_t detokenize(
168 const llama_token * tokens,
169 int32_t n_tokens,
170 char * text,
171 int32_t text_len_max,
172 bool remove_special,
173 bool unparse_special) const;
174
175 std::string detokenize(
176 const std::vector<llama_token> & tokens,
177 bool special) const;
178
179 void print_info() const;
180
181private:
182 struct impl;
183 std::unique_ptr<impl> pimpl;
184};