Fix Colab Studio launch and setup.ps1 box alignment (#4601)

* Fix Colab Studio launch and setup.ps1 box alignment

- colab.py: when the Studio venv is missing on Colab, pip-install
  backend dependencies (structlog, fastapi, etc.) from studio.txt
  into the current Python instead of failing with ModuleNotFoundError
- setup.sh: on Colab without a venv, install backend deps into system
  Python and skip venv-dependent sections (Python stack update,
  llama.cpp build) that would otherwise fail
- setup.ps1: use PadRight(47) for the done-line so "Setup Complete!"
  and "Update Complete!" both align with the box border

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Daniel Han 2026-03-25 09:00:08 -07:00 committed by GitHub
commit 23eb7fc0a7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 65 additions and 7 deletions

View file

@ -18,6 +18,30 @@ if _backend_dir not in sys.path:
import _platform_compat # noqa: F401
def _is_colab() -> bool:
"""Detect Google Colab by checking for COLAB_ prefixed env vars."""
import os
return any(k.startswith("COLAB_") for k in os.environ)
def _pip_install_backend_deps() -> None:
"""Install Studio backend dependencies directly into the current Python.
Used on Colab when the Studio venv does not exist (install.sh was not
run). Reads the requirements from studio.txt next to this file.
"""
import subprocess
req_file = Path(__file__).parent / "requirements" / "studio.txt"
if not req_file.exists():
return
print("Installing Studio backend dependencies ...")
subprocess.check_call(
[sys.executable, "-m", "pip", "install", "-q", "-r", str(req_file)],
)
def _bootstrap_studio_venv() -> None:
"""Expose the Studio venv's site-packages to the current interpreter.
@ -25,9 +49,16 @@ def _bootstrap_studio_venv() -> None:
installing the full stack into system Python, we prepend the venv's
site-packages so that packages like structlog, fastapi, etc. are
importable from notebook cells and take priority over system copies.
If the venv does not exist and we are running on Colab, fall back to
pip-installing the backend dependencies into the current environment
so that imports like structlog and fastapi succeed.
"""
venv_lib = Path.home() / ".unsloth" / "studio" / "unsloth_studio" / "lib"
if not venv_lib.exists():
if _is_colab():
_pip_install_backend_deps()
return
import warnings
warnings.warn(

View file

@ -1746,8 +1746,9 @@ if (-not $NeedLlamaSourceBuild) {
# ============================================
Write-Host ""
$doneLine = if ($env:SKIP_STUDIO_BASE -eq "1") { "Setup Complete!" } else { "Update Complete!" }
$doneContent = " $doneLine"
Write-Host "+===============================================+" -ForegroundColor Green
Write-Host "| $doneLine |" -ForegroundColor Green
Write-Host ("|" + $doneContent.PadRight(47) + "|") -ForegroundColor Green
Write-Host "| |" -ForegroundColor Green
Write-Host "| Launch with: |" -ForegroundColor Green
Write-Host "| unsloth studio -H 0.0.0.0 -p 8888 |" -ForegroundColor Green

View file

@ -292,15 +292,23 @@ VENV_T5_DIR="$STUDIO_HOME/.venv_t5"
[ -d "$REPO_ROOT/.venv_t5" ] && rm -rf "$REPO_ROOT/.venv_t5"
# Note: do NOT delete $STUDIO_HOME/.venv here — install.sh handles migration
_COLAB_NO_VENV=false
if [ ! -x "$VENV_DIR/bin/python" ]; then
echo "❌ ERROR: Virtual environment not found at $VENV_DIR"
echo " Run install.sh first to create the environment:"
echo " curl -fsSL https://unsloth.ai/install.sh | sh"
exit 1
if [ "$IS_COLAB" = true ]; then
# On Colab there is no Studio venv -- install backend deps into system Python
echo " Colab detected, installing Studio backend dependencies..."
pip install -q -r "$SCRIPT_DIR/backend/requirements/studio.txt" 2>/dev/null || true
_COLAB_NO_VENV=true
else
echo "❌ ERROR: Virtual environment not found at $VENV_DIR"
echo " Run install.sh first to create the environment:"
echo " curl -fsSL https://unsloth.ai/install.sh | sh"
exit 1
fi
else
source "$VENV_DIR/bin/activate"
fi
source "$VENV_DIR/bin/activate"
install_python_stack() {
python "$SCRIPT_DIR/install_python_stack.py"
}
@ -324,6 +332,24 @@ fast_install() {
cd "$SCRIPT_DIR"
# On Colab without a venv, skip all venv-dependent sections (Python deps
# update, llama.cpp build) -- the backend deps were already installed above.
if [ "$_COLAB_NO_VENV" = true ]; then
echo "✅ Studio backend dependencies installed into system Python"
echo ""
echo "╔══════════════════════════════════════╗"
echo "║ Setup Complete! ║"
echo "╠══════════════════════════════════════╣"
echo "║ Unsloth Studio is ready to start ║"
echo "║ in your Colab notebook! ║"
echo "║ ║"
echo "║ from colab import start ║"
echo "║ start() ║"
echo "╚══════════════════════════════════════╝"
exit 0
fi
# ── Check if Python deps need updating ──
# Compare installed package version against PyPI latest.
# Skip all Python dependency work if versions match (fast update path).