diff --git a/extensions/llamacpp-extension/src/index.ts b/extensions/llamacpp-extension/src/index.ts index 7165ff7b8..ffeb88ded 100644 --- a/extensions/llamacpp-extension/src/index.ts +++ b/extensions/llamacpp-extension/src/index.ts @@ -457,6 +457,7 @@ export default class llamacpp_extension extends AIEngine { // TODO: add LIBRARY_PATH const sInfo = await invoke('load_llama_model', { backendPath: await getBackendExePath(backend, version), + libraryPath: await joinPath([this.providerPath, 'lib']), args, }) diff --git a/src-tauri/src/core/utils/extensions/inference_llamacpp_extension/server.rs b/src-tauri/src/core/utils/extensions/inference_llamacpp_extension/server.rs index acba92fbb..c252fbf3c 100644 --- a/src-tauri/src/core/utils/extensions/inference_llamacpp_extension/server.rs +++ b/src-tauri/src/core/utils/extensions/inference_llamacpp_extension/server.rs @@ -3,7 +3,7 @@ use hmac::{Hmac, Mac}; use serde::{Deserialize, Serialize}; use sha2::Sha256; use std::path::PathBuf; -use tauri::{AppHandle, State}; // Import Manager trait +use tauri::State; // Import Manager trait use thiserror; use tokio::process::Command; use uuid::Uuid; @@ -40,8 +40,8 @@ type ServerResult = Result; #[derive(Debug, Serialize, Deserialize)] pub struct sessionInfo { - pub pid: String, // opaque handle for unload/chat - pub port: String, // llama-server output port + pub pid: String, // opaque handle for unload/chat + pub port: String, // llama-server output port pub modelId: String, pub modelPath: String, // path of the loaded model pub apiKey: String, @@ -56,9 +56,9 @@ pub struct unloadResult { // --- Load Command --- #[tauri::command] pub async fn load_llama_model( - _app_handle: AppHandle, // Get the AppHandle state: State<'_, AppState>, // Access the shared state backend_path: &str, + library_path: Option<&str>, args: Vec, // Arguments from the frontend ) -> ServerResult { let mut process_lock = state.llama_server_process.lock().await; @@ -115,6 +115,24 @@ pub async fn load_llama_model( let mut command = Command::new(backend_path); command.args(args); + if let Some(lib_path) = library_path { + if cfg!(target_os = "linux") { + let new_lib_path = match std::env::var("LD_LIBRARY_PATH") { + Ok(path) => format!("{}:{}", path, lib_path), + Err(_) => lib_path.to_string(), + }; + command.env("LD_LIBRARY_PATH", new_lib_path); + } else if cfg!(target_os = "windows") { + let new_path = match std::env::var("PATH") { + Ok(path) => format!("{};{}", path, lib_path), + Err(_) => lib_path.to_string(), + }; + command.env("PATH", new_path); + } else { + log::warn!("Library path setting is not supported on this OS"); + } + } + // Optional: Redirect stdio if needed (e.g., for logging within Jan) // command.stdout(Stdio::piped()); // command.stderr(Stdio::piped());