feat(recipes): add Unknown base-model filter bucket for undetermined recipes

Normalize undetermined recipe base_model to None in RecipeFormatParser
(previously ''). get_base_models now reports an "Unknown" bucket backed
by a dedicated __unknown__ marker, and the listing filter matches it
against recipes whose base model is falsy. Frontend renders the bucket
label as "Unknown" while filtering via the marker.

Tests: handler, scanner, parser, and frontend filtering.
This commit is contained in:
Will Miao
2026-08-31 09:09:53 +08:00
parent 8d46d26abe
commit 2a3c632dc5
8 changed files with 214 additions and 11 deletions
+16
View File
@@ -26,6 +26,7 @@ from ...services.recipes import (
RecipeValidationError,
)
from ...services.metadata_service import get_default_metadata_provider
from ...services.recipe_scanner import UNKNOWN_BASE_MODEL_FILTER
from ...utils.civitai_utils import (
build_civitai_image_page_url,
extract_civitai_image_id,
@@ -473,17 +474,32 @@ class RecipeQueryHandler:
cache = await recipe_scanner.get_cached_data()
base_model_counts: Dict[str, int] = {}
unknown_count = 0
for recipe in getattr(cache, "raw_data", []):
base_model = recipe.get("base_model")
if base_model:
base_model_counts[base_model] = (
base_model_counts.get(base_model, 0) + 1
)
else:
unknown_count += 1
sorted_models = [
{"name": model, "count": count}
for model, count in base_model_counts.items()
]
if unknown_count:
# Synthetic "Unknown" bucket for recipes whose base model could
# not be determined. `value` carries the filter marker so the
# UI can display "Unknown" without colliding with real base
# model strings.
sorted_models.append(
{
"name": "Unknown",
"value": UNKNOWN_BASE_MODEL_FILTER,
"count": unknown_count,
}
)
sorted_models.sort(key=lambda entry: entry["count"], reverse=True)
if limit > 0:
sorted_models = sorted_models[:limit]