use std::sync::Arc;
use tokio::sync::RwLock;
use crate::models::{Model, ModelConfig};
pub struct ModelState {
pub model: Arc<RwLock<Box<dyn Model>>>,
pub model_id: String,
pub model_name: String,
pub thinking_enabled: Option<bool>,
pub vision_supported: Option<bool>,
pub base_config: ModelConfig,
}
impl ModelState {
pub fn new(model: Box<dyn Model>, model_id: String, base_config: ModelConfig) -> Self {
let model_name = model.name().to_string();
Self {
model: Arc::new(RwLock::new(model)),
model_id,
model_name,
thinking_enabled: Some(true),
vision_supported: None,
base_config,
}
}
pub fn model_ref(&self) -> &Arc<RwLock<Box<dyn Model>>> {
&self.model
}
pub fn toggle_thinking(&mut self) -> Option<bool> {
match self.thinking_enabled {
Some(enabled) => {
self.thinking_enabled = Some(!enabled);
self.thinking_enabled
},
None => None, }
}
pub fn disable_thinking_support(&mut self) {
self.thinking_enabled = None;
}
pub fn is_thinking_active(&self) -> bool {
self.thinking_enabled == Some(true)
}
pub fn build_config(&self) -> ModelConfig {
let mut config = self.base_config.clone();
config.model = self.model_id.clone();
config.thinking_enabled = self.thinking_enabled;
config
}
}