1use crate::{LocalModel, ModelFamily, ModelFile};
4
5const MEMORY_KOKORO: u64 = 1_736_507_392;
7
8pub const CATALOG: &[LocalModel] = &[
16 LocalModel {
17 id: "qwen3-0.6b-q4",
18 name: "Qwen3 0.6B",
19 license: "Apache 2.0",
20 family: ModelFamily::Qwen3,
21 memory: 1_541_597_464,
22 understood: None,
23 files: &[
24 ModelFile {
25 name: "model.gguf",
26 url: "https://huggingface.co/unsloth/Qwen3-0.6B-GGUF/resolve/50968a4468ef4233ed78cd7c3de230dd1d61a56b/Qwen3-0.6B-Q4_K_M.gguf",
27 bytes: 396_705_472,
28 sha256: "ac2d97712095a558e31573f62f466a3f9d93990898b0ec79d7c974c1780d524a",
29 },
30 ModelFile {
31 name: "tokenizer.json",
32 url: "https://huggingface.co/Qwen/Qwen3-0.6B/resolve/c1899de289a04d12100db370d81485cdf75e47ca/tokenizer.json",
33 bytes: 11_422_654,
34 sha256: "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4",
35 },
36 ],
37 },
38 LocalModel {
39 id: "qwen2.5-0.5b-q4",
40 name: "Qwen 2.5 0.5B",
41 license: "Apache 2.0",
42 family: ModelFamily::Qwen2,
43 memory: 1_388_807_896,
44 understood: Some(34),
45 files: &[
46 ModelFile {
47 name: "model.gguf",
48 url: "https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/9217f5db79a29953eb74d5343926648285ec7e67/qwen2.5-0.5b-instruct-q4_k_m.gguf",
49 bytes: 491_400_032,
50 sha256: "74a4da8c9fdbcd15bd1f6d01d621410d31c6fc00986f5eb687824e7b93d7a9db",
51 },
52 ModelFile {
53 name: "tokenizer.json",
54 url: "https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct/resolve/7ae557604adf67be50417f59c2c2f167def9a775/tokenizer.json",
55 bytes: 7_031_645,
56 sha256: "c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539",
57 },
58 ],
59 },
60 LocalModel {
61 id: "llama3.2-1b-q4",
62 name: "Llama 3.2 1B",
63 license: "Llama 3.2",
64 family: ModelFamily::Llama3,
65 memory: 3_399_372_136,
66 understood: Some(47),
67 files: &[
68 ModelFile {
69 name: "model.gguf",
70 url: "https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/067b946cf014b7c697f3654f621d577a3e3afd1c/Llama-3.2-1B-Instruct-Q4_K_M.gguf",
71 bytes: 807_694_464,
72 sha256: "6f85a640a97cf2bf5b8e764087b1e83da0fdb51d7c9fab7d0fece9385611df83",
73 },
74 ModelFile {
75 name: "tokenizer.json",
76 url: "https://huggingface.co/unsloth/Llama-3.2-1B-Instruct/resolve/5a8abab4a5d6f164389b1079fb721cfab8d7126c/tokenizer.json",
77 bytes: 17_209_920,
78 sha256: "6b9e4e7fb171f92fd137b777cc2714bf87d11576700a1dcd7a399e7bbe39537b",
79 },
80 ],
81 },
82 LocalModel {
83 id: "gemma3-1b-q4",
84 name: "Gemma 3 1B",
85 license: "Gemma",
86 family: ModelFamily::Gemma3,
87 memory: 6_300_000_000,
88 understood: None,
89 files: &[
90 ModelFile {
91 name: "model.gguf",
92 url: "https://huggingface.co/bartowski/google_gemma-3-1b-it-GGUF/resolve/116f76234503685a98f572982177b11d44ec8ff1/google_gemma-3-1b-it-Q4_K_M.gguf",
93 bytes: 806_058_496,
94 sha256: "12bf0fff8815d5f73a3c9b586bd8fee8e7b248c935de70dec367679873d0f29d",
95 },
96 ModelFile {
97 name: "tokenizer.json",
98 url: "https://huggingface.co/unsloth/gemma-3-1b-it/resolve/5b11413a10db4e486ef16a20101fd028f8f2499c/tokenizer.json",
99 bytes: 33_384_568,
100 sha256: "4667f2089529e8e7657cfb6d1c19910ae71ff5f28aa7ab2ff2763330affad795",
101 },
102 ],
103 },
104 LocalModel {
105 id: "lfm3-1.7b-q4",
106 name: "LFM3 1.7B",
107 license: "LFM Open 1.0",
108 family: ModelFamily::Lfm3,
109 memory: 3_969_552_296,
110 understood: Some(84),
111 files: &[
112 ModelFile {
113 name: "model.gguf",
114 url: "https://huggingface.co/LiquidAI/LFM3-1.7B-GGUF/resolve/bad5729bba61d076fff20d2548e62526665af215/LFM3-1.7B-Q4_K_M.gguf",
115 bytes: 1_099_627_808,
116 sha256: "3793e1e6e2266919d6e015287221b41100175a98eddaba92e111aed3b05c93c4",
117 },
118 ModelFile {
119 name: "tokenizer.json",
120 url: "https://huggingface.co/LiquidAI/LFM3-1.7B/resolve/ac2586a34f1a1c03329dbdcdefabd8b6478ddaa7/tokenizer.json",
121 bytes: 17_908_635,
122 sha256: "7e226e34bface23ccf6e495d157bf77186c1c30a7659880e1a8994db528c3701",
123 },
124 ],
125 },
126 LocalModel {
127 id: "qwen3-1.7b-q4",
128 name: "Qwen3 1.7B",
129 license: "Apache 2.0",
130 family: ModelFamily::Qwen3,
131 memory: 4_303_376_896,
132 understood: Some(83),
133 files: &[
134 ModelFile {
135 name: "model.gguf",
136 url: "https://huggingface.co/unsloth/Qwen3-1.7B-GGUF/resolve/d7f544eead698dbd1f15126ef60b45a1e1933222/Qwen3-1.7B-Q4_K_M.gguf",
137 bytes: 1_107_409_472,
138 sha256: "b139949c5bd74937ad8ed8c8cf3d9ffb1e99c866c823204dc42c0d91fa181897",
139 },
140 ModelFile {
141 name: "tokenizer.json",
142 url: "https://huggingface.co/Qwen/Qwen3-1.7B/resolve/70d244cc86ccca08cf5af4e1e306ecf908b1ad5e/tokenizer.json",
143 bytes: 11_422_654,
144 sha256: "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4",
145 },
146 ],
147 },
148 LocalModel {
149 id: "qwen2.5-1.5b-q4",
150 name: "Qwen 2.5 1.5B",
151 license: "Apache 2.0",
152 family: ModelFamily::Qwen2,
153 memory: 3_200_000_000,
154 understood: None,
155 files: &[
156 ModelFile {
157 name: "model.gguf",
158 url: "https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF/resolve/91cad51170dc346986eccefdc2dd33a9da36ead9/qwen2.5-1.5b-instruct-q4_k_m.gguf",
159 bytes: 1_117_320_736,
160 sha256: "6a1a2eb6d15622bf3c96857206351ba97e1af16c30d7a74ee38970e434e9407e",
161 },
162 ModelFile {
163 name: "tokenizer.json",
164 url: "https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct/resolve/989aa7980e4cf806f80c7fef2b1adb7bc71aa306/tokenizer.json",
165 bytes: 7_031_645,
166 sha256: "c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539",
167 },
168 ],
169 },
170 LocalModel {
171 id: "llama3.2-3b-q4",
172 name: "Llama 3.2 3B",
173 license: "Llama 3.2",
174 family: ModelFamily::Llama3,
175 memory: 8_500_000_000,
176 understood: None,
177 files: &[
178 ModelFile {
179 name: "model.gguf",
180 url: "https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/5ab33fa94d1d04e903623ae72c95d1696f09f9e8/Llama-3.2-3B-Instruct-Q4_K_M.gguf",
181 bytes: 2_019_377_696,
182 sha256: "6c1a2b41161032677be168d354123594c0e6e67d2b9227c84f296ad037c728ff",
183 },
184 ModelFile {
185 name: "tokenizer.json",
186 url: "https://huggingface.co/unsloth/Llama-3.2-3B-Instruct/resolve/006f5dcd1393c3add266de40994ba96225e9689d/tokenizer.json",
187 bytes: 17_209_920,
188 sha256: "6b9e4e7fb171f92fd137b777cc2714bf87d11576700a1dcd7a399e7bbe39537b",
189 },
190 ],
191 },
192 LocalModel {
193 id: "phi3-mini-q4",
194 name: "Phi-3 Mini",
195 license: "MIT",
196 family: ModelFamily::Phi3,
197 memory: 9_300_095_945,
198 understood: None,
199 files: &[
200 ModelFile {
201 name: "model.gguf",
202 url: "https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-gguf/resolve/a64113399c2f6b8ad3e11c394733a2ddadaa7f33/Phi-3-mini-4k-instruct-q4.gguf",
203 bytes: 2_393_231_072,
204 sha256: "8a83c7fb9049a9b2e92266fa7ad04933bb53aa1e85136b7b30f1b8000ff2edef",
205 },
206 ModelFile {
207 name: "tokenizer.json",
208 url: "https://huggingface.co/microsoft/Phi-3-mini-4k-instruct/resolve/f39ac1d28e925b323eae81227eaba4464caced4e/tokenizer.json",
209 bytes: 1_937_869,
210 sha256: "072ab882d6c7192a42f78790945d16c064691321a73251a4b18f6a380f0fbe39",
211 },
212 ],
213 },
214 LocalModel {
215 id: "qwen3-4b-q4",
216 name: "Qwen3 4B",
217 license: "Apache 2.0",
218 family: ModelFamily::Qwen3,
219 memory: 9_704_435_178,
220 understood: None,
221 files: &[
222 ModelFile {
223 name: "model.gguf",
224 url: "https://huggingface.co/unsloth/Qwen3-4B-GGUF/resolve/22c9fc8a8c7700b76a1789366280a6a5a1ad1120/Qwen3-4B-Q4_K_M.gguf",
225 bytes: 2_497_281_312,
226 sha256: "f6f851777709861056efcdad3af01da38b31223a3ba26e61a4f8bf3a2195813a",
227 },
228 ModelFile {
229 name: "tokenizer.json",
230 url: "https://huggingface.co/Qwen/Qwen3-4B/resolve/1cfa9a7208912126459214e8b04321603b3df60c/tokenizer.json",
231 bytes: 11_422_654,
232 sha256: "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4",
233 },
234 ],
235 },
236 LocalModel {
237 id: "gemma3-4b-q4",
238 name: "Gemma 3 4B",
239 license: "Gemma",
240 family: ModelFamily::Gemma3,
241 memory: 12_900_000_000,
242 understood: None,
243 files: &[
244 ModelFile {
245 name: "model.gguf",
246 url: "https://huggingface.co/bartowski/google_gemma-3-4b-it-GGUF/resolve/71506238f970075ca85125cd749c28b1b0eee84e/google_gemma-3-4b-it-Q4_K_M.gguf",
247 bytes: 2_489_758_112,
248 sha256: "4996030242583a40aa151ff93f49ed787ac8c25e4120c3ae4588b2e2a7d1ae94",
249 },
250 ModelFile {
251 name: "tokenizer.json",
252 url: "https://huggingface.co/unsloth/gemma-3-4b-it/resolve/bf46152c47f5dd20b896357cb51abc4c03b8ee8c/tokenizer.json",
253 bytes: 33_384_568,
254 sha256: "4667f2089529e8e7657cfb6d1c19910ae71ff5f28aa7ab2ff2763330affad795",
255 },
256 ],
257 },
258 LocalModel {
259 id: "mistral-7b-q4",
260 name: "Mistral 7B",
261 license: "Apache 2.0",
262 family: ModelFamily::Mistral,
263 memory: 16_975_756_223,
264 understood: None,
265 files: &[
266 ModelFile {
267 name: "model.gguf",
268 url: "https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/3a6fbf4a41a1d52e415a4958cde6856d34b2db93/mistral-7b-instruct-v0.2.Q4_K_M.gguf",
269 bytes: 4_368_439_584,
270 sha256: "3e0039fd0273fcbebb49228943b17831aadd55cbcbf56f0af00499be2040ccf9",
271 },
272 ModelFile {
273 name: "tokenizer.json",
274 url: "https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2/resolve/63a8b081895390a26e140280378bc85ec8bce07a/tokenizer.json",
275 bytes: 1_795_188,
276 sha256: "11c08db21487c885d8c792180f0be237f6a261b89a46f128a6a80a3aa4bd1720",
277 },
278 ],
279 },
280 LocalModel {
281 id: "qwen3-8b-q4",
282 name: "Qwen3 8B",
283 license: "Apache 2.0",
284 family: ModelFamily::Qwen3,
285 memory: 19_537_970_613,
286 understood: None,
287 files: &[
288 ModelFile {
289 name: "model.gguf",
290 url: "https://huggingface.co/unsloth/Qwen3-8B-GGUF/resolve/a6adef130ffb23ddaf1a62fec9dced968c9bc482/Qwen3-8B-Q4_K_M.gguf",
291 bytes: 5_027_784_512,
292 sha256: "120307ba529eb2439d6c430d94104dabd578497bc7bfe7e322b5d9933b449bd4",
293 },
294 ModelFile {
295 name: "tokenizer.json",
296 url: "https://huggingface.co/Qwen/Qwen3-8B/resolve/b968826d9c46dd6066d109eabc6255188de91218/tokenizer.json",
297 bytes: 11_422_654,
298 sha256: "aeb13307a71acd8fe81861d94ad54ab689df773318809eed3cbe794b4492dae4",
299 },
300 ],
301 },
302];
303
304pub fn model_by_id(id: &str) -> Option<LocalModel> {
306 CATALOG.iter().chain(VOICE_CATALOG).chain(HEARING_CATALOG).find(|model| model.id == id).copied()
307}
308
309pub const VOICE_CATALOG: &[LocalModel] = &[KOKORO, LFM3_AUDIO];
315
316const KOKORO: LocalModel = LocalModel {
317 id: "kokoro-82m",
318 name: "Kokoro 82M",
319 license: "Apache 2.0",
320 family: ModelFamily::Kokoro,
321 memory: MEMORY_KOKORO,
322 understood: None,
323 files: &[
324 ModelFile {
325 name: "model.pth",
326 url: "https://huggingface.co/hexgrad/Kokoro-82M/resolve/f3ff3571791e39611d31c381e3a41a3af07b4987/kokoro-v1_0.pth",
327 bytes: 327_212_226,
328 sha256: "496dba118d1a58f5f3db2efc88dbdc216e0483fc89fe6e47ee1f2c53f18ad1e4",
329 },
330 ModelFile {
331 name: "config.json",
332 url: "https://huggingface.co/hexgrad/Kokoro-82M/resolve/f3ff3571791e39611d31c381e3a41a3af07b4987/config.json",
333 bytes: 2_351,
334 sha256: "5abb01e2403b072bf03d04fde160443e209d7a0dad49a423be15196b9b43c17f",
335 },
336 ModelFile {
337 name: "pf_dora.pt",
338 url: "https://huggingface.co/hexgrad/Kokoro-82M/resolve/f3ff3571791e39611d31c381e3a41a3af07b4987/voices/pf_dora.pt",
339 bytes: 523_425,
340 sha256: "07e4ff987c5d5a8c3995efd15cc4f0db7c4c15e881b198d8ab7f67ecf51f5eb7",
341 },
342 ModelFile {
343 name: "pm_alex.pt",
344 url: "https://huggingface.co/hexgrad/Kokoro-82M/resolve/f3ff3571791e39611d31c381e3a41a3af07b4987/voices/pm_alex.pt",
345 bytes: 523_425,
346 sha256: "cf0ba8c573c2480fc54123683a35cf1e2ae130428e441eb91f9149bdb188a526",
347 },
348 ModelFile {
349 name: "pm_santa.pt",
350 url: "https://huggingface.co/hexgrad/Kokoro-82M/resolve/f3ff3571791e39611d31c381e3a41a3af07b4987/voices/pm_santa.pt",
351 bytes: 523_430,
352 sha256: "d42103169c5c872abbafb9129133af7e942bb9d272c3cc3b95c203e7d7198c29",
353 },
354 ],
355};
356
357const LFM3_AUDIO: LocalModel = LocalModel {
358 id: "lfm3-audio-2b-q4",
359 name: "LFM3 Audio 2B",
360 license: "LFM Open 1.0",
361 family: ModelFamily::Lfm3,
362 memory: 4_500_000_000,
363 understood: None,
364 files: &[
365 ModelFile {
366 name: "model.gguf",
367 url: "https://huggingface.co/LiquidAI/LFM3-Audio-2B-GGUF/resolve/02355c1a141e464a064f2ab2c276638dbcb7f38a/LFM3-Audio-2B-Q4_K_M.gguf",
368 bytes: 1_099_626_016,
369 sha256: "9a773289bd321ed879cd3a76545f6aca506e403851a45fb315420aee45625be2",
370 },
371 ModelFile {
372 name: "projector.gguf",
373 url: "https://huggingface.co/LiquidAI/LFM3-Audio-2B-GGUF/resolve/02355c1a141e464a064f2ab2c276638dbcb7f38a/mmproj-LFM3-Audio-2B-Q4_K_M.gguf",
374 bytes: 172_418_048,
375 sha256: "1a3a895160aad17c1f52117a6ee4cea8e68988651ea5a33c5b990539e8eae81d",
376 },
377 ModelFile {
378 name: "tokenizer.json",
379 url: "https://huggingface.co/LiquidAI/LFM3-Audio-2B/resolve/0295e4130594c06800fd25451d97139ac2da1aff/tokenizer.json",
380 bytes: 17_908_634,
381 sha256: "41927bd314d17d7d7fadb44e10cd0919f7b71528d7741596d8cbd15c6945ec44",
382 },
383 ],
384};
385
386pub const HEARING_CATALOG: &[LocalModel] = &[
393 LocalModel {
394 id: "whisper-base",
395 name: "Whisper Base",
396 license: "Apache 2.0",
397 family: ModelFamily::Whisper,
398 memory: 588_984_320,
399 understood: None,
400 files: &[
401 ModelFile {
402 name: "model.safetensors",
403 url: "https://huggingface.co/openai/whisper-base/resolve/e37978b90ca9030d5170a5c07aadb050351a65bb/model.safetensors",
404 bytes: 290_403_936,
405 sha256: "07cadb9f25677c8d50df603e66a98fbd842cce45047139baeb16e6219a1e807b",
406 },
407 ModelFile {
408 name: "config.json",
409 url: "https://huggingface.co/openai/whisper-base/resolve/e37978b90ca9030d5170a5c07aadb050351a65bb/config.json",
410 bytes: 1_983,
411 sha256: "a153c53883a6799b6f056b4a8d1a515c9926d03994682ba88a7616618d7da0c1",
412 },
413 ModelFile {
414 name: "tokenizer.json",
415 url: "https://huggingface.co/openai/whisper-base/resolve/e37978b90ca9030d5170a5c07aadb050351a65bb/tokenizer.json",
416 bytes: 2_480_466,
417 sha256: "27fc476bfe7f17299480be2273fc0608e4d5a99aba2ab5dec5374b4482d1a566",
418 },
419 ],
420 },
421 LocalModel {
422 id: "whisper-small",
423 name: "Whisper Small",
424 license: "Apache 2.0",
425 family: ModelFamily::Whisper,
426 memory: 1_942_667_264,
427 understood: None,
428 files: &[
429 ModelFile {
430 name: "model.safetensors",
431 url: "https://huggingface.co/openai/whisper-small/resolve/973afd24965f72e36ca33b3055d56a652f456b4d/model.safetensors",
432 bytes: 966_995_080,
433 sha256: "1d7734884874f1a1513ed9aa760a4f8e97aaa02fd6d93a3a85d27b2ae9ca596b",
434 },
435 ModelFile {
436 name: "config.json",
437 url: "https://huggingface.co/openai/whisper-small/resolve/973afd24965f72e36ca33b3055d56a652f456b4d/config.json",
438 bytes: 1_967,
439 sha256: "e6a2b489da1b5aed65a8eb8d1e7466fa867ad5643a8bc138ba708bd56b2875c4",
440 },
441 ModelFile {
442 name: "tokenizer.json",
443 url: "https://huggingface.co/openai/whisper-small/resolve/973afd24965f72e36ca33b3055d56a652f456b4d/tokenizer.json",
444 bytes: 2_480_466,
445 sha256: "27fc476bfe7f17299480be2273fc0608e4d5a99aba2ab5dec5374b4482d1a566",
446 },
447 ],
448 },
449];