AI models shared registry + Code cleanup + Better async handling + Some fixes, etc

This commit is contained in:
Priler 2026-02-18 21:08:48 +05:00
parent b427eacf35
commit 5c3031c977
62 changed files with 1683 additions and 1239 deletions

View file

@ -1,10 +1,7 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use jarvis_core::{config, db, i18n, voices, APP_CONFIG_DIR, APP_LOG_DIR, DB};
use parking_lot::RwLock;
use std::sync::Arc;
use jarvis_core::{config, db, i18n, voices, DB, SettingsManager};
#[macro_use]
extern crate simple_log;
@ -15,7 +12,7 @@ mod tauri_commands;
#[derive(Clone)]
pub struct AppState {
pub db: Arc<RwLock<db::structs::Settings>>,
pub settings: SettingsManager,
}
fn main() {
@ -24,14 +21,14 @@ fn main() {
// basic logging setup (simpler for GUI)
simple_log::quick!("info");
// init db
let settings = db::init_settings();
// init settings
let manager = db::init();
// init i18n
i18n::init(&settings.language);
i18n::init(&manager.lock().language);
// init voices
if let Err(e) = voices::init(&settings.voice) {
if let Err(e) = voices::init(&manager.lock().voice, &manager.lock().language) {
eprintln!("Failed to init voices: {}", e);
}
@ -40,13 +37,12 @@ fn main() {
eprintln!("Failed to init audio: {:?}", e);
}
// set db
DB.set(Arc::new(RwLock::new(settings)))
// set global DB (for core modules that read settings at init time)
DB.set(manager.arc().clone())
.expect("DB already initialized");
let db_arc = DB.get().unwrap().clone();
tauri::Builder::default()
.manage(AppState { db: db_arc })
.manage(AppState { settings: manager })
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_fs::init())
@ -106,4 +102,4 @@ fn main() {
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
}

View file

@ -1,115 +1,17 @@
use jarvis_core::{db, DB};
use crate::AppState;
#[tauri::command]
pub fn db_read(state: tauri::State<'_, AppState>, key: &str) -> String {
let settings = state.db.read();
match key {
"selected_microphone" => settings.microphone.to_string(),
"assistant_voice" => settings.voice.clone(),
"selected_wake_word_engine" => format!("{:?}", settings.wake_word_engine),
"selected_intent_recognition_engine" => format!("{:?}", settings.intent_recognition_engine),
"selected_slot_extraction_engine" => format!("{:?}", settings.slot_extraction_engine),
"selected_gliner_model" => settings.gliner_model.clone(),
"selected_vosk_model" => settings.vosk_model.clone(),
"speech_to_text_engine" => format!("{:?}", settings.speech_to_text_engine),
"noise_suppression" => format!("{:?}", settings.noise_suppression),
"vad" => format!("{:?}", settings.vad),
"gain_normalizer" => settings.gain_normalizer.to_string(),
"language" => settings.language.to_string(),
"api_key__picovoice" => settings.api_keys.picovoice.clone(),
"api_key__openai" => settings.api_keys.openai.clone(),
_ => String::new(),
}
state.settings.read(key).unwrap_or_default()
}
#[tauri::command]
pub fn db_write(state: tauri::State<'_, AppState>, key: &str, val: &str) -> bool {
let snapshot = {
let mut settings = state.db.write();
match key {
"selected_microphone" => {
if let Ok(v) = val.parse::<i32>() {
// info!("MICROPHONE changed: {}", v);
settings.microphone = v;
} else {
return false;
}
}
"assistant_voice" => {
settings.voice = val.to_string();
}
"selected_wake_word_engine" => {
match val.to_lowercase().as_str() {
"rustpotter" => settings.wake_word_engine = jarvis_core::config::structs::WakeWordEngine::Rustpotter,
"vosk" => settings.wake_word_engine = jarvis_core::config::structs::WakeWordEngine::Vosk,
"porcupine" => settings.wake_word_engine = jarvis_core::config::structs::WakeWordEngine::Porcupine,
_ => return false,
}
}
"selected_intent_recognition_engine" => {
match val.to_lowercase().as_str() {
"intentclassifier" => settings.intent_recognition_engine = jarvis_core::config::structs::IntentRecognitionEngine::IntentClassifier,
"embeddingclassifier" => settings.intent_recognition_engine = jarvis_core::config::structs::IntentRecognitionEngine::EmbeddingClassifier,
_ => return false,
}
}
"selected_slot_extraction_engine" => {
match val.to_lowercase().as_str() {
"none" => settings.slot_extraction_engine = jarvis_core::config::structs::SlotExtractionEngine::None,
"gliner" => settings.slot_extraction_engine = jarvis_core::config::structs::SlotExtractionEngine::GLiNER,
_ => return false,
}
}
"selected_gliner_model" => {
settings.gliner_model = val.to_string();
}
"selected_vosk_model" => {
settings.vosk_model = val.to_string();
}
"noise_suppression" => {
match val.to_lowercase().as_str() {
"none" => settings.noise_suppression = jarvis_core::config::structs::NoiseSuppressionBackend::None,
"nnnoiseless" => settings.noise_suppression = jarvis_core::config::structs::NoiseSuppressionBackend::Nnnoiseless,
_ => return false,
}
}
"vad" => {
match val.to_lowercase().as_str() {
"none" => settings.vad = jarvis_core::config::structs::VadBackend::None,
"energy" => settings.vad = jarvis_core::config::structs::VadBackend::Energy,
"nnnoiseless" => settings.vad = jarvis_core::config::structs::VadBackend::Nnnoiseless,
_ => return false,
}
}
"gain_normalizer" => {
match val.to_lowercase().as_str() {
"true" => settings.gain_normalizer = true,
"false" => settings.gain_normalizer = false,
_ => return false,
}
}
"language" => {
settings.language = val.to_string();
}
"api_key__picovoice" => {
settings.api_keys.picovoice = val.to_string();
}
"api_key__openai" => {
settings.api_keys.openai = val.to_string();
}
_ => return false,
match state.settings.write(key, val) {
Ok(()) => true,
Err(e) => {
log::warn!("db_write('{}', '{}'): {}", key, val, e);
false
}
settings.clone()
};
// save to disk
if let Err(e) = db::save_settings(&snapshot) {
info!("SETTINGS NOT SAVED");
}
true
}

View file

@ -25,20 +25,12 @@ pub fn get_current_language() -> String {
pub fn set_language(state: tauri::State<'_, AppState>, lang: &str) -> HashMap<String, String> {
// update i18n
i18n::set_language(lang);
// also save to db
{
let mut settings = state.db.write();
settings.language = lang.to_string();
if let Err(e) = state.settings.write("language", lang) {
log::error!("Failed to save language setting: {}", e);
}
// save to disk
let snapshot = state.db.read().clone();
if let Err(e) = jarvis_core::db::save_settings(&snapshot) {
log::error!("Failed to save settings: {}", e);
}
// return new translations
// return new translations
i18n::get_all_translations()
}