mermaid_cli/tui/state/
model.rs1use std::sync::Arc;
6use tokio::sync::RwLock;
7
8use crate::models::{Model, ModelConfig, OllamaOptions};
9
10pub struct ModelState {
12 pub model: Arc<RwLock<Box<dyn Model>>>,
13 pub model_id: String,
14 pub model_name: String,
15 pub thinking_enabled: Option<bool>,
20 pub vision_supported: Option<bool>,
25 pub temperature: f32,
27 pub max_tokens: usize,
29 pub ollama_options: OllamaOptions,
31}
32
33impl ModelState {
34 pub fn new(model: Box<dyn Model>, model_id: String) -> Self {
35 let model_name = model.name().to_string();
36 Self {
37 model: Arc::new(RwLock::new(model)),
38 model_id,
39 model_name,
40 thinking_enabled: Some(true),
41 vision_supported: None,
42 temperature: crate::constants::DEFAULT_TEMPERATURE,
43 max_tokens: crate::constants::DEFAULT_MAX_TOKENS,
44 ollama_options: OllamaOptions::default(),
45 }
46 }
47
48 pub fn model_ref(&self) -> &Arc<RwLock<Box<dyn Model>>> {
50 &self.model
51 }
52
53 pub fn toggle_thinking(&mut self) -> Option<bool> {
56 match self.thinking_enabled {
57 Some(enabled) => {
58 self.thinking_enabled = Some(!enabled);
59 self.thinking_enabled
60 },
61 None => None, }
63 }
64
65 pub fn disable_thinking_support(&mut self) {
68 self.thinking_enabled = None;
69 }
70
71 pub fn is_thinking_active(&self) -> bool {
73 self.thinking_enabled == Some(true)
74 }
75
76 pub fn build_config(&self) -> ModelConfig {
78 let mut config = ModelConfig {
79 model: self.model_id.clone(),
80 thinking_enabled: self.thinking_enabled,
81 temperature: self.temperature,
82 max_tokens: self.max_tokens,
83 ..ModelConfig::default()
84 };
85 if let Some(v) = self.ollama_options.num_gpu {
87 config.set_backend_option("ollama".into(), "num_gpu".into(), v.to_string());
88 }
89 if let Some(v) = self.ollama_options.num_ctx {
90 config.set_backend_option("ollama".into(), "num_ctx".into(), v.to_string());
91 }
92 if let Some(v) = self.ollama_options.num_thread {
93 config.set_backend_option("ollama".into(), "num_thread".into(), v.to_string());
94 }
95 if let Some(v) = self.ollama_options.numa {
96 config.set_backend_option("ollama".into(), "numa".into(), v.to_string());
97 }
98 config
99 }
100}