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 cache: HashMap<String, ModelOverride>,
51}
52
53impl ModelConfigStore {
54 pub fn new() -> Self {
55 let models_dir = models_config_dir();
56 let unused_dir = unused_config_dir();
57 let cache = load_all_from_dir(&models_dir);
58
59 Self {
60 models_dir,
61 unused_dir,
62 cache,
63 }
64 }
65
66 pub fn get(&self, display_name: &str) -> Option<&ModelOverride> {
68 let key = key_from_display(display_name);
69 self.cache.get(&key)
70 }
71
72 pub fn save(&mut self, display_name: &str, config: &ModelOverride) {
74 let key = key_from_display(display_name);
75 save_yaml(&key, config, &self.models_dir, &self.unused_dir);
76 self.cache.insert(key, config.clone());
77 }
78
79 pub fn update_fields(&mut self, display_name: &str, webui: Option<bool>, cache_prompt: Option<bool>) {
81 let key = key_from_display(display_name);
82 if let Some(cfg) = self.cache.get_mut(&key) {
83 if let Some(v) = webui {
84 cfg.webui = Some(v);
85 }
86 if let Some(v) = cache_prompt {
87 cfg.cache_prompt = Some(v);
88 }
89 save_yaml(&key, cfg, &self.models_dir, &self.unused_dir);
90 }
91 }
92
93 pub fn delete(&mut self, display_name: &str) {
95 let key = key_from_display(display_name);
96 move_to_unused(&key, &self.models_dir, &self.unused_dir);
97 self.cache.remove(&key);
98 }
99
100 pub fn keys(&self) -> Vec<String> {
102 let mut keys: Vec<String> = self.cache.keys().map(|k| display_from_key(k)).collect();
103 keys.sort();
104 keys
105 }
106}
107
108impl Default for ModelConfigStore {
109 fn default() -> Self {
110 Self::new()
111 }
112}