use serde::{Deserialize, Serialize};
use crate::records::{Capability, ExecutionMode, Modality};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ModelFormat {
Gguf,
GgmlBin,
Safetensors,
MlxSafetensors,
Diffusers,
OllamaStore,
Builtin,
Endpoint,
Unknown,
}
#[derive(Debug, Clone, PartialEq)]
pub struct GgufArchitectureProfile {
pub modality: Modality,
pub capabilities: Vec<Capability>,
pub execution: ExecutionMode,
}
#[derive(Debug, Clone, PartialEq)]
pub struct GgufFacts {
pub architecture: Option<String>,
pub context_length: Option<i64>,
pub has_chat_template: bool,
}
pub fn gguf_architecture_profile(architecture: &str) -> Option<GgufArchitectureProfile> {
let profile = |modality, capabilities, execution| GgufArchitectureProfile {
modality,
capabilities,
execution,
};
match architecture {
"whisper" => Some(profile(
Modality::audio(),
vec![Capability::transcribe()],
ExecutionMode::Stream,
)),
"qwen2vl" | "mllama" => Some(profile(
Modality::text(),
vec![
Capability::chat(),
Capability::complete(),
Capability::see(),
],
ExecutionMode::Stream,
)),
"clip" => Some(profile(Modality::vision(), vec![], ExecutionMode::Sync)),
"bert" | "nomic-bert" => Some(profile(
Modality::embedding(),
vec![Capability::embed()],
ExecutionMode::Stream,
)),
_ => None,
}
}
pub fn ollama_chat_profile() -> GgufArchitectureProfile {
GgufArchitectureProfile {
modality: Modality::text(),
capabilities: vec![Capability::chat(), Capability::complete()],
execution: ExecutionMode::Stream,
}
}
pub fn ollama_vision_profile() -> GgufArchitectureProfile {
GgufArchitectureProfile {
modality: Modality::text(),
capabilities: vec![
Capability::chat(),
Capability::complete(),
Capability::see(),
],
execution: ExecutionMode::Stream,
}
}
pub fn ollama_profile(has_projector: bool, weight_path: Option<&str>) -> GgufArchitectureProfile {
if has_projector {
return ollama_vision_profile();
}
if let Some(path) = weight_path
&& let Some(architecture) =
crate::resolution::gguf::gguf_general_architecture(std::path::Path::new(path))
&& let Some(profile) = gguf_architecture_profile(&architecture)
{
return profile;
}
ollama_chat_profile()
}