feat(recipes): explain empty LoRA lists with collapsible "Why no LoRAs?" panel

Record import provenance on every recipe: a new import_info block
(channel, machine-readable no-LoRA reason, diagnostic details) built at
import time across all channels (batch import, single URL, local file,
upload, widget save, re-imports) and persisted in the recipe JSON plus
the SQLite persistent cache (new import_info_json column with ALTER
TABLE migration).

The recipe modal renders the empty LoRA list with a collapsed details
panel showing the import method, the reason (CivitAI API returned no
LoRA resource data, API meta missing, no embedded metadata, ComfyUI
workflow metadata, video, unparsable format), and recorded diagnostics.
Legacy recipes without import_info fall back to heuristics labeled as
inferred. Genuine no-LoRA generations show no panel.

CivitAI images are always classified by API meta shape: the onsite
generator writes A1111-style EXIF without LoRA references, so parsed
EXIF cannot prove "no LoRAs used".

Adds recipes.resources.noLoras* i18n keys (all 10 locales) plus
frontend vitest and backend pytest coverage.
This commit is contained in:
Will Miao
2026-08-30 16:28:41 +08:00
parent 3fd29f6943
commit bccd494a56
23 changed files with 1342 additions and 10 deletions
+31
View File
@@ -898,6 +898,37 @@
"notInLibraryTooltip": "Этой модели нет в вашей библиотеке",
"deletedTooltip": "Этот LoRA был удалён из источника и больше недоступен для скачивания",
"hashInvalidTooltip": "Этот хеш LoRA не удаётся распознать на CivitAI - возможно, модель была обновлена",
"noLorasAssociated": "С этим рецептом не связаны LoRA",
"noLorasWhyToggle": "Почему нет LoRA?",
"noLorasImportMethod": "Способ импорта",
"noLorasInferredNote": "Возможная причина (выведена) — этот рецепт был импортирован до того, как стала записываться диагностика импорта.",
"noLorasChannels": {
"batch_import_url": "Пакетный импорт (URL изображения)",
"batch_import_local": "Пакетный импорт (локальный файл)",
"url": "Импорт по URL изображения",
"local": "Импорт локального файла",
"upload": "Загрузка изображения",
"widget": "Сохранён из Workflow",
"reimport_url": "Повторный импорт (URL изображения)",
"reimport_local": "Повторный импорт (локальный файл)"
},
"noLorasReasons": {
"no_loras_used": "Метаданные генерации полны и не содержат ссылок на LoRA.",
"api_meta_no_lora_resources": "Исходный API не вернул данные о ресурсах LoRA для этого изображения. LoRA, отображаемые на странице CivitAI, могут поступать из внутренних данных, которые публичный API не раскрывает.",
"api_meta_missing": "Исходный API не вернул метаданные генерации для этого изображения.",
"no_embedded_metadata": "Изображение не содержит встроенных метаданных генерации, поэтому восстановить информацию о LoRA невозможно.",
"workflow_metadata_limited": "Встроенные метаданные изображения представляют собой Workflow ComfyUI; извлечение информации о LoRA из Workflow ограничено.",
"video_no_metadata": "Видеофайлы не содержат встроенных метаданных генерации.",
"metadata_unsupported": "Изображение содержит метаданные в формате, который не удалось разобрать.",
"unknown": "Причину не удалось определить по сохранённым данным рецепта."
},
"noLorasDetails": {
"apiMetaFields": "Поля метаданных API",
"modelVersionIds": "Сообщено ID версий моделей",
"embeddedMetadata": "Встроенные метаданные",
"present": "найдены",
"absent": "нет"
},
"download": "Скачать",
"downloadLoraTooltip": "Скачать этот LoRA",
"preparingDownload": "Подготовка к скачиванию...",