mistralrs_core/pipeline/
llg.rs

1use std::sync::Arc;
2
3use anyhow::Result;
4use llguidance::{api::TopLevelGrammar, ParserFactory};
5use tokenizers::Tokenizer;
6
7use crate::Constraint;
8
9pub fn build_llg_factory(tokenizer: Tokenizer) -> Result<Arc<ParserFactory>> {
10    let env =
11        toktrie_hf_tokenizers::ByteTokenizer::from_tokenizer(tokenizer)?.into_tok_env(None)?;
12    let factory = ParserFactory::new_simple(&env)?;
13    Ok(Arc::new(factory))
14}
15
16pub fn llg_grammar_from_constraint(constraint: &Constraint) -> Result<Option<TopLevelGrammar>> {
17    let grm = match constraint {
18        Constraint::Regex(regex) => TopLevelGrammar::from_regex(regex),
19        Constraint::Lark(lark) => TopLevelGrammar::from_lark(lark.clone()),
20        Constraint::JsonSchema(value) => TopLevelGrammar::from_json_schema(value.clone()),
21        Constraint::Llguidance(value) => value.clone(),
22        Constraint::None => return Ok(None),
23    };
24    Ok(Some(grm))
25}
26
27pub fn constraint_from_llg_grammar(
28    factory: &ParserFactory,
29    grm: TopLevelGrammar,
30) -> Result<llguidance::Matcher> {
31    let parser = factory.create_parser(grm)?;
32    Ok(llguidance::Matcher::new(Ok(parser)))
33}