66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import asdict, dataclass
|
|
from typing import Any
|
|
|
|
|
|
def _normalize_text(value: Any, default: str = "", *, lower: bool = False) -> str:
|
|
if value is None:
|
|
return default
|
|
normalized = str(value).strip()
|
|
if not normalized:
|
|
return default
|
|
return normalized.lower() if lower else normalized
|
|
|
|
|
|
def _coerce_bool(value: Any) -> bool:
|
|
if isinstance(value, bool):
|
|
return value
|
|
if value is None:
|
|
return False
|
|
if isinstance(value, str):
|
|
lowered = value.strip().lower()
|
|
if lowered in {"", "0", "false", "no", "off"}:
|
|
return False
|
|
if lowered in {"1", "true", "yes", "on"}:
|
|
return True
|
|
return bool(value)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ModelProfile:
|
|
profile_id: str
|
|
family: str
|
|
role: str
|
|
backend_type: str
|
|
sampler_strategy: str
|
|
loader_strategy: str
|
|
supports_inpaint_native: bool
|
|
supports_image_edit_native: bool
|
|
preferred_edit_backend: str | None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
def normalize_profile_dict(value: dict[str, Any]) -> dict[str, Any]:
|
|
preferred_backend = value.get("preferred_edit_backend")
|
|
return {
|
|
"profile_id": _normalize_text(value.get("profile_id"), lower=True),
|
|
"family": _normalize_text(value.get("family") or value.get("model_family"), "SD1.5"),
|
|
"role": _normalize_text(value.get("role") or value.get("model_role"), "base", lower=True),
|
|
"backend_type": _normalize_text(value.get("backend_type"), "none", lower=True),
|
|
"sampler_strategy": _normalize_text(value.get("sampler_strategy"), "standard_k", lower=True),
|
|
"loader_strategy": _normalize_text(value.get("loader_strategy"), lower=True),
|
|
"supports_inpaint_native": _coerce_bool(value.get("supports_inpaint_native", False)),
|
|
"supports_image_edit_native": _coerce_bool(value.get("supports_image_edit_native", False)),
|
|
"preferred_edit_backend": (
|
|
None if preferred_backend in (None, "") else _normalize_text(preferred_backend, lower=True)
|
|
),
|
|
}
|
|
|
|
|
|
def build_model_profile(**kwargs: Any) -> ModelProfile:
|
|
normalized = normalize_profile_dict(kwargs)
|
|
return ModelProfile(**normalized)
|