Extract SDXL format dispatch route
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Callable
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SDXLFormatRequest:
|
||||
source_text: str
|
||||
metadata_json: str = ""
|
||||
negative_prompt: str = ""
|
||||
input_hint: str = "auto"
|
||||
target: str = "auto"
|
||||
style_preset: str = "flat_vector_pony"
|
||||
quality_preset: str = "pony_high"
|
||||
trigger: str = "mythp0rt"
|
||||
prepend_trigger: bool = True
|
||||
preserve_trigger: bool = False
|
||||
nude_weight: float = 1.29
|
||||
custom_style: str = ""
|
||||
custom_quality: str = ""
|
||||
extra_positive: str = ""
|
||||
extra_negative: str = ""
|
||||
formatter_profile: str = "manual_controls"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SDXLFormatRoute:
|
||||
output: dict[str, str]
|
||||
branch: str
|
||||
method: str
|
||||
target: str
|
||||
style_preset: str
|
||||
quality_preset: str
|
||||
nude_weight: float
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SDXLFormatDependencies:
|
||||
default_negative: str
|
||||
apply_formatter_profile: Callable[[str, str, str], tuple[str, str]]
|
||||
clean: Callable[[Any], str]
|
||||
row_from_inputs: Callable[[str, str, str], tuple[dict[str, Any] | None, str]]
|
||||
row_core_tags: Callable[[dict[str, Any], float], list[str]]
|
||||
soft_tags: Callable[[dict[str, Any], dict[str, Any], float], str]
|
||||
hard_tags: Callable[[dict[str, Any], dict[str, Any], float], str]
|
||||
fallback_text_to_sdxl: Callable[[str, bool, float], tuple[str, str, str]]
|
||||
assemble_prompt: Callable[[str, str, str, str, bool, str, str, str], str]
|
||||
combine_negative: Callable[..., str]
|
||||
sanitize_negative_text: Callable[[str], str]
|
||||
|
||||
|
||||
def format_sdxl_prompt_result(request: SDXLFormatRequest, deps: SDXLFormatDependencies) -> SDXLFormatRoute:
|
||||
style_preset, quality_preset = deps.apply_formatter_profile(
|
||||
request.formatter_profile,
|
||||
request.style_preset,
|
||||
request.quality_preset,
|
||||
)
|
||||
target = request.target if request.target in ("auto", "single", "softcore", "hardcore") else "auto"
|
||||
nude_weight = max(0.1, min(3.0, float(request.nude_weight)))
|
||||
row, method = deps.row_from_inputs(request.source_text, request.metadata_json, request.input_hint)
|
||||
|
||||
if row and row.get("mode") == "Insta/OF":
|
||||
soft_row = row.get("softcore_row") if isinstance(row.get("softcore_row"), dict) else {}
|
||||
hard_row = row.get("hardcore_row") if isinstance(row.get("hardcore_row"), dict) else {}
|
||||
soft_body = deps.soft_tags(soft_row, row, nude_weight)
|
||||
hard_body = deps.hard_tags(hard_row, row, nude_weight)
|
||||
soft_prompt = deps.assemble_prompt(
|
||||
soft_body,
|
||||
style_preset,
|
||||
quality_preset,
|
||||
request.trigger,
|
||||
request.prepend_trigger,
|
||||
request.custom_style,
|
||||
request.custom_quality,
|
||||
request.extra_positive,
|
||||
)
|
||||
hard_prompt = deps.assemble_prompt(
|
||||
hard_body,
|
||||
style_preset,
|
||||
quality_preset,
|
||||
request.trigger,
|
||||
request.prepend_trigger,
|
||||
request.custom_style,
|
||||
request.custom_quality,
|
||||
request.extra_positive,
|
||||
)
|
||||
selected = hard_prompt if target == "hardcore" else soft_prompt
|
||||
selected_negative = (
|
||||
row.get("hardcore_negative_prompt") if target == "hardcore" else row.get("softcore_negative_prompt")
|
||||
)
|
||||
output = {
|
||||
"sdxl_prompt": selected,
|
||||
"negative_prompt": deps.sanitize_negative_text(
|
||||
deps.combine_negative(
|
||||
deps.default_negative,
|
||||
selected_negative,
|
||||
request.negative_prompt,
|
||||
request.extra_negative,
|
||||
)
|
||||
),
|
||||
"sdxl_softcore_prompt": soft_prompt,
|
||||
"sdxl_hardcore_prompt": hard_prompt,
|
||||
"softcore_negative_prompt": deps.sanitize_negative_text(
|
||||
deps.combine_negative(deps.default_negative, row.get("softcore_negative_prompt"), request.extra_negative)
|
||||
),
|
||||
"hardcore_negative_prompt": deps.sanitize_negative_text(
|
||||
deps.combine_negative(deps.default_negative, row.get("hardcore_negative_prompt"), request.extra_negative)
|
||||
),
|
||||
"method": f"{method}:sdxl(insta_of_pair)",
|
||||
}
|
||||
return SDXLFormatRoute(
|
||||
output=output,
|
||||
branch="insta_of_pair",
|
||||
method=output["method"],
|
||||
target=target,
|
||||
style_preset=style_preset,
|
||||
quality_preset=quality_preset,
|
||||
nude_weight=nude_weight,
|
||||
)
|
||||
|
||||
if row:
|
||||
body = ", ".join(deps.row_core_tags(row, nude_weight))
|
||||
extracted_negative = deps.clean(row.get("negative_prompt"))
|
||||
method = f"{method}:sdxl(metadata)"
|
||||
branch = "metadata"
|
||||
else:
|
||||
body, extracted_negative, method = deps.fallback_text_to_sdxl(
|
||||
request.source_text,
|
||||
request.preserve_trigger,
|
||||
nude_weight,
|
||||
)
|
||||
branch = "fallback"
|
||||
|
||||
prompt = deps.assemble_prompt(
|
||||
body,
|
||||
style_preset,
|
||||
quality_preset,
|
||||
request.trigger,
|
||||
request.prepend_trigger,
|
||||
request.custom_style,
|
||||
request.custom_quality,
|
||||
request.extra_positive,
|
||||
)
|
||||
output = {
|
||||
"sdxl_prompt": prompt,
|
||||
"negative_prompt": deps.sanitize_negative_text(
|
||||
deps.combine_negative(deps.default_negative, extracted_negative, request.negative_prompt, request.extra_negative)
|
||||
),
|
||||
"sdxl_softcore_prompt": "",
|
||||
"sdxl_hardcore_prompt": "",
|
||||
"softcore_negative_prompt": "",
|
||||
"hardcore_negative_prompt": "",
|
||||
"method": method,
|
||||
}
|
||||
return SDXLFormatRoute(
|
||||
output=output,
|
||||
branch=branch,
|
||||
method=method,
|
||||
target=target,
|
||||
style_preset=style_preset,
|
||||
quality_preset=quality_preset,
|
||||
nude_weight=nude_weight,
|
||||
)
|
||||
|
||||
|
||||
def format_sdxl_prompt(request: SDXLFormatRequest, deps: SDXLFormatDependencies) -> dict[str, str]:
|
||||
return format_sdxl_prompt_result(request, deps).output
|
||||
Reference in New Issue
Block a user