#![allow(clippy::large_enum_variant)]
#[cfg(feature = "bpe")]
mod bpe;
#[cfg(feature = "word_level")]
mod word_level;
use serde::Deserialize;
#[derive(Clone, Debug, Deserialize)]
#[serde(tag = "type")]
pub enum ModelConfig {
#[cfg(feature = "bpe")]
BPE(Box<bpe::Bpe>),
#[cfg(feature = "word_level")]
WordLevel(word_level::WordLevel),
#[serde(untagged)]
Other(serde_json::Value),
}
#[derive(Debug)]
#[non_exhaustive]
pub enum Model {
#[cfg(feature = "bpe")]
BPE(bpe::Bpe),
#[cfg(feature = "word_level")]
WordLevel(word_level::WordLevel),
#[allow(unused)]
#[cfg(not(any(feature = "bpe", feature = "word_level")))]
Placeholder,
}
impl Model {
#[inline]
pub fn from_config(config: ModelConfig) -> Result<Self, String> {
match config {
#[cfg(feature = "bpe")]
ModelConfig::BPE(m) => Ok(Self::BPE(*m)),
#[cfg(feature = "word_level")]
ModelConfig::WordLevel(m) => Ok(Self::WordLevel(m)),
ModelConfig::Other(value) => {
let info = value.to_string();
Err(format!("unsupported model type: `{info}`"))
}
}
}
#[inline]
pub fn count_tokens(&self, input: &str) -> Result<usize, String> {
match self {
#[cfg(feature = "bpe")]
Self::BPE(m) => m.count_tokens(input),
#[cfg(feature = "word_level")]
Self::WordLevel(m) => m.count_tokens(input),
#[cfg(not(any(feature = "bpe", feature = "word_level")))]
Self::Placeholder => unreachable!(),
}
}
}