use std::{collections::HashMap, convert::TryFrom, fmt::Display, str::FromStr, sync::OnceLock};
use super::{model_info::ModelInfo, ModelTrait};
static MODEL_MAP: OnceLock<HashMap<EmbeddingModel, ModelInfo<EmbeddingModel>>> = OnceLock::new();
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
pub enum EmbeddingModel {
AllMiniLML6V2,
AllMiniLML6V2Q,
AllMiniLML12V2,
AllMiniLML12V2Q,
AllMpnetBaseV2,
BGEBaseENV15,
BGEBaseENV15Q,
BGELargeENV15,
BGELargeENV15Q,
#[default]
BGESmallENV15,
BGESmallENV15Q,
NomicEmbedTextV1,
NomicEmbedTextV15,
NomicEmbedTextV15Q,
ParaphraseMLMiniLML12V2,
ParaphraseMLMiniLML12V2Q,
ParaphraseMLMpnetBaseV2,
BGESmallZHV15,
BGELargeZHV15,
BGEM3,
ModernBertEmbedLarge,
MultilingualE5Small,
MultilingualE5Base,
MultilingualE5Large,
MxbaiEmbedLargeV1,
MxbaiEmbedLargeV1Q,
GTEBaseENV15,
GTEBaseENV15Q,
GTELargeENV15,
GTELargeENV15Q,
ClipVitB32,
JinaEmbeddingsV2BaseCode,
JinaEmbeddingsV2BaseEN,
EmbeddingGemma300M,
SnowflakeArcticEmbedXS,
SnowflakeArcticEmbedXSQ,
SnowflakeArcticEmbedS,
SnowflakeArcticEmbedSQ,
SnowflakeArcticEmbedM,
SnowflakeArcticEmbedMQ,
SnowflakeArcticEmbedMLong,
SnowflakeArcticEmbedMLongQ,
SnowflakeArcticEmbedL,
SnowflakeArcticEmbedLQ,
}
fn init_models_map() -> HashMap<EmbeddingModel, ModelInfo<EmbeddingModel>> {
let models_list = vec![
ModelInfo {
model: EmbeddingModel::AllMiniLML6V2,
dim: 384,
description: String::from("Sentence Transformer model, MiniLM-L6-v2"),
model_code: String::from("Qdrant/all-MiniLM-L6-v2-onnx"),
model_file: String::from("model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::AllMiniLML6V2Q,
dim: 384,
description: String::from("Quantized Sentence Transformer model, MiniLM-L6-v2"),
model_code: String::from("Xenova/all-MiniLM-L6-v2"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::AllMiniLML12V2,
dim: 384,
description: String::from("Sentence Transformer model, MiniLM-L12-v2"),
model_code: String::from("Xenova/all-MiniLM-L12-v2"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::AllMiniLML12V2Q,
dim: 384,
description: String::from("Quantized Sentence Transformer model, MiniLM-L12-v2"),
model_code: String::from("Xenova/all-MiniLM-L12-v2"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::AllMpnetBaseV2,
dim: 768,
description: String::from("Sentence Transformer model, mpnet-base-v2"),
model_code: String::from("Xenova/all-mpnet-base-v2"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGEBaseENV15,
dim: 768,
description: String::from("v1.5 release of the base English model"),
model_code: String::from("Xenova/bge-base-en-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGEBaseENV15Q,
dim: 768,
description: String::from("Quantized v1.5 release of the large English model"),
model_code: String::from("Qdrant/bge-base-en-v1.5-onnx-Q"),
model_file: String::from("model_optimized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGELargeENV15,
dim: 1024,
description: String::from("v1.5 release of the large English model"),
model_code: String::from("Xenova/bge-large-en-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGELargeENV15Q,
dim: 1024,
description: String::from("Quantized v1.5 release of the large English model"),
model_code: String::from("Qdrant/bge-large-en-v1.5-onnx-Q"),
model_file: String::from("model_optimized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGESmallENV15,
dim: 384,
description: String::from("v1.5 release of the fast and default English model"),
model_code: String::from("Xenova/bge-small-en-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGESmallENV15Q,
dim: 384,
description: String::from(
"Quantized v1.5 release of the fast and default English model",
),
model_code: String::from("Qdrant/bge-small-en-v1.5-onnx-Q"),
model_file: String::from("model_optimized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::NomicEmbedTextV1,
dim: 768,
description: String::from("8192 context length english model"),
model_code: String::from("nomic-ai/nomic-embed-text-v1"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::NomicEmbedTextV15,
dim: 768,
description: String::from("v1.5 release of the 8192 context length english model"),
model_code: String::from("nomic-ai/nomic-embed-text-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::NomicEmbedTextV15Q,
dim: 768,
description: String::from(
"Quantized v1.5 release of the 8192 context length english model",
),
model_code: String::from("nomic-ai/nomic-embed-text-v1.5"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::ParaphraseMLMiniLML12V2Q,
dim: 384,
description: String::from("Quantized Multi-lingual model"),
model_code: String::from("Qdrant/paraphrase-multilingual-MiniLM-L12-v2-onnx-Q"),
model_file: String::from("model_optimized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::ParaphraseMLMiniLML12V2,
dim: 384,
description: String::from("Multi-lingual model"),
model_code: String::from("Xenova/paraphrase-multilingual-MiniLM-L12-v2"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::ParaphraseMLMpnetBaseV2,
dim: 768,
description: String::from(
"Sentence-transformers model for tasks like clustering or semantic search",
),
model_code: String::from("Xenova/paraphrase-multilingual-mpnet-base-v2"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGESmallZHV15,
dim: 512,
description: String::from("v1.5 release of the small Chinese model"),
model_code: String::from("Xenova/bge-small-zh-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGELargeZHV15,
dim: 1024,
description: String::from("v1.5 release of the large Chinese model"),
model_code: String::from("Xenova/bge-large-zh-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::BGEM3,
dim: 1024,
description: String::from(
"Multilingual M3 model with 8192 context length, supports 100+ languages",
),
model_code: String::from("BAAI/bge-m3"),
model_file: String::from("onnx/model.onnx"),
additional_files: vec![
"onnx/model.onnx_data".to_string(),
"onnx/Constant_7_attr__value".to_string(),
],
output_key: None,
},
ModelInfo {
model: EmbeddingModel::ModernBertEmbedLarge,
dim: 1024,
description: String::from("Large model of ModernBert Text Embeddings"),
model_code: String::from("lightonai/modernbert-embed-large"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::MultilingualE5Small,
dim: 384,
description: String::from("Small model of multilingual E5 Text Embeddings"),
model_code: String::from("intfloat/multilingual-e5-small"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::MultilingualE5Base,
dim: 768,
description: String::from("Base model of multilingual E5 Text Embeddings"),
model_code: String::from("intfloat/multilingual-e5-base"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::MultilingualE5Large,
dim: 1024,
description: String::from("Large model of multilingual E5 Text Embeddings"),
model_code: String::from("Qdrant/multilingual-e5-large-onnx"),
model_file: String::from("model.onnx"),
additional_files: vec!["model.onnx_data".to_string()],
output_key: None,
},
ModelInfo {
model: EmbeddingModel::MxbaiEmbedLargeV1,
dim: 1024,
description: String::from("Large English embedding model from MixedBreed.ai"),
model_code: String::from("mixedbread-ai/mxbai-embed-large-v1"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::MxbaiEmbedLargeV1Q,
dim: 1024,
description: String::from("Quantized Large English embedding model from MixedBreed.ai"),
model_code: String::from("mixedbread-ai/mxbai-embed-large-v1"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::GTEBaseENV15,
dim: 768,
description: String::from("Large multilingual embedding model from Alibaba"),
model_code: String::from("Alibaba-NLP/gte-base-en-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::GTEBaseENV15Q,
dim: 768,
description: String::from("Quantized Large multilingual embedding model from Alibaba"),
model_code: String::from("Alibaba-NLP/gte-base-en-v1.5"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::GTELargeENV15,
dim: 1024,
description: String::from("Large multilingual embedding model from Alibaba"),
model_code: String::from("Alibaba-NLP/gte-large-en-v1.5"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::GTELargeENV15Q,
dim: 1024,
description: String::from("Quantized Large multilingual embedding model from Alibaba"),
model_code: String::from("Alibaba-NLP/gte-large-en-v1.5"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::ClipVitB32,
dim: 512,
description: String::from("CLIP text encoder based on ViT-B/32"),
model_code: String::from("Qdrant/clip-ViT-B-32-text"),
model_file: String::from("model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::JinaEmbeddingsV2BaseCode,
dim: 768,
description: String::from("Jina embeddings v2 base code"),
model_code: String::from("jinaai/jina-embeddings-v2-base-code"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::JinaEmbeddingsV2BaseEN,
dim: 768,
description: String::from("Jina embeddings v2 base English"),
model_code: String::from("jinaai/jina-embeddings-v2-base-en"),
model_file: String::from("model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::EmbeddingGemma300M,
dim: 768,
description: String::from("EmbeddingGemma is a 300M parameter from Google"),
model_code: String::from("onnx-community/embeddinggemma-300m-ONNX"),
model_file: String::from("onnx/model.onnx"),
additional_files: vec!["onnx/model.onnx_data".to_string()],
output_key: Some(crate::OutputKey::ByName("sentence_embedding")),
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedXS,
dim: 384,
description: String::from("Snowflake Arctic embed model, xs"),
model_code: String::from("snowflake/snowflake-arctic-embed-xs"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedXSQ,
dim: 384,
description: String::from("Quantized Snowflake Arctic embed model, xs"),
model_code: String::from("snowflake/snowflake-arctic-embed-xs"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedS,
dim: 384,
description: String::from("Snowflake Arctic embed model, small"),
model_code: String::from("snowflake/snowflake-arctic-embed-s"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedSQ,
dim: 384,
description: String::from("Quantized Snowflake Arctic embed model, small"),
model_code: String::from("snowflake/snowflake-arctic-embed-s"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedM,
dim: 768,
description: String::from("Snowflake Arctic embed model, medium"),
model_code: String::from("Snowflake/snowflake-arctic-embed-m"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedMQ,
dim: 768,
description: String::from("Quantized Snowflake Arctic embed model, medium"),
model_code: String::from("Snowflake/snowflake-arctic-embed-m"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedMLong,
dim: 768,
description: String::from("Snowflake Arctic embed model, medium with 2048 context"),
model_code: String::from("snowflake/snowflake-arctic-embed-m-long"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedMLongQ,
dim: 768,
description: String::from(
"Quantized Snowflake Arctic embed model, medium with 2048 context",
),
model_code: String::from("snowflake/snowflake-arctic-embed-m-long"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedL,
dim: 1024,
description: String::from("Snowflake Arctic embed model, large"),
model_code: String::from("snowflake/snowflake-arctic-embed-l"),
model_file: String::from("onnx/model.onnx"),
additional_files: Vec::new(),
output_key: None,
},
ModelInfo {
model: EmbeddingModel::SnowflakeArcticEmbedLQ,
dim: 1024,
description: String::from("Quantized Snowflake Arctic embed model, large"),
model_code: String::from("snowflake/snowflake-arctic-embed-l"),
model_file: String::from("onnx/model_quantized.onnx"),
additional_files: Vec::new(),
output_key: None,
},
];
models_list
.into_iter()
.fold(HashMap::new(), |mut map, model| {
map.insert(model.model.clone(), model);
map
})
}
pub fn models_map() -> &'static HashMap<EmbeddingModel, ModelInfo<EmbeddingModel>> {
MODEL_MAP.get_or_init(init_models_map)
}
pub fn models_list() -> Vec<ModelInfo<EmbeddingModel>> {
models_map().values().cloned().collect()
}
impl ModelTrait for EmbeddingModel {
type Model = Self;
fn get_model_info(model: &EmbeddingModel) -> Option<&ModelInfo<EmbeddingModel>> {
models_map().get(model)
}
}
impl Display for EmbeddingModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl FromStr for EmbeddingModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
models_map()
.keys()
.find(|m| format!("{:?}", m).eq_ignore_ascii_case(s))
.cloned()
.ok_or_else(|| format!("Unknown embedding model: {s}"))
}
}
impl TryFrom<String> for EmbeddingModel {
type Error = String;
fn try_from(value: String) -> Result<Self, Self::Error> {
value.parse()
}
}