| 177 | } |
| 178 | |
| 179 | struct common_sampler * common_sampler_init(const struct llama_model * model, struct common_params_sampling & params) { |
| 180 | const llama_vocab * vocab = llama_model_get_vocab(model); |
| 181 | |
| 182 | llama_sampler_chain_params lparams = llama_sampler_chain_default_params(); |
| 183 | |
| 184 | lparams.no_perf = params.no_perf; |
| 185 | |
| 186 | llama_sampler * grmr = nullptr; |
| 187 | llama_sampler * chain = llama_sampler_chain_init(lparams); |
| 188 | |
| 189 | std::vector<llama_sampler *> samplers; |
| 190 | |
| 191 | if (params.grammar.compare(0, 11, "%llguidance") == 0) { |
| 192 | #ifdef LLAMA_USE_LLGUIDANCE |
| 193 | grmr = llama_sampler_init_llg(vocab, "lark", params.grammar.c_str()); |
| 194 | #else |
| 195 | GGML_ABORT("llguidance (cmake -DLLAMA_LLGUIDANCE=ON) is not enabled"); |
| 196 | #endif // LLAMA_USE_LLGUIDANCE |
| 197 | } else { |
| 198 | std::vector<std::string> trigger_patterns; |
| 199 | std::vector<llama_token> trigger_tokens; |
| 200 | for (const auto & trigger : params.grammar_triggers) { |
| 201 | switch (trigger.type) { |
| 202 | case COMMON_GRAMMAR_TRIGGER_TYPE_WORD: |
| 203 | { |
| 204 | const auto & word = trigger.value; |
| 205 | trigger_patterns.push_back(regex_escape(word)); |
| 206 | break; |
| 207 | } |
| 208 | case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN: |
| 209 | { |
| 210 | trigger_patterns.push_back(trigger.value); |
| 211 | break; |
| 212 | } |
| 213 | case COMMON_GRAMMAR_TRIGGER_TYPE_PATTERN_FULL: |
| 214 | { |
| 215 | const auto & pattern = trigger.value; |
| 216 | std::string anchored = "^$"; |
| 217 | if (!pattern.empty()) { |
| 218 | anchored = (pattern.front() != '^' ? "^" : "") |
| 219 | + pattern |
| 220 | + (pattern.back() != '$' ? "$" : ""); |
| 221 | } |
| 222 | trigger_patterns.push_back(anchored); |
| 223 | break; |
| 224 | } |
| 225 | case COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN: |
| 226 | { |
| 227 | const auto token = trigger.token; |
| 228 | trigger_tokens.push_back(token); |
| 229 | break; |
| 230 | } |
| 231 | default: |
| 232 | GGML_ASSERT(false && "unknown trigger type"); |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | std::vector<const char *> trigger_patterns_c; |