Both engines ran with the app's interpreter, installed as optional extras into the app's own environment (`uv sync --extra`). They now get one-click installs like the sidecar engines: a PyPI-only spec (no source to fetch) creates DATA_DIR/engines/<id>/.venv and installs the app's own pinned wheel there, so nothing they install can touch the app or another engine. Each engine prefers its own venv and falls back to the app's interpreter, so an existing `uv sync --extra` install keeps working and is never provisioned over: the spec counts a package found in the app environment as installed. PocketTTS installs from PyTorch's CPU index: it never uses a GPU, and PyPI's Linux torch pulls ~15 NVIDIA packages. It stays unoffered on Intel Macs, where no usable torch exists. Supertonic's sidecar loads its constants by path when the revision env var is absent, instead of importing the engines package, whose __init__ imports the app backend that its own venv does not have. The Install button is hidden once only the license review stands between the user and the engine. The installer tests' autouse fixture now removes every spec's env var on teardown: a bare delenv of an unset var restored nothing, and a persisted path leaked into later suites.
44 lines
1.9 KiB
Python
44 lines
1.9 KiB
Python
"""The PyTorch wheel index VoiceStudio installs CUDA builds from.
|
|
|
|
A local-version pin such as ``torch==2.9.1+cu128`` exists only on PyTorch's
|
|
own index, never on PyPI. The app's own ``pyproject.toml`` routes torch there
|
|
through ``[tool.uv.sources]``, but a sidecar engine is installed with
|
|
``uv pip install`` into its own venv, which knows nothing about that config —
|
|
so every CUDA-pinned sidecar install has to name the index itself.
|
|
|
|
MOSS-TTS-v1.5's install did not, and its ``[torch-runtime]`` extra
|
|
(``torch==2.9.1+cu128``) could never resolve: ``uv pip compile`` reports it
|
|
unsatisfiable without this index and resolves it with it. One definition here,
|
|
imported by the one-click installer and by the engine's own bootstrap, so the
|
|
two cannot drift apart again. ``tests/test_sidecar_install.py`` pins the URL
|
|
to the ``pytorch-cuda`` index declared in the app's ``pyproject.toml``.
|
|
"""
|
|
|
|
PYTORCH_CU128_INDEX_URL = "https://download.pytorch.org/whl/cu128"
|
|
|
|
# `unsafe-best-match`: the PyTorch index also mirrors common dependencies
|
|
# (numpy, pillow, sympy, …) at a narrower range of versions than PyPI. uv's
|
|
# default first-index strategy would stop at whichever index lists a name first
|
|
# and could pin an old mirror copy or fail outright. The index is PyTorch's
|
|
# official one, so the dependency-confusion risk the name warns about does not
|
|
# apply to it.
|
|
UV_PIP_CU128_ARGS: tuple[str, ...] = (
|
|
"--extra-index-url",
|
|
PYTORCH_CU128_INDEX_URL,
|
|
"--index-strategy",
|
|
"unsafe-best-match",
|
|
)
|
|
|
|
PYTORCH_CPU_INDEX_URL = "https://download.pytorch.org/whl/cpu"
|
|
|
|
# For an engine that runs torch only on the CPU (PocketTTS). On Linux, PyPI's
|
|
# torch is the CUDA build and pulls ~15 NVIDIA packages the engine never uses;
|
|
# this index serves `+cpu` builds for Linux and Windows and the regular build
|
|
# for macOS.
|
|
UV_PIP_CPU_ARGS: tuple[str, ...] = (
|
|
"--extra-index-url",
|
|
PYTORCH_CPU_INDEX_URL,
|
|
"--index-strategy",
|
|
"unsafe-best-match",
|
|
)
|