kernel/resolution/
format.rs1use serde::{Deserialize, Serialize};
4
5use crate::records::{Capability, ExecutionMode, Modality};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[serde(rename_all = "kebab-case")]
12pub enum ModelFormat {
13 Gguf,
15 GgmlBin,
17 Safetensors,
19 MlxSafetensors,
21 Diffusers,
23 OllamaStore,
25 Builtin,
27 Endpoint,
29 Unknown,
31}
32
33#[derive(Debug, Clone, PartialEq)]
36pub struct GgufArchitectureProfile {
37 pub modality: Modality,
39 pub capabilities: Vec<Capability>,
41 pub execution: ExecutionMode,
43}
44
45#[derive(Debug, Clone, PartialEq)]
47pub struct GgufFacts {
48 pub architecture: Option<String>,
50 pub context_length: Option<i64>,
52 pub has_chat_template: bool,
54}
55
56pub fn gguf_architecture_profile(architecture: &str) -> Option<GgufArchitectureProfile> {
58 let profile = |modality, capabilities, execution| GgufArchitectureProfile {
59 modality,
60 capabilities,
61 execution,
62 };
63 match architecture {
64 "whisper" => Some(profile(
65 Modality::audio(),
66 vec![Capability::transcribe()],
67 ExecutionMode::Stream,
68 )),
69 "qwen2vl" | "mllama" => Some(profile(
70 Modality::text(),
71 vec![
72 Capability::chat(),
73 Capability::complete(),
74 Capability::see(),
75 ],
76 ExecutionMode::Stream,
77 )),
78 "clip" => Some(profile(Modality::vision(), vec![], ExecutionMode::Sync)),
79 "bert" | "nomic-bert" => Some(profile(
80 Modality::embedding(),
81 vec![Capability::embed()],
82 ExecutionMode::Stream,
83 )),
84 _ => None,
85 }
86}
87
88pub fn ollama_chat_profile() -> GgufArchitectureProfile {
90 GgufArchitectureProfile {
91 modality: Modality::text(),
92 capabilities: vec![Capability::chat(), Capability::complete()],
93 execution: ExecutionMode::Stream,
94 }
95}
96
97pub fn ollama_vision_profile() -> GgufArchitectureProfile {
99 GgufArchitectureProfile {
100 modality: Modality::text(),
101 capabilities: vec![
102 Capability::chat(),
103 Capability::complete(),
104 Capability::see(),
105 ],
106 execution: ExecutionMode::Stream,
107 }
108}
109
110pub fn ollama_profile(has_projector: bool, weight_path: Option<&str>) -> GgufArchitectureProfile {
118 if has_projector {
119 return ollama_vision_profile();
120 }
121 if let Some(path) = weight_path
122 && let Some(architecture) =
123 crate::resolution::gguf::gguf_general_architecture(std::path::Path::new(path))
124 && let Some(profile) = gguf_architecture_profile(&architecture)
125 {
126 return profile;
127 }
128 ollama_chat_profile()
129}