feat(ml): LoRAs con prefijo de arquitectura (SD15_/SDXL_/FLUX_) + refs actualizadas
Mueve el indicador de arquitectura del SUFIJO al PREFIJO del nombre de cada LoRA para que el dropdown del LoraLoader muestre de inmediato que LoRA casa con que checkpoint (evita el shape mismatch SD1.5 vs SDXL que crashea ComfyUI). - 20 LoRAs renombradas en disco (15 SD15/SDXL en /mnt/2tb, 5 FLUX en ~/ComfyUI), mapa de reversion en ~/ComfyUI/models/loras/_rename_map.json. - Refs actualizadas en builders gamedev-2d, style presets, pipelines, tests y docs/capabilities. Defaults hardcodeados (pixel-art, lcm-lora, etc.) apuntan a los nombres con prefijo. - Ejemplos genericos en docstrings normalizados a la convencion de prefijo. - comfyui_replicate_civitai_oneshot::_norm ignora el token de arquitectura al comparar, robusto al reordenado (sufijo civitai vs prefijo instalado). Refs a repos HuggingFace (nerijs/pixel-art-xl) y checkpoints (juggernaut_xl_v11) preservados. Verificado: dropdown LoraLoader con prefijos + generacion real pixel-art OK + tests comfyui verdes (481 ml + 26 pipelines). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -65,8 +65,8 @@ res = comfyui_generate_mixed_oneshot(
|
||||
checkpoint="dreamshaper_8.safetensors",
|
||||
capabilities={
|
||||
"loras": [
|
||||
{"name": "3d_render_redmond_sd15.safetensors", "strength_model": 0.9},
|
||||
{"name": "detail_tweaker_sd15.safetensors", "strength_model": 0.5},
|
||||
{"name": "SD15_3d_render_redmond.safetensors", "strength_model": 0.9},
|
||||
{"name": "SD15_detail_tweaker.safetensors", "strength_model": 0.5},
|
||||
],
|
||||
"facedetailer": {"denoise": 0.45},
|
||||
# "ipadapter": {"ref_image": "face.png", "mode": "faceid"}, # activar/desactivar
|
||||
|
||||
@@ -210,8 +210,8 @@ if __name__ == "__main__":
|
||||
checkpoint="dreamshaper_8.safetensors",
|
||||
capabilities={
|
||||
"loras": [
|
||||
{"name": "3d_render_redmond_sd15.safetensors", "strength_model": 0.9},
|
||||
{"name": "detail_tweaker_sd15.safetensors", "strength_model": 0.5},
|
||||
{"name": "SD15_3d_render_redmond.safetensors", "strength_model": 0.9},
|
||||
{"name": "SD15_detail_tweaker.safetensors", "strength_model": 0.5},
|
||||
],
|
||||
"facedetailer": {"denoise": 0.45},
|
||||
},
|
||||
|
||||
@@ -66,10 +66,10 @@ def test_build_only_preset_drives_workflow():
|
||||
|
||||
|
||||
def test_build_only_lora_preset_injects_lora():
|
||||
# cartoon-cel-shaded usa anime_style_box_sd15 -> el workflow debe inyectar el LoRA
|
||||
# cartoon-cel-shaded usa SD15_anime_style_box -> el workflow debe inyectar el LoRA
|
||||
built = styled_asset_build_only("enemy_creature", "goblin", "cartoon-cel-shaded", seed=1)
|
||||
blob = json.dumps(built["workflow"])
|
||||
assert "anime_style_box_sd15.safetensors" in blob
|
||||
assert "SD15_anime_style_box.safetensors" in blob
|
||||
assert any(n.get("class_type") == "LoraLoader" for n in built["workflow"].values())
|
||||
|
||||
|
||||
|
||||
@@ -114,9 +114,22 @@ def _server_models(server):
|
||||
|
||||
|
||||
def _norm(name):
|
||||
"""Normaliza un nombre de modelo para comparar (sin ext, sin separadores)."""
|
||||
"""Normaliza un nombre de modelo para comparar (sin ext, sin separadores).
|
||||
|
||||
Ignora el token de arquitectura (SD15/SDXL/XL/FLUX) lo lleve como prefijo
|
||||
(convencion nueva: `SDXL_detail_tweaker`) o como sufijo (recetas civitai:
|
||||
`Detail-Tweaker XL`), para que el match sea robusto al reordenado del token.
|
||||
"""
|
||||
base = os.path.splitext(str(name))[0].lower()
|
||||
return re.sub(r"[^a-z0-9]", "", base)
|
||||
s = re.sub(r"[^a-z0-9]", "", base)
|
||||
for tok in ("sdxl", "sd15", "flux"):
|
||||
if s.startswith(tok):
|
||||
s = s[len(tok):]
|
||||
if s.endswith(tok):
|
||||
s = s[: -len(tok)]
|
||||
if s.endswith("xl"): # 'xl' suelto como sufijo de arquitectura
|
||||
s = s[:-2]
|
||||
return s
|
||||
|
||||
|
||||
def _find_installed(name, installed):
|
||||
|
||||
@@ -45,9 +45,9 @@ def test_pick_checkpoint_familia_y_exacto():
|
||||
|
||||
|
||||
def test_find_installed_match_normalizado():
|
||||
installed = ["detail_tweaker_xl.safetensors", "watercolor_style_sd15.safetensors"]
|
||||
installed = ["SDXL_detail_tweaker.safetensors", "SD15_watercolor_style.safetensors"]
|
||||
# match normalizado (ignora separadores/ext/case)
|
||||
assert _find_installed("Detail-Tweaker XL", installed) == "detail_tweaker_xl.safetensors"
|
||||
assert _find_installed("Detail-Tweaker XL", installed) == "SDXL_detail_tweaker.safetensors"
|
||||
# no instalado -> None
|
||||
assert _find_installed("LoRA Inexistente 9000", installed) is None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user