1mod flatbuf;
11mod gguf;
12mod litertlm;
13mod metadata;
14mod protomin;
15mod safetensors;
16mod source;
17mod spm;
18mod tflite;
19mod tokenizer;
20
21pub use gguf::GgufSource;
22
23pub mod quants {
28 pub use crate::gguf::{
29 dequantize_q4_0, dequantize_q4_k, dequantize_q5_0, dequantize_q5_k, dequantize_q6_k,
30 dequantize_q8_0,
31 };
32}
33pub use metadata::{Activation, AttentionPattern, ModelMetadata, RopeScaling, VisionConfig};
34pub use safetensors::SafetensorsSource;
35pub use litertlm::{SectionInfo, read_sections as litertlm_read_sections};
36pub use source::{ModelSource, QuantFormat, QuantTensor, SamplerConfig, TensorDtype, TensorReader};
37pub use spm::{ensure_tokenizer_json_from_spm, spm_added_tokens};
38pub use tflite::TfliteSource;
39pub use tokenizer::TokenizerSpec;
40
41use std::path::Path;
42
43pub fn open_model_source(path: impl AsRef<Path>) -> Result<Box<dyn ModelSource>> {
47 let path = path.as_ref();
48 if path.is_file() && path.extension().is_some_and(|e| e == "gguf") {
49 return Ok(Box::new(GgufSource::load(path)?));
50 }
51 if path.is_file() && path.extension().is_some_and(|e| e == "task" || e == "tflite") {
52 return Ok(Box::new(TfliteSource::load(path)?));
53 }
54 if path.is_file() && path.extension().is_some_and(|e| e == "litertlm") {
55 return litertlm::open_litertlm(path);
56 }
57 if path.is_dir() {
58 return Ok(Box::new(SafetensorsSource::load(path)?));
59 }
60 Err(FormatError::MissingFile(path.display().to_string()))
61}
62
63#[derive(Debug, thiserror::Error)]
65pub enum FormatError {
66 #[error("io error: {0}")]
68 Io(#[from] std::io::Error),
69
70 #[error("json error in {context}: {source}")]
72 Json {
73 context: String,
75 source: serde_json::Error,
77 },
78
79 #[error("safetensors error: {0}")]
81 Safetensors(String),
82
83 #[error("tensor not found: {0}")]
85 TensorNotFound(String),
86
87 #[error("unsupported dtype for tensor {tensor}: {dtype}")]
89 UnsupportedDtype {
90 tensor: String,
92 dtype: String,
94 },
95
96 #[error("missing file: {0}")]
98 MissingFile(String),
99
100 #[error("missing config field: {0}")]
102 MissingField(String),
103}
104
105pub type Result<T> = std::result::Result<T, FormatError>;