studio: desktop_auth env-aware + legacy-root llama.cpp consistency

- desktop_auth.rs: honor UNSLOTH_STUDIO_HOME / STUDIO_HOME for the
  .desktop_secret path so Tauri desktop login works against custom-root
  installs instead of always reading ~/.unsloth/studio/auth/.

- install.sh / install.ps1 / unsloth_cli/commands/studio.py: when an env
  override resolves to the legacy default ($HOME/.unsloth/studio), set
  UNSLOTH_LLAMA_CPP_PATH to ~/.unsloth/llama.cpp (matching setup.sh /
  setup.ps1's legacy-equality branch). Previously the persisted value
  pointed at $STUDIO_HOME/llama.cpp, which was a non-existent location
  and broke unsloth-zoo's import-time GGUF binding for that edge case.
This commit is contained in:
Daniel Han 2026-04-26 16:47:27 +00:00
commit 151070cdb8
4 changed files with 57 additions and 3 deletions

View file

@ -422,8 +422,17 @@ function Install-UnslothStudio {
# the user re-exporting the env var. Default installs get an
# empty string here so behavior matches today exactly.
$studioHomeExport = if ($StudioRedirectMode -eq 'env') {
# Mirror setup.ps1: when an env override happens to equal the
# legacy default, llama.cpp still lives at ~/.unsloth/llama.cpp.
# Keep the persisted UNSLOTH_LLAMA_CPP_PATH consistent with that.
$_legacyStudio = Join-Path $env:USERPROFILE ".unsloth\studio"
$_llamaPath = if ($StudioHome -eq $_legacyStudio) {
Join-Path $env:USERPROFILE ".unsloth\llama.cpp"
} else {
Join-Path $StudioHome "llama.cpp"
}
$_sq = $StudioHome -replace "'", "''"
$_llama = (Join-Path $StudioHome "llama.cpp") -replace "'", "''"
$_llama = $_llamaPath -replace "'", "''"
"`$env:UNSLOTH_STUDIO_HOME = '$_sq'`n`$env:UNSLOTH_LLAMA_CPP_PATH = '$_llama'`n"
} else { "" }

View file

@ -611,8 +611,18 @@ LAUNCHER_EOF
# custom-root build. Default installs do NOT get these lines so the
# legacy ~/.unsloth/studio + ~/.unsloth/llama.cpp resolution stands.
if [ "$_STUDIO_HOME_REDIRECT" = "env" ]; then
# Mirror setup.sh's legacy-equality check: when an env override
# happens to point at the legacy default, llama.cpp still lives
# at ~/.unsloth/llama.cpp (one shared build across legacy
# installs) -- keep UNSLOTH_LLAMA_CPP_PATH consistent with that.
_css_legacy_studio="$HOME/.unsloth/studio"
if [ "$STUDIO_HOME" = "$_css_legacy_studio" ]; then
_css_llama_path="$HOME/.unsloth/llama.cpp"
else
_css_llama_path="$STUDIO_HOME/llama.cpp"
fi
_css_quoted_home=$(printf '%s' "$STUDIO_HOME" | sed "s/'/'\\\\''/g")
_css_quoted_llama=$(printf '%s' "$STUDIO_HOME/llama.cpp" | sed "s/'/'\\\\''/g")
_css_quoted_llama=$(printf '%s' "$_css_llama_path" | sed "s/'/'\\\\''/g")
printf '%s\n' "export UNSLOTH_STUDIO_HOME='$_css_quoted_home'"
printf '%s\n' "export UNSLOTH_LLAMA_CPP_PATH='$_css_quoted_llama'"
fi

View file

@ -57,6 +57,10 @@ fn auth_secret_path(home: &Path, filename: &str) -> PathBuf {
.join(filename)
}
fn auth_secret_path_in_studio(studio: &Path, filename: &str) -> PathBuf {
studio.join("auth").join(filename)
}
fn auth_url(port: u16, route: &str) -> String {
format!("http://127.0.0.1:{port}/api/auth/{route}")
}
@ -65,7 +69,21 @@ fn home_dir() -> Result<PathBuf, String> {
dirs::home_dir().ok_or_else(|| "Could not determine home directory".to_string())
}
fn studio_root_from_env() -> Option<PathBuf> {
for var in ["UNSLOTH_STUDIO_HOME", "STUDIO_HOME"] {
if let Some(value) = std::env::var_os(var) {
if !value.is_empty() {
return Some(PathBuf::from(value));
}
}
}
None
}
fn desktop_secret_path() -> Result<PathBuf, String> {
if let Some(studio) = studio_root_from_env() {
return Ok(auth_secret_path_in_studio(&studio, ".desktop_secret"));
}
Ok(auth_secret_path(&home_dir()?, ".desktop_secret"))
}
@ -308,6 +326,15 @@ mod tests {
);
}
#[test]
fn auth_secret_path_in_studio_joins_under_custom_root() {
let studio = PathBuf::from("/srv/ws/studio");
assert_eq!(
auth_secret_path_in_studio(&studio, ".desktop_secret"),
PathBuf::from("/srv/ws/studio/auth/.desktop_secret")
);
}
#[test]
fn auth_url_builds_local_endpoint() {
assert_eq!(

View file

@ -67,7 +67,15 @@ STUDIO_HOME, _STUDIO_HOME_IS_CUSTOM = _resolve_studio_home()
# correct build dir for GGUF export.
if _STUDIO_HOME_IS_CUSTOM:
os.environ.setdefault("UNSLOTH_STUDIO_HOME", str(STUDIO_HOME))
os.environ.setdefault("UNSLOTH_LLAMA_CPP_PATH", str(STUDIO_HOME / "llama.cpp"))
# Mirror setup.sh / setup.ps1's legacy-equality check: when an env
# override happens to equal the legacy default, llama.cpp still lives
# at ~/.unsloth/llama.cpp (one shared build across legacy installs).
_legacy_studio = (Path.home() / ".unsloth" / "studio").resolve()
if STUDIO_HOME.resolve() == _legacy_studio:
_llama_dir = Path.home() / ".unsloth" / "llama.cpp"
else:
_llama_dir = STUDIO_HOME / "llama.cpp"
os.environ.setdefault("UNSLOTH_LLAMA_CPP_PATH", str(_llama_dir))
BOOTSTRAP_PASSWORD_FILE = ".bootstrap_password"
DESKTOP_SECRET_FILE = ".desktop_secret"
DEFAULT_ADMIN_USERNAME = "unsloth"