From a1abfb981473237eebb8891e42f4aec0d92de57f Mon Sep 17 00:00:00 2001 From: IAMCCS Date: Sun, 12 Oct 2025 19:15:49 +0200 Subject: [PATCH] B Initial commit: WANAnimate LoRA Loader Fix --- __init__.py | 15 ++ __pycache__/__init__.cpython-312.pyc | Bin 0 -> 415 bytes .../iamccs_wan_lora_stack.cpython-312.pyc | Bin 0 -> 5337 bytes iamccs_wan_lora_stack.py | 131 ++++++++++++++++++ icon.png | Bin 0 -> 11256 bytes pyproject.toml | 14 ++ version.json | 6 + 7 files changed, 166 insertions(+) create mode 100644 __init__.py create mode 100644 __pycache__/__init__.cpython-312.pyc create mode 100644 __pycache__/iamccs_wan_lora_stack.cpython-312.pyc create mode 100644 iamccs_wan_lora_stack.py create mode 100644 icon.png create mode 100644 pyproject.toml create mode 100644 version.json diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..d46cd5e --- /dev/null +++ b/__init__.py @@ -0,0 +1,15 @@ +# __init__.py — Registro nodi IAMCCS (solo nuovi nodi LoRA) +from .iamccs_wan_lora_stack import ( + IAMCCS_WanLoRAStack, + IAMCCS_ModelWithLoRA +) + +NODE_CLASS_MAPPINGS = { + "IAMCCS_WanLoRAStack": IAMCCS_WanLoRAStack, + "IAMCCS_ModelWithLoRA": IAMCCS_ModelWithLoRA, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "IAMCCS_WanLoRAStack": "LoRA Stack (WAN-style remap)", + "IAMCCS_ModelWithLoRA": "Apply LoRA to MODEL (Native)", +} diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ae060d174f5e49826c23cc06e29524044e915bf GIT binary patch literal 415 zcmX|7O-sW-5Z&FR;8#yogc2mjMyPs}BEpgu2_&%?q*?+?$VM8>7fGt5f5eM_z=Jpc zg%`b*T)pV6(t{u#+)b-CVWo7tUxuGiN9i=U_W(IW)ljf=k!mSo;y{0GsVBF9J_az0gUNiG-6RDCEkM$FgzS?dfvMbaMa3Q%t2+Zuw5=x*553 zA`--@Lo$9>%HN-g49bSddWfoH%OVEu_cimxDw|cZt66;=UlJ1=z5m(+n6ozUeR$Ea z-8j4|#=foc^IWstahAs+iP!>}z1XI`5QO-VpA)i|6y?fM7}Ig!9jEJT5dV>Em%&Vc k5PpdQM6(Sb?N6nH&zi7}UOP6D(^X?{w8B&c90kTr2g?_8g2VlXy2_c|%w zW#b`}jFu@NRe~s~%J#BUnIZ*=giVhO1xZ0OqnUwbDbXyFS+Zd314Gb?ZP?CQwpq^S z_$M6{&k{)aC`bXD#~zRr{2G-j4E8M^Hh{kgI#+6 zuIFA`I!bHGQPURzI=SUqbj?_^<8>wS-q)*UM5W>#x}Rvd>2j;5q?_mng%lV+H%3O@Ol;DzT=&RIQwK37w_Y+14_+ZOmV zmp-0zR;3L&yYueph0`nhp4eM+F86ZdQsYV>bL33cbvAuY?`(Qve@*XvH{*Ld>pE5L zY7E$N;T>#Ce}9o}+vY`Qwu z`qu&JfnmiJTwIm1t|MEn&P`Y6+U50R*44L5=lI4OSyz8~H7!rUG2Ev zmVP(gyV#j?*Ds%1I<@M|9PQ4!&!u~Hg5zN<>wbI7-LvWL*%-`>{vhiPZMmbH?r3IG z&Ln@7b^jQcU7qE=OM6#3S6*N3yw{d>wZe4H>bt>(;7aww{aNQ*aEwK~>S0yZd7_N( z+F!RPZAz1$+VXA4)s*)mNA3LJHry8qQ=pe(%tzbpKv_l-3UU|)4U!Raw~-!`Y1R;g ztRZN^e9&w~*bEs17qrZpd=|}J&?NEwP<$XU(mhI5=eZPsDhbu$?T^_MN-6kH>XQRq zFXf;<2fuNwZFn;`*$$-VTAlM0Q2Z?9`BZ?ebdvvb|UL} zJ8k{Su_xDfV5K>?@3pm#b>(qS=E}9rLmy;X#QzIf+ka|(_VMePGw)^gjXZPP8mjU} zM~y9y99A1?ffaqmY5c&@NVn#RB|=yPw zGMYehHi)7IP(-6j)lpDQ0L`i;Vuc)FGiEM_>}tMgcVfa+HE&6db33x>wRcK_>-tv+PwNkC)pu>ycdeh;=*`ymFY-_88keswUEQiXwpn*<&9mXj z)E&##onJKM+%2n(e{vsw+R(n%o^5z@@m#K^ZrQQqSjFp>%<#x&%joAdWBGcR=Icge zt-0%1aAfMc{?M_W{C(H@kqs$RH}J$V2!qlerK_3E27H|E8!e*9JeCN#9?eUWF$q#X zhbZ1ihGNAYdpH)7(t-Kd`TIL6G)vwK8%vCqfUxZWk z9sSx`C+scAq7uUJm5LthwyAo2w@6Fh016R+on*>e zX#qQ3zeq>Xq!2XDgq-!ch6B01uRIfs)DsKT6AML8OfCbLCV)-FX31%2hv~ZYLep5b zj}2%nBh?_otA%BPFQ9{HVf?Z+EanUP@Ty{nmq@y{LC@>aB`F>gbz#nLl?=i%NPvPN3P3XuQ&;jHZH-VcN&(#yQ|}#y{(VZL-~;$%nt~M#-BdDkXyt2= zXCF26Jw-#`=B+|=K@1)2Gcaet1f`m(ReD(p>}`F&JJ2R8voXm_r0LL%FV);lHJ$|} zuafXGJM^{&LQ3?e`y9#mD zU!vMC5kPm|(!kZO9?T=C9(Hci>YFo%xxLR2fNwtJ>bd4;2tfW6YCf84J_Zh;-jIQD T4%FP0YwiMkpJ5X dict: + new_sd = {} + for k, v in sd.items(): + nk = k + if nk.startswith("transformer."): + nk = nk.replace("transformer.", "diffusion_model.") + if nk.startswith("pipe.dit."): + nk = nk.replace("pipe.dit.", "diffusion_model.") + if nk.startswith("blocks."): + nk = nk.replace("blocks.", "diffusion_model.blocks.") + if ".attn1." in nk or ".attn2." in nk: + tgt = ".cross_attn." if ".attn2." in nk else ".self_attn." + nk = nk.replace(".attn1.", tgt).replace(".attn2.", tgt) + nk = nk.replace(".to_k.", ".k.").replace(".to_q.", ".q.") + nk = nk.replace(".to_v.", ".v.").replace(".to_out.0.", ".o.") + if nk.startswith("lora_unet__"): + core, *rest = nk.split(".") + core = core.replace("lora_unet__", "diffusion_model.") + core = core.replace("_self_attn", ".self_attn").replace("_cross_attn", ".cross_attn").replace("blocks_", "blocks.") + nk = ".".join([core] + rest) + nk = nk.replace("img_attn.proj", "img_attn_proj") + nk = nk.replace("img_attn.qkv", "img_attn_qkv") + nk = nk.replace("txt_attn.proj", "txt_attn_proj") + nk = nk.replace("txt_attn.qkv", "txt_attn_qkv") + new_sd[nk] = v + return new_sd + + +# =============================================================== +# Nodo 1 — LoRA Stack (fino a 4 LoRA con strength) +# =============================================================== +class IAMCCS_WanLoRAStack: + @classmethod + def INPUT_TYPES(cls): + lora_list = folder_paths.get_filename_list("loras") + return { + "required": { + "lora1": (lora_list,), + "strength1": ("FLOAT", {"default": 1.0, "min": -5.0, "max": 5.0, "step": 0.01}), + "lora2": (lora_list,), + "strength2": ("FLOAT", {"default": 0.0, "min": -5.0, "max": 5.0, "step": 0.01}), + "lora3": (lora_list,), + "strength3": ("FLOAT", {"default": 0.0, "min": -5.0, "max": 5.0, "step": 0.01}), + "lora4": (lora_list,), + "strength4": ("FLOAT", {"default": 0.0, "min": -5.0, "max": 5.0, "step": 0.01}), + "model_type": (["wan2x", "flow", "standard"], {"default": "flow"}), + } + } + + RETURN_TYPES = ("LORA",) + FUNCTION = "load_and_standardize" + CATEGORY = "IAMCCS/LoRA" + + def load_and_standardize(self, lora1, strength1, + lora2, strength2, + lora3, strength3, + lora4, strength4, + model_type="flow"): + + loras = [] + for name, strength in [ + (lora1, strength1), + (lora2, strength2), + (lora3, strength3), + (lora4, strength4), + ]: + if name and strength != 0.0: + path = folder_paths.get_full_path_or_raise("loras", name) + sd = comfy.utils.load_torch_file(path, safe_load=True) + if model_type != "standard": + sd = standardize_wan_lora_keys(sd) + loras.append({"name": name, "strength": strength, "state_dict": sd}) + + logging.info(f"[IAMCCS_WanLoRAStack] ✅ Caricate {len(loras)} LoRA") + return (loras,) + + +# =============================================================== +# Nodo 2 — Apply LoRA to MODEL (ponte, senza strength) +# =============================================================== +class IAMCCS_ModelWithLoRA: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "model": ("MODEL",), + "lora": ("LORA",), + } + } + + RETURN_TYPES = ("MODEL",) + FUNCTION = "apply" + CATEGORY = "IAMCCS/LoRA" + + def apply(self, model, lora): + if not lora: + return (model,) + model_out = model + for entry in lora: + sd = entry["state_dict"] + strength = entry["strength"] + model_out, _ = comfy.sd.load_lora_for_models(model_out, None, sd, strength, 0) + logging.info(f"[IAMCCS_ModelWithLoRA] ✅ '{entry['name']}' strength={strength}") + return (model_out,) + + +# =============================================================== +# Registrazione +# =============================================================== +NODE_CLASS_MAPPINGS = { + "IAMCCS_WanLoRAStack": IAMCCS_WanLoRAStack, + "IAMCCS_ModelWithLoRA": IAMCCS_ModelWithLoRA, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "IAMCCS_WanLoRAStack": "LoRA Stack (WAN-style remap)", + "IAMCCS_ModelWithLoRA": "Apply LoRA to MODEL (Native)", +} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..698c262a8780d7f9bb4de9fd42b3b4b4329e4e85 GIT binary patch literal 11256 zcmaiacRbbM-}iOSvF9;D$lfZWWIIPBglv+nVG|#CgzUX} zuA|?5-@TsudA*+g(0N_oYkaQH^%?Kac%-Xyk(z>)0sug*p{}YA022O00x}Z#-`bt- z9RNh@HB^-i?U>#9M|b6OC&(NrVufT>bd^c&Bm3xBup5ClOtVKYWJO;+b~k1gJa+;x zMw_(PT{kOpE~icTbkq(>D}#hKa^FL8?nO>)vWzdH_P#~u{->9GUIN_8k05+ zELNru1nW-s*ybY{$1{;N8J(d|WU0a!1ZmOok86)7^x|0DUxKVxqZd)D?7B!Ds!?`| zx)TYTU`!P^B(#OL;kcj0vQV_ zc*Wm0w;m%%FnU{v#e|$ON)o0$>=P1K?xmW6eto`-7UnvL;RCTMu5)aR(5gPca6AAlryX=LZ$ZMdU$k6Q zZHfe>uDJYXX5j*3C-&9+@r(NfNTr=|Us0m}DXFGOSYj%*ij) zA<-z@sa!=?Yho-dJms8Cdlx`(1tgOJ=Z}NTl1OZY33fzGc0IeP5V258-$6Y0bcD#$9@?pm?Z_kwCxY8wLi2mc+GR9 z;7v3qz^b0iCoUraPP8&$l-~FU5gQ5@OUep#1!f&XToCvw6cq?dG?Hq_2G%`yiNVLF z7iKmFa0hT`cL@{&zSZjqM!P}dvUnThoiyvr_0X05h0NP&#&P#F=hMK%+LBF670Gb)M zsk>x>{m?A{K4J&VvONi(mA**<`=kT_+%>+u$hHHWMXvx@!dCag--ORyr+|GtWSy?+ z8`hkwgds$yFtCq(3TNFtSE`dk7(%|h1Ud!i5McDoDaTYA1olY;09@FNUZoQR&p~GT z6T!7cLswyE0>uS?{`KGUmqNd@ej)fvCLZ|5nmhLIyuGZqKmHP7NDPMeQ2KQDp=U*IuBUp(jk9^*@WL@XD3s-yT3v0-o??m-O^h&x08GLym5gnyPV zlN=3qs+db9{yY44cIT7X{5vp)-6VP)k2ruP zXai*vD=r*5`pW0M2TOjEKU07bRxL$q@g7kU4@)#GrU24^N7bs zYyR#Udkk#taRN{rYxd&I^l(MD6cxeo0mIzt)>?QDoCda-}|~_N{rPew>)q=?4!U*wklM{OqJ9 zCnx{@@&ctpS9bVWw_)=aXB~KM|LKl2D|OURQ+t@1ovrEU_?nTK`I55oT}DR6&&%V@ zS?TH62o6ONd7p)ty}f{zj*j^Gf$~d1L3PgkB^qVUeLNA3L$gM=?wD^SV1nz$jb?wm zQwgMgrmzw=)$3kokfS3Dk9hR)edW(c-iyg=YioF`FVo*%#nv-5-%4h4t>9i8_u7bz zj2xrlQ23cBcl&j*Lzh5S!RkaybbHbDFUjxin&lMzH@x%>3{-+^%QjUeTVqq?7b+SP zrJUl5eHJa@+_$eTK9jQw-Y;GK#O5YLi`gseD!zF+2i_}#(@upmLmFFskr9c1d`y%v z*^zl?e=(Tzk)1)5-YYfY9XWaihFIo%#SJt-SXj8dGeaeXn372*M<-=vQYvm@X{@om zJI^5H?c0-rva+&k?;Q;==C^x{+V7JyB*SA#Hsm@?%+2TCTGsX_o^^=w+#K?e4`-96 z+23MYA*)67D{9e#cUQ}e-8C&7A?cAa=lHLbyQV}xe~$h+`?Tyi$h5RYh4pR&o%#OK8B)$&ZeHHTL~)z*=?FpNk-$w0p{ctz&pO%ChZ@&_ zxa*({an9wI{t^efz4yY}1(vlu%X0TKW3P z`jlD8(!7+6P9b9ScaqzWDzfCBayP4;4|=_{&lEQj49v~hH@*lnAkz0p;}L3Fkd91v zr#hFzcKOAai3xj4h40lqZVrPL?-zG{mp+gNj)ac9Hhw4KR=1tqmZ~_=yPPf0wmVii zl^R`tuwD=a8RTs+N{8UGU8tHpZB=end_#Mt=S_UUF4?8?=kE;$AMV#JjIVqVi??Zf zxLrkCFXixEHSV;PP=ju%qtVFlH+}(uow|n69Lrk2mYlR8k)GE^l-0r+MejL940E~M zYL*}J@$)|zVibZ9>UsKbVoqk}=lSvxj?Z-sOL!FRR?$#h;I8H?weWzxvJp9-g_C`K zefsZhn+lWYMXv7JKmtA1drU%ysD#u&SeRNks|FNM0NHaLIX2?Nhvt_)VausS=)M6vTk{e+y?^H1SyUmjAkA&1;_IRciH zw>yFlUOD@JO_GjZ7^)T>u+%+WJts-fFT;0cJ@NBt3cmUto}T>D(k5}It_mbcyTzT5 z_x=nuGqbR8soDQm@7pT|e|p{sQnQ|Ye$J&|eW1)G%VnVKu0^D+C&p{O--z|BefqVl zn7yTtfP?L+sOV^3Hfh%wc;J`2DAJ%kY8+HeO*69>*REYtPm#Nw3EB9)#@EwfxTca| z1@o)^i15$jWizavL43s*>pSkuK-SJ@b*F|{6GtNK7Z}t^k=U?cB zK(v+cwK^w(svX>Q>@2^5q&5Nv%SgpUhUIN5@SFUx;hxZ=t zj~pKNakedW8&MKGb?U2U5@*oX7`}f_#u16l(u_@p21mrDcdoBE<>^zZk!E%16;cil zHtU(^0PD&SjR@y%!BGDJ9*BZC>Lf#8yo>XE&( zWIZ^)wqg#gHPnxx3cK-71wregm*=&$w7kwa|3up-84=-bruwQmBps~8*Avy5b=L<6 z--O;OV*Dc~a9#{`9jfy6s~xKLpmWIJB1+s1ZHIWpcd?ctk$6IN0 z&~q{<&Nxmblt$P$o_*r|ExYZN$<+RV0;_uLz^u$L3JX2e_h%f&IBRkioKlU8-+H`)@$@=gd0Q3md;&E%&sEUxc$ktU#W;)FuQeXGbiJCApziza#Kq6nDi5iaz4jOT8tVPl9j`#6GB_|Z zTw4uYkKn=-sY83RY*FB@w@Jrwacf-n8ffS%OJ=xCMb3wPD_meeO4TvZ7`V3FiuWlAmJdcUt zgB)M)j!RFLyRB*IJ9*5cLqkU=&VRACx5pEj&ObXQhZGbP6Q#YDp6l#AP)l;J$wM2p z(!^{f)Mv~BkD#EW91n7BdVGvGu(?x+3$Xl|!W>qXIQEDvOcj`wY8n?oVruHF=wK&URV% zQC!XxW_PaGW9W9Tup_l0FJNhPDypj(g~DM8kq*b^hFO`juuFf*a(8z6+)#Dzx(@=n zJGxa`E`C0~kLz!O83eT4_t|6Ryr$D9OgKC}Jgz~4huIkEcg6@x6w{)#})1r=D5VHMT}${;o>d*TGl;n_a&{@7$_|~faAnI^Y3P3a@Q^zayvJcW>`6b((}AMzhT5otf13&|;8aWo2cN|E6o=nVS&` zE1!A4XI*0M<&0ORM&j-oiXEnv`mWx%QglsYaNymQ;_S6QJ)%(HPNf>*R!&ntnfhK2 z4S7qltfzVTg;J-2+8?XujNh7aSNkj)cfMHaq@99r@k=vj@Y{fD%y!G=%;3WVN$)w+ z?O#vCCLkF_P?~*r=gTKELOG(^Q{?@ti0IyP0~P^A#i3Q^m>ccMSN_!Ztw~_Ly~`%1 zrmFqg)0IOAxFPFcH-uKnelRPThsVLeVWlhWpnKK3p(gY$#ad(5uS%bXS06okL~s(v z<-BsAa$+n!JUj?!jqnbwA0IJHLN^}=Ve{@V%>Wuuc@DUgYnYjt4R##+G8POi0ei^epGE~Ym1@dRr?$xY;X<2-<2Vskrqm^8ZPK0y-t+e5=P=| zYU&zKi+yz)DErz~9Z!(@`cnlV8qoq8dU}y>rUs#&@egzHr(QZ7hMuOc+%4_R)Ye$5 zXn|o-N~u$?NS}`Bbm*lNr9iWTy(tWY0d#Z@{Uvz{drOT)_TPB64|W%?L)+%jbj;-b z&`CQwK=r-QMrCHO(sQuGhyCJ>uP=-iMj)H~*?I3ceI#d**8cm8%@HRE-~w|{o)>?RlJ$Bi(XV5-cslgEOJC82osD_Xi_bWytA+Vr>t@_j zSnE_NvTdSRP-1zdN;j6oNHX1>7oFqN15?Lwo5TKMzw5#xb2VfGKGzq>GIPbL z2>FHQ5IHs9o*5A>sG+aq8JqkQDfGw>bMi`&s#&?~DN5$kRPYQd?AFvvzbNbP@s1g-Z_$5o~g;|K`J?WO{xDR?OtUnPB}!h`{Q0$$34sTe^}5o* z2YVHDwMi){^A3q}ii#Glb=$uy(l|>Xa;TdHg zo7VH)=)0K(WmXbGtL?es4h4$~nPw0lZz*Ag$-s*@(5&tKVy<5*3BNPavN%wF`FBU! zqQi(lAQjiI;9Hg@_K_2lliO9#?&MZEYd5)gHL7AhEKv`y^y-(y)c*;P%US*ebRQ1Wko2ijTZ;ZE#I%W&%hvVm8JO$|z1rLg0M&WmR z%53EcOBGeZk=jY;QU~Z_pnMSQcC4#G^QFVnW!GBhI|l5Bs!F?a^;DFd8dNYu1<)2N z9qxHyT(&|hL`vJ zw5p^E)dS**;;zGx*la{mTQw$Nlbf4c8G4AEbg8in&Ib6QWR6ObJ^;VH4B%t=ba z{@ei+Y1fO z!i#dfa?N0S19Kaf%g@q;^cvv^hG2KGz93iXz;pFUFZM%k>Nm zGt>FMDTB`E4vR5%u~AVx5W4&S{OW%FcUxk9(1m5&g1Vj8$uMNJd9o+vHmtxOj}_qK z`wYeXDRt3WNRZ*)58Ue!zc30U?uORxaf@;-N@+oz_u*DE zCdL`+?hQ#8_3#f+utIQC(_Fy*#?L~VTl@H@!gAho z_JbXspLS0N!KY3&rfpb(4qwDS=PV4ueE;O-K=920Gd+?w+E@q(dv@wO?ae{=M(QI+ zIvPTIzBaDTclCE_s+F#8`lJ}s!$%vbaScHO^}+Q7+|jpj zu$F^qDeh2WyHhydTaZS`yQK!Kv{cmXUBH;(=&>FWN$;^qf}8&dzRy0(yPsd)7+d%{1ZNwiiJ{7EqP1LsL^^*G%I(mEyxE zDtZY9v@wf0(8y^nsQsBL2w=_bHskab`Sy$M69raN^Ko(TVNl1eR1>rh9IfvkZKkAa zj9+e|!1py*FV@ZGoyvl*AAZL6BbgvCFYiK`g?Ha|9q0j*doBIH5&}~~{66Ti5c=I1 zXnIU{a^Hj^*d9j5n+#(k-#@DY+An0>>i5fFYHF@D=>&{mq5pXpB$z$jc> zvsB+-8;KHTKsQ1xH5NIAhYyX^z^{l#T`=Gu&g!}}%4XsAe?OEf# zs@rea<-F7h+rm^X%m{bEHsO=-vg$oQ8xLK1|Xj~U8)OoR>k&Ay9DN)m;ck=Amn_qG>ie!NRM z$|jW=z2y95Q0?t9GgMu^wlE~$?VaE)>#AEpfkjCe8v||-A*Yz@j$c8L^+6zXiVzW&gkM(L zR)xBhlY8O)m-hCJy>Zq6D(kohl+2o;G$*b>_-Z4~Z@3n605dWTY)@fT^Zf7ip?dYD zFNZf_P^YeRuw{37;4`$x>^SsW=qFpGdd*)=^gBm?quqf~S3CrX7a?S1@HQw>17v!( zwlAmdo9XIu9q#njGnRfWG80-B7%crM zOnRw^#D>9q1~)uny(AoFvvnibWnboASooSE-@8hiox4TP*ASVKatfxI;|PftsHaTc zo~NN{=8G24K5_-U`>K_kmVPr?*aGnt+dtiT-^*OCD!o|dnyY4fa6tA)2S-Sb)ubU% zB=?7{&fI8Q+LN=bRXOg1Jek%ikErtP&bJsKpaepO{qnpCHwH7}3z-X(bALK%DR!Xi z`~bs?;#C;u$<6i_(C%Khu!W(t&gR093dV=}&PTpEwTC-oJistdze(16E+Hon3h`$R z4Gr?zdJ-y@(aL%l{2l)cgTbvsb#3k2ge33H5BG@M^9*tnYMG?roquU1o%`C-+Ufxl zhANl{y@gQdG-d1e=iO2&J*VRQcWvrn_#vMbu=1#@zzQQMAtA9g?tT=PuWAp8EX3D3=-X8bIluBjKN^?n8GMun8GS&FaGkgc|NKibwR-`j^iQRvMgh9TbA>jfYyUVQHEA-e>ZOABGP? zb0ZTAewb&9hL&!BYsazYH9t%_N5gDio_S?aW@e^3e2fdK6A(~&{Q5{vcmS9WF@fUA zONgn~XM4X?-JT^RKZ;;};ud?WLGtOmO+vNp><6A+&?wP zqjFd7TY%q$v&66Fl_vkcihP7}eL`Lv>;EdmJ>~~XituBbzU%yr|GNSR>xx?(@Z*iJ zyc_?N+&*iAQ9{{yjmh)f|5{T?4FYK4N5#t5-~K5KJ{AN^5^&h>mPOJ(#Y9H8|7?Xe z(f((v=kWmF3}@dLT`>E%Hd=tdJ%cqovd|pXzr*@;z!Xx=Wt!?F_778F9ajlE7l?hJP*Bu z0N(Law@5T37wCR0fxQ!uouKs6T5_DxheG^>z0rt<3Y4bU0 z8WL_Mq!NR|@-eUhF5Sp?{CYHihfc{IfRPJT4^*UwtWZ^@bP0+zqK7)xP(Ok&Fj~- z3#CAqsUIEzmwmhS|U(L=2?dZ z?aerVo3_h81)F7vA6@Y((hj~bfCs&6oI{y5TeKh?lc3~g(b1+rwVjK?vjBI zHtj|@LLU|VfAvwFA`t*vp|Zx@NSq&)E^NH2G?GB#Ff6%nmgj5OM|EI>hb>lZSxOmp zA!GMpz2)Xx*wA&C>Tg3Af=hvWUwm zmd#SU8IA)|{`0=wmGdf%Hq|DumR_64=&`g z;5x~b!8z;U2TUwsoyTl|UV}O1ytq(?{5_!ciJj6#LdJ%^0chcCD0sznZA2O%o6RZ4 z#qH^c?<4Nt-DXg;1H6u8s3itZ0iKW#Pjh+Ec*@`Es!Snl=eVi3nA)BcB2g#K@uIQ! zebI5Yqo^q~*&M!xluQt*%Y;-uE8ceyFLH^aR$0*~9Y#FcdF6_PMx4y86>z}C zlG|iXEc8i(nCOYM?z!K5TwKY{ILntD=mbxo?JkMDK`AdT9ts}r1e-M9N9QeISfP>w NjSD)e`RA?g{U1X_(lh`7 literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2e14f76 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "iamccs-wan-lora-fixer-stack" +version = "1.1.0" +description = "Nodo IAMCCS per ComfyUI che applica fino a 5 LoRA (WAN 2.1 / 2.2 compatibili) con fix automatico e input/output MODEL." +license = { text = "MIT" } +authors = [ + { name = "Carmine Cristallo Scalzi (IAMCCS)", email = "info@carminecristalloscalzi.com" } +] + +[tool.comfy] +publisher_id = "iamccs" +display_name = "IAMCCS WAN LoRA Fixer Stack" +icon = "icon.png" +requires_comfyui = ">=3.0.0" diff --git a/version.json b/version.json new file mode 100644 index 0000000..5ecb857 --- /dev/null +++ b/version.json @@ -0,0 +1,6 @@ +{ + "name": "iamccs-wan-lora-fixer-stack", + "version": "1.1.0", + "author": "Carmine Cristallo Scalzi (IAMCCS)", + "description": "Nodo IAMCCS per ComfyUI che applica fino a 5 LoRA in stack, compatibile con WAN 2.1 e 2.2 (Flow)." +}