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};