feat(ai): add a Reset AI Environment admin feature for the upgrade gap (#459)

Uninstalling a bundle only deletes its downloaded model weights, never the
shared venv's site-packages, so self-hosters who already hit an AI bundle
conflict (e.g. the scipy ABI strand) have no clean self-service path via
uninstall+reinstall: reinstalling just overlays corrected files on top of
stale ones. Adds POST /api/v1/admin/features/reset, which wipes
/data/ai/{venv,models,pip-cache}, resets installed.json, and reseeds a real
working venv from the image's baked /opt/venv (extracted docker/reseed-ai-venv.sh,
now shared with entrypoint.sh's existing base-venv-upgrade bootstrap instead
of duplicating that logic) -- leaving an empty venv directory here would
make the very next install fail with "spawn .../python3 ENOENT", caught by
testing this live rather than assuming it. Ships with a matching Settings UI
section (inline confirm, same pattern as per-bundle uninstall) and strings
across all 21 locales.

Verified against a real snapotter/snapotter:1.17.2 image migrated to 2.0.0,
with real multi-GB bundles installed (background-removal + OCR): confirmed
the migrated instance's inherited python3.11 venv (2.0.0 itself uses 3.12)
still imports the fixed scipy/numpy/paddleocr correctly, then reset + real
reinstall + actual tool execution (remove-background, verified output image)
all worked end-to-end.
This commit is contained in:
SnapOtter
2026-07-07 14:12:00 +08:00
committed by GitHub
parent 60d01ab2dd
commit fb96cf8743
31 changed files with 640 additions and 6 deletions
+7
View File
@@ -3529,6 +3529,13 @@ export const ru: TranslationKeys = {
importing: "Импорт...",
importSuccess: "Пакет успешно импортирован.",
importError: "Ошибка импорта пакета: {error}",
resetTitle: "Сбросить AI-среду",
resetDescription:
"Удаляет все установленные AI-функции и загруженные модели, а затем начинает заново. Используйте это, если AI-инструменты ведут себя непредсказуемо после обновления, а переустановка пакета не решает проблему.",
resetButton: "Сбросить",
resetConfirmMessage:
"Это приведёт к удалению всех установленных AI-функций и моделей. Их нужно будет переустановить с Hugging Face. Это действие нельзя отменить.",
resetFailed: "Ошибка сброса: {error}",
},
about: {
heading: "О программе",