#![allow(dead_code)]
use std::path::Path;
use anyhow::{anyhow, Result};
use mlx_native::gguf::GgufFile;
pub use crate::inference::models::bert::tokenizer::{BertVocab, BertWpmTokenizer};
pub fn build_nomic_wordpiece_tokenizer(gguf_path: &Path) -> Result<BertWpmTokenizer> {
let gguf = GgufFile::open(gguf_path)
.map_err(|e| anyhow!("open nomic GGUF '{}': {e}", gguf_path.display()))?;
let vocab = BertVocab::from_gguf(&gguf)
.map_err(|e| anyhow!("parse nomic-bert WPM vocab from GGUF: {e}"))?;
Ok(BertWpmTokenizer::new(&vocab))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nomic_gguf_tokenizes_hello_world_with_special_tokens() {
let path = Path::new("/opt/hf2q/models/bert-test/nomic-embed-text-v1.5-f16.gguf");
if !path.exists() {
eprintln!("skipping: nomic GGUF fixture not at {}", path.display());
return;
}
let tok = build_nomic_wordpiece_tokenizer(path).expect("build tokenizer");
let ids = tok.encode("hello world", true);
assert_eq!(
ids.len(),
4,
"expected 4 tokens for [CLS] hello world [SEP], got {ids:?}"
);
assert_eq!(
ids.first(),
Some(&101u32),
"expected [CLS]=101, got {ids:?}"
);
assert_eq!(ids.last(), Some(&102u32), "expected [SEP]=102, got {ids:?}");
}
}