Files
Gin3601-LLS-node/model_profiles/registry.py
T

146 lines
5.8 KiB
Python

from __future__ import annotations
from typing import Any
from .base import build_model_profile
from .rules import match_builtin_profile
try:
from ..utils.model_info import canonicalize_family, get_lls_attr, parse_jsonish_info
except ImportError:
from utils.model_info import canonicalize_family, get_lls_attr, parse_jsonish_info
def _pick(*values: Any) -> Any:
for value in values:
if value not in (None, ""):
return value
return None
def _derive_role_from_legacy(
family: str | None,
role: Any,
*,
supports_inpaint_native: Any,
supports_image_edit_native: Any,
preferred_edit_backend: Any,
) -> str | None:
normalized_role = str(role or "").strip().lower()
if normalized_role and normalized_role != "base":
return normalized_role
resolved_family = canonicalize_family(family)
preferred = str(preferred_edit_backend or "").strip().lower()
inpaint_native = supports_inpaint_native not in (None, "", False, 0, "0", "false", "False")
image_edit_native = supports_image_edit_native not in (None, "", False, 0, "0", "false", "False")
if resolved_family.startswith("SDXL"):
if image_edit_native:
return "edit"
if inpaint_native or preferred == "sdxl":
return "inpaint"
if resolved_family.startswith("FLUX"):
if inpaint_native:
return "inpaint"
if image_edit_native or preferred == "flux":
return "edit"
return normalized_role or None
def _extract_profile_overrides(model=None, model_info=None, extra_info=None) -> dict[str, object]:
raw = parse_jsonish_info(model_info)
extra = parse_jsonish_info(extra_info)
return {
"profile_id": _pick(extra.get("profile_id"), raw.get("profile_id"), get_lls_attr(model, "profile_id", None)),
"family": _pick(
extra.get("family"),
extra.get("model_family"),
raw.get("family"),
raw.get("model_family"),
get_lls_attr(model, "family", None),
),
"role": _pick(
extra.get("role"),
extra.get("model_role"),
raw.get("role"),
raw.get("model_role"),
get_lls_attr(model, "model_role", None),
),
"backend_type": _pick(extra.get("backend_type"), raw.get("backend_type"), get_lls_attr(model, "backend_type", None)),
"sampler_strategy": _pick(
extra.get("sampler_strategy"),
raw.get("sampler_strategy"),
get_lls_attr(model, "sampler_strategy", None),
),
"loader_strategy": _pick(extra.get("loader_strategy"), raw.get("loader_strategy"), get_lls_attr(model, "loader_strategy", None)),
"supports_inpaint_native": (
extra["supports_inpaint_native"] if "supports_inpaint_native" in extra
else raw["supports_inpaint_native"] if "supports_inpaint_native" in raw
else get_lls_attr(model, "supports_inpaint_native", None)
),
"supports_image_edit_native": (
extra["supports_image_edit_native"] if "supports_image_edit_native" in extra
else raw["supports_image_edit_native"] if "supports_image_edit_native" in raw
else get_lls_attr(model, "supports_image_edit_native", None)
),
"preferred_edit_backend": _pick(
extra.get("preferred_edit_backend"),
raw.get("preferred_edit_backend"),
get_lls_attr(model, "preferred_edit_backend", None),
),
"model_name": _pick(
extra.get("checkpoint_name"),
extra.get("model_name"),
raw.get("checkpoint_name"),
raw.get("model_name"),
raw.get("ckpt_name"),
raw.get("ckpt"),
get_lls_attr(model, "checkpoint_name", None),
get_lls_attr(model, "model_name", None),
),
}
def resolve_model_profile(
model=None,
model_info=None,
extra_info=None,
checkpoint_name: str | None = None,
family: str | None = None,
) -> dict[str, object]:
overrides = _extract_profile_overrides(model=model, model_info=model_info, extra_info=extra_info)
resolved_family = canonicalize_family(family or overrides.get("family") or "SD1.5")
resolved_role = _derive_role_from_legacy(
resolved_family,
overrides.get("role"),
supports_inpaint_native=overrides.get("supports_inpaint_native"),
supports_image_edit_native=overrides.get("supports_image_edit_native"),
preferred_edit_backend=overrides.get("preferred_edit_backend"),
)
model_name = str(checkpoint_name or overrides.get("model_name") or "").strip()
merged = dict(match_builtin_profile(model_name, resolved_family, resolved_role))
if overrides.get("profile_id") not in (None, ""):
merged["profile_id"] = overrides["profile_id"]
if overrides.get("family") not in (None, ""):
merged["family"] = canonicalize_family(overrides["family"])
if overrides.get("role") not in (None, ""):
merged["role"] = str(overrides["role"]).strip().lower()
elif resolved_role:
merged["role"] = str(resolved_role).strip().lower()
if overrides.get("backend_type") not in (None, ""):
merged["backend_type"] = overrides["backend_type"]
if overrides.get("sampler_strategy") not in (None, ""):
merged["sampler_strategy"] = overrides["sampler_strategy"]
if overrides.get("loader_strategy") not in (None, ""):
merged["loader_strategy"] = overrides["loader_strategy"]
if overrides.get("preferred_edit_backend") not in (None, ""):
merged["preferred_edit_backend"] = overrides["preferred_edit_backend"]
for key in ("supports_inpaint_native", "supports_image_edit_native"):
if overrides.get(key) is not None:
merged[key] = overrides[key]
return build_model_profile(**merged).to_dict()