| 147 | } |
| 148 | |
| 149 | struct common_sampler * common_sampler_init(const struct llama_model * model, const struct common_params_sampling & params) { |
| 150 | const llama_vocab * vocab = llama_model_get_vocab(model); |
| 151 | |
| 152 | llama_sampler_chain_params lparams = llama_sampler_chain_default_params(); |
| 153 | |
| 154 | lparams.no_perf = params.no_perf; |
| 155 | |
| 156 | struct llama_sampler * grmr; |
| 157 | if (params.grammar.compare(0, 11, "%llguidance") == 0) { |
| 158 | #ifdef LLAMA_USE_LLGUIDANCE |
| 159 | grmr = llama_sampler_init_llg(vocab, "lark", params.grammar.c_str()); |
| 160 | #else |
| 161 | GGML_ABORT("llguidance (cmake -DLLAMA_LLGUIDANCE=ON) is not enabled"); |
| 162 | #endif // LLAMA_USE_LLGUIDANCE |
| 163 | } else { |
| 164 | std::vector<std::string> trigger_patterns; |
| 165 | std::vector<std::string> patterns_anywhere; |
| 166 | std::vector<llama_token> trigger_tokens; |
| 167 | for (const auto & trigger : params.grammar_triggers) { |
| 168 | switch (trigger.type) { |
| 169 | case COMMON_GRAMMAR_TRIGGER_TYPE_WORD: |
| 170 | { |
| 171 | const auto & word = trigger.value; |
| 172 | patterns_anywhere.push_back(regex_escape(word)); |
| 173 | break; |
| 174 | } |
| 175 | case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN: |
| 176 | { |
| 177 | patterns_anywhere.push_back(trigger.value); |
| 178 | break; |
| 179 | } |
| 180 | case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL: |
| 181 | { |
| 182 | trigger_patterns.push_back(trigger.value); |
| 183 | break; |
| 184 | } |
| 185 | case COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN: |
| 186 | { |
| 187 | const auto token = trigger.token; |
| 188 | trigger_tokens.push_back(token); |
| 189 | break; |
| 190 | } |
| 191 | default: |
| 192 | GGML_ASSERT(false && "unknown trigger type"); |
| 193 | } |
| 194 | } |
| 195 | |
| 196 | if (!patterns_anywhere.empty()) { |
| 197 | trigger_patterns.push_back("^[\\s\\S]*?(" + string_join(patterns_anywhere, "|") + ")[\\s\\S]*"); |
| 198 | } |
| 199 | |
| 200 | std::vector<const char *> trigger_patterns_c; |
| 201 | trigger_patterns_c.reserve(trigger_patterns.size()); |
| 202 | for (const auto & regex : trigger_patterns) { |
| 203 | trigger_patterns_c.push_back(regex.c_str()); |
| 204 | } |
| 205 | |
| 206 | grmr = params.grammar_lazy |