Skip to main content

ravenrs_ai/
catalog.rs

1//! The models this crate knows, each pinned to a published version.
2
3use crate::{LocalModel, ModelFamily, ModelFile};
4
5/// Measured at its peak on an Apple M2 Pro, saying a long sentence.
6const MEMORY_KOKORO: u64 = 1_736_507_392;
7
8/// The models that can be offered, smallest first. Only their files are listed: a
9/// model comes to the machine only when someone asks for it.
10///
11/// Memory was measured at its peak on an Apple M2 Pro for LFM3 1.7B, Qwen3 1.7B, Qwen 2.5 0.5B
12/// and Llama 3.2 1B; the others are scaled from their family, and
13/// [`ModelManager`](crate::ModelManager)'s speed test lets each machine check them.
14/// Gemma 3 270M is not here on purpose: it ran, and understood none of the requests.
15pub 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
304/// A model of [`CATALOG`] by its id.
305pub 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
309/// The models that speak, best first. They are offered apart from [`CATALOG`], since an app
310/// uses one of each.
311///
312/// Kokoro speaks Brazilian Portuguese with three voices, from phonemes this crate writes;
313/// LFM3 Audio speaks more languages, more slowly.
314pub 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
386/// The models that hear: speech becomes text with a
387/// [`Transcriber`](crate::Transcriber). Offered apart, like [`VOICE_CATALOG`].
388///
389/// Memory was measured at its peak on a laptop's CPU, hearing a four-second voice note:
390/// Base in 4 seconds, Small in 10. With a synthetic voice only Small got the sentence
391/// right, so Base suits clear speech and Small is the one to offer first.
392pub 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];