-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Expand file tree
/
Copy pathmodels.rs
More file actions
171 lines (151 loc) · 5.24 KB
/
models.rs
File metadata and controls
171 lines (151 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
use crate::managers::model::{ModelInfo, ModelManager};
use crate::managers::transcription::TranscriptionManager;
use crate::settings::{get_settings, write_settings, ModelUnloadTimeout};
use std::sync::Arc;
use tauri::{AppHandle, Manager, State};
#[tauri::command]
#[specta::specta]
pub async fn get_available_models(
model_manager: State<'_, Arc<ModelManager>>,
) -> Result<Vec<ModelInfo>, String> {
Ok(model_manager.get_available_models())
}
#[tauri::command]
#[specta::specta]
pub async fn get_model_info(
model_manager: State<'_, Arc<ModelManager>>,
model_id: String,
) -> Result<Option<ModelInfo>, String> {
Ok(model_manager.get_model_info(&model_id))
}
#[tauri::command]
#[specta::specta]
pub async fn download_model(
model_manager: State<'_, Arc<ModelManager>>,
model_id: String,
) -> Result<(), String> {
model_manager
.download_model(&model_id)
.await
.map_err(|e| e.to_string())
}
#[tauri::command]
#[specta::specta]
pub async fn delete_model(
app_handle: AppHandle,
model_manager: State<'_, Arc<ModelManager>>,
transcription_manager: State<'_, Arc<TranscriptionManager>>,
model_id: String,
) -> Result<(), String> {
// If deleting the active model, unload it and clear the setting
let settings = get_settings(&app_handle);
if settings.selected_model == model_id {
transcription_manager
.unload_model()
.map_err(|e| format!("Failed to unload model: {}", e))?;
let mut settings = get_settings(&app_handle);
settings.selected_model = String::new();
write_settings(&app_handle, settings);
}
model_manager
.delete_model(&model_id)
.map_err(|e| e.to_string())
}
/// Shared logic for switching the active model, used by both the Tauri command
/// and the tray menu handler.
///
/// Validates the model, updates the persisted setting, and loads the model
/// unless the unload timeout is set to "Immediately" (in which case the model
/// will be loaded on-demand during the next transcription).
pub fn switch_active_model(app: &AppHandle, model_id: &str) -> Result<(), String> {
let model_manager = app.state::<Arc<ModelManager>>();
let transcription_manager = app.state::<Arc<TranscriptionManager>>();
// Check if model exists and is available
let model_info = model_manager
.get_model_info(model_id)
.ok_or_else(|| format!("Model not found: {}", model_id))?;
if !model_info.is_downloaded {
return Err(format!("Model not downloaded: {}", model_id));
}
// Update settings
let settings = get_settings(app);
let unload_timeout = settings.model_unload_timeout;
let mut settings = settings;
settings.selected_model = model_id.to_string();
write_settings(app, settings);
// Skip eager loading if unload is set to "Immediately" — the model
// will be loaded on-demand during the next transcription.
if unload_timeout == ModelUnloadTimeout::Immediately {
log::info!(
"Model selection changed to {} (not loading — unload set to Immediately).",
model_id
);
return Ok(());
}
// Load the model in the transcription manager
transcription_manager
.load_model(model_id)
.map_err(|e| e.to_string())?;
Ok(())
}
#[tauri::command]
#[specta::specta]
pub async fn set_active_model(
app_handle: AppHandle,
model_manager: State<'_, Arc<ModelManager>>,
transcription_manager: State<'_, Arc<TranscriptionManager>>,
model_id: String,
) -> Result<(), String> {
// State params kept for specta binding generation
let _ = (&model_manager, &transcription_manager);
switch_active_model(&app_handle, &model_id)
}
#[tauri::command]
#[specta::specta]
pub async fn get_current_model(app_handle: AppHandle) -> Result<String, String> {
let settings = get_settings(&app_handle);
Ok(settings.selected_model)
}
#[tauri::command]
#[specta::specta]
pub async fn get_transcription_model_status(
transcription_manager: State<'_, Arc<TranscriptionManager>>,
) -> Result<Option<String>, String> {
Ok(transcription_manager.get_current_model())
}
#[tauri::command]
#[specta::specta]
pub async fn is_model_loading(
transcription_manager: State<'_, Arc<TranscriptionManager>>,
) -> Result<bool, String> {
// Check if transcription manager has a loaded model
let current_model = transcription_manager.get_current_model();
Ok(current_model.is_none())
}
#[tauri::command]
#[specta::specta]
pub async fn has_any_models_available(
model_manager: State<'_, Arc<ModelManager>>,
) -> Result<bool, String> {
let models = model_manager.get_available_models();
Ok(models.iter().any(|m| m.is_downloaded))
}
#[tauri::command]
#[specta::specta]
pub async fn has_any_models_or_downloads(
model_manager: State<'_, Arc<ModelManager>>,
) -> Result<bool, String> {
let models = model_manager.get_available_models();
// Return true if any models are downloaded OR if any downloads are in progress
Ok(models.iter().any(|m| m.is_downloaded))
}
#[tauri::command]
#[specta::specta]
pub async fn cancel_download(
model_manager: State<'_, Arc<ModelManager>>,
model_id: String,
) -> Result<(), String> {
model_manager
.cancel_download(&model_id)
.map_err(|e| e.to_string())
}