llm_manager/config/
model_config.rs1use std::collections::HashMap;
2use std::path::PathBuf;
3
4use serde::{Deserialize, Serialize};
5
6use crate::config::ModelOverride;
7use crate::config::config_base_dir;
8use crate::config::store::{load_all_from_dir, move_to_unused, save_yaml};
9
10pub fn models_config_dir() -> PathBuf {
12 config_base_dir().join("llm-manager").join("models")
13}
14
15pub fn unused_config_dir() -> PathBuf {
17 config_base_dir().join("llm-manager").join("unused")
18}
19
20pub fn key_from_display(display_name: &str) -> String {
24 display_name.replace(std::path::MAIN_SEPARATOR, "__")
25}
26
27pub fn display_from_key(key: &str) -> String {
31 key.replace("__", std::path::MAIN_SEPARATOR_STR)
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct ModelConfigStore {
48 models_dir: PathBuf,
49 unused_dir: PathBuf,
50 model_dirs: Vec<PathBuf>,
51 cache: HashMap<String, ModelOverride>,
52}
53
54impl ModelConfigStore {
55 pub fn new(model_dirs: Vec<PathBuf>) -> Self {
56 let models_dir = models_config_dir();
57 let unused_dir = unused_config_dir();
58 let cache = load_all_from_dir(&models_dir);
59
60 Self {
61 models_dir,
62 unused_dir,
63 model_dirs,
64 cache,
65 }
66 }
67
68 pub fn get(&self, display_name: &str) -> Option<&ModelOverride> {
70 let key = key_from_display(display_name);
71 self.cache.get(&key)
72 }
73
74 pub fn save(&mut self, display_name: &str, config: &ModelOverride) {
76 let key = key_from_display(display_name);
77 save_yaml(&key, config, &self.models_dir, &self.unused_dir);
78 self.cache.insert(key, config.clone());
79 }
80
81 pub fn delete(&mut self, display_name: &str) {
83 let key = key_from_display(display_name);
84 move_to_unused(&key, &self.models_dir, &self.unused_dir);
85 self.cache.remove(&key);
86 }
87
88 pub fn keys(&self) -> Vec<String> {
90 let mut keys: Vec<String> = self
91 .cache
92 .keys()
93 .map(|k| display_from_key(k))
94 .collect();
95 keys.sort();
96 keys
97 }
98}
99
100impl Default for ModelConfigStore {
101 fn default() -> Self {
102 Self::new(vec![])
103 }
104}