66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from ..models import NodeRecord
|
|
|
|
|
|
ROLE_FIELD_ORDER = {
|
|
"positive": ("conditioning", "positive", "positive_conditioning", "base_positive"),
|
|
"negative": ("negative", "negative_conditioning", "base_negative", "conditioning"),
|
|
}
|
|
|
|
KNOWN_CONDITIONING_MARKERS = (
|
|
"controlnetapply",
|
|
"controlnet",
|
|
"control_net",
|
|
"apply controlnet",
|
|
"comfyroll",
|
|
"inpaintmodelconditioning",
|
|
"conditioningcombine",
|
|
"conditioningconcat",
|
|
"conditioningset",
|
|
"facedetailer",
|
|
"detailerforeach",
|
|
"detailer",
|
|
"impact",
|
|
)
|
|
|
|
|
|
class ConditioningAdapter:
|
|
def matches(self, node: NodeRecord) -> bool:
|
|
lowered = node.class_type.lower()
|
|
if any(marker in lowered for marker in KNOWN_CONDITIONING_MARKERS):
|
|
return any(_is_conditioning_field(field) for field in node.inputs)
|
|
return False
|
|
|
|
def fields_for_role(self, node: NodeRecord, role: str) -> list[str]:
|
|
role_fields = [
|
|
field
|
|
for field in ROLE_FIELD_ORDER.get(role, ())
|
|
if field in node.inputs
|
|
]
|
|
if role_fields:
|
|
return role_fields
|
|
|
|
conditioning_fields = [
|
|
field
|
|
for field in node.inputs
|
|
if _is_conditioning_field(field)
|
|
]
|
|
if conditioning_fields:
|
|
return conditioning_fields
|
|
|
|
return [
|
|
field
|
|
for field in node.inputs
|
|
if field in {"positive", "negative", "base_positive", "base_negative"}
|
|
]
|
|
|
|
|
|
def _is_conditioning_field(field: str) -> bool:
|
|
lowered = field.lower()
|
|
return (
|
|
lowered == "conditioning"
|
|
or "conditioning" in lowered
|
|
or lowered in {"positive", "negative", "base_positive", "base_negative"}
|
|
)
|