From b2e4ee911a50436a1cbcd3146b94076af0f06fe7 Mon Sep 17 00:00:00 2001 From: LuqP2 Date: Thu, 18 Jun 2026 09:35:24 -0300 Subject: [PATCH] feat: enhance MetaHub chunk processing and add StylePromptEncoder2 node --- .../metadata_utils_impl.cpython-310.pyc | Bin 0 -> 34050 bytes .../metahub_save_video_node.cpython-310.pyc | Bin 8954 -> 9520 bytes .../video_metadata_utils.cpython-310.pyc | Bin 12336 -> 12682 bytes metadata_utils.py | 4 +- pyproject.toml | 2 +- tests/test_workflow_extractor.py | 69 ++++++++++++++++++ workflow_extractor.py | 38 +++++++++- 7 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 __pycache__/metadata_utils_impl.cpython-310.pyc diff --git a/__pycache__/metadata_utils_impl.cpython-310.pyc b/__pycache__/metadata_utils_impl.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ff6f7dc2179550a1f58b92cc405b1133aa43b8a GIT binary patch literal 34050 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 literal 0 HcmV?d00001 diff --git a/__pycache__/metahub_save_video_node.cpython-310.pyc b/__pycache__/metahub_save_video_node.cpython-310.pyc index 14ca55479bf0de111e09868d8af5fe37c3d9c971..680f1986a07a8411c19536807aaf15159de7d07b 100644 GIT binary patch delta 2199 zcmZ8jTWlN06`dKbmeh)*D2k-`ep5E}q-8xU*G<~QX@Vk2ff|ia$F4woD3`KDsmrBZ zyLYV?O3?t%JZD#;mXJQm-(b&+9nM*k*_m_9 z&Y_JXPilpIcbmb;U(L4$Znu~CB_;=@@dUFAa!C5o7G*#N(Uz!41rl!J;Vze<9SN(47e;(W|49Vow8Y0V>171Zg0=vjXYT802bgy zf{)!+5Y1ACX1X4`hTaI(@R<)$^*T3;mbMij^nKQ-a>ue_Q~_T}u@sZzc-KXwAL}xE32hwh5gI$rPG7Z`ubd{fo{(Q@GI@ZO z6_>+QR@+>TPz9Y)8V4Sv1Hdsl2ux5FSfx2&iY9<*ngnKO3Yep5-~{=BlN10>Q4r{* z9B`Tr17~O$I7=a5jYfcnXaP7!i@?LQq_F?MC4w6b?oA1?|kaD{10u97pn4{Um41$oH?WOL_C$ zu-C)?rZ&T`^F8&g(ckd5)u*E`imIVLi_NL$BY&Ci4L3Kwzgo8}vw5atH8)$m&_=_m z%eqxxZEtqWvyFCd_%37Btxj9DqWAKY`d#$NQqR-2%wD?jL(8n6wN@`}n&;OpY+l+Q zP%XulW@2YL%?on%ZlHeX=$HB12{vLs;YZa6v1bf(88yW`2~a;B`|HHMwX8K87i7B^ z*r>NU^$V-b)>g-An~yv0ryTc{_(Q_SRX3hriEuync|ttSgCfW^_YQI2kHzOcpU>;l z<9Zxp;s4)`?c*XK_?K_}lc3+=I$~)eqCScLC@KD|U-E*aY z`dCoA347aJ{@s=JbhBY~%+}cqmU-tIhoR$fOX#1lj~3hI#Bm}slrd`*ko-J1!#L(b z3KYf>$?X6IT^1f-Jz&#dgKkfg11PXgAr&>LyPcdn;FUfMl6cyxL5b}273B(iG z;G3o&zE{GJpi(^4Ig>w8zu3q>=6r{0)O;30W=rYCuMVv`rt=5HJgpur{?;?&=l=uH C+*e}& delta 1662 zcmYk7O>7%Q6vtgeyIIz##MAD#?xxWlH^@a@jdcj*Ap!-N_}hG&r`n9DMBKAi67T|%eTqeFh!)z zmkxWzMi=GU+%Ftu&7#4)*x41%e224hX-^X-IoH|8+8XCn4i3Fst&08W5Gzeq{$U=}JJ3u-DVsDXp zkTM#u0+@r84pI&wvNNE?t;k^-bpP^X{zy|36@P>Z?msxq1Yv!X_PU@ia&MkFtJ9j*t5XI08L3Q5>$b9 zQx%$~8g!8Qp;;P$_R%182aP~2+5xqx4lU3Sv`E9yI(0#ZCBZu6Bq zw%-0!;UqDF4!(eU_t*v}j=n_ix)T%=e382;%5P{wL*I4_?#Cz|&_Y0UP#ZKJTp1$N zMyCgUIPmSjkBG8~i9!?5w=isB`UND@RkEdhqQiG2+2aulPbN&Z{K~Gk9QYaaa4A7a z>ZTN>sfV(-6?9!-@dBY<%1{mreHYmLmQ_t>e-!(a`$gn22#w^I;DyjyeYlsh#~NYc zco&pK;gZgo7ZDEehPnOXnM80$a26G+xOb_7B-q5gi@=g922nYr7L~XCdR2Z`xF_#8 zdHJg|q19vZ6UQmJ>o{Ncypk7`98vPNl6RC`kaqE2W(Mv|{N$W>;`IeFclyLabN;mZ z^3_r!d`tzsDwj%@UUg5&%ca%vndtw5T55h($(oY4Ae-T(S$Fo-vU^dHcjfcta$*tg zD4y@~2XLY#N#)}u?GG)jX&Mg(H&J2mgNj4d{Tv;*ZC6ZgZR*RO>xR@;hLW%nUCE+6 wP%ZPDa<+Pq+ww+L7@8ITP3CKM_w$t^*`gz$o1M6y4l751>=f+oz@sAoKzfAn&jhYyKk@y7P58^pt?QHxm z650X__*SvIzD#zA59?PXA|Ob>7l6+h7Z>V#DvZw1IeMD1aFxsiB#Qu3%K@G)tN1Z8 z38Nb*2g+)P!lJXV!d0cERwZt5mhvku%`B2v?(@CWftMiL&SGwe#o@wCU2wTFM0Gp+&X4X=rFw^D~-*sN8(pdtM)^doov9?*%E(PAs z+9mG*-oZK~Uj}>`TPFE(;LF)^$&Ih<&_KLRSV-b z97mw?!wZ6|7se6T_L})HyLLYK6qyOTYB`8ieu(h&oKg`~?_3W!LVRw*2Xjt$Eg!pz9&CDZl7C2P{M4_k1K zI#{0y@O?1w+YoL?0p(pVc;SUu7fK9Ys>Tb#L!f;YIubW<|$n8SWCNCkNY`85Du(6qS@C&rq?VZEqs>E=;4pLJ4XEEV>GR;f@t%CWSvBwmo) zC5!PJQE)SQ2skcJMPyz0PGtnd7V7?KGq3Jny~OWC-F5_Q%#WO=(c2^r9M|f5lY#XG4(wp+)GgT9p2xY4m5Uj{c;@=#N^Q zUeFTsyjD+th&9mfwae&tS|j~7wuF8YYocG%HcBY?_5al0A_@9eghWW_A`OHB8dXJ8 z`%*1(CU$L%sFa_mZEV*&tc7jj%?ms~&6 zCqa=4a~WzgT0V{NESjtMBJfvn{+#HFE)n6r7II1?`*xGJYX|%8r2{XZ?nQ)`5O9;} zxPJs_2tzM8{AG~s<*%Sxh^1?i6>K{%#xps1M~nq^MUom5sAU>zX6Q6ZxR3i delta 2053 zcmZvc{clrM7{_}~+uOI>c5EvxY`|U^UD?JqhP-UT@CD46;tMLeUoMxPyX|J}z4hF- z1ME^@m>8ob=9r*ynlHTfj0MZp6~NK z=k}cEJg2Xvzt|Ts!{MNdf5scW)dwFr7rBmNYEeJrS(i17z$wAphU#+sT?qYB{W-i3 zNrQX>9bzNV657EQqN^f4?vVN8=8x6Lu0`9+uewTT9uuGLs^D2PgB|U6w42}=PsznI z0u?ml6;_a2Qprn)N)kK-O?l{0-d*yRq$U>$&GH$#i^wF*5Q&f|r(evgBTFint9qdt zgeoJ_C}bl+A{Y}YMwSW{7b;E?LM;<&IcXBAS*T{RLa3EOt#W>%MW_}>wF=edsCJ>+ z$!eHaCLKa{kTv2pNuiRCikA33OSS!rjJr``b&^yC3u`Uus$kMR=i~e95uSAwM8E&v z5@T-#k-j->AOcnBC+m;7N@XbRzyvS;qpn#b(l)?4h4sK4Ya>`>)0|uQH&<$zTbyyw z8Hb$lL1*0RjNAAR56}5Zxa20==e#G;9#`ribqKj!!Rib3KVWGD8f6zt#a{2+#!cIk z(XD(6(Z{$ri|Hu%u#uznkk_#3_DmWsG{cdl*jfOg>3F1 zg^No=5cX2DV33rLwt{OXxWbk?t|`-I$~lsd(9XF)0q!17?IicGh2>r4cX-4fPT;yg z9rCz?D2VD%1YzvK__oK5Z^;r~lzsT7?8i6c0KP5<@xO8i|0B!zZ#j&w$q{^2j^e-M zI($W5g8!83@gF#b5q#lo@b%opzu^`?f14lqk#rlo@nvaE5PNP18EuODaR?*-MS8f( znt~D{?1R?vFtmm3D;QITIc-$KZE@6SyRAGwbL~K0Gl-}I9cG)`UyL1r-5mwY0*(P* zVW-+hQJP(C-;UyJVD%Anx_W-~I7Y`=b272?O~~O_z(prHY)@XDu;>Z4E7^kv*n#AV z&R0G<>Oeu*k6lTwO#wkpwshCuS1gaLb!A( z>8@Yg>RJnZ!_%nFZgp)h-?u6d{t{3H)cV!RW%Ru5){Q)!0q>I>cJO&MQ_yx$YEn86 z-g6wO$o)!5zv7`Wxu_G(bSh&@R);82ZE0Wg1l!FoitQ$vanDLmv7frz&_(9ynL!t- zM|*A{w3ofyyED8SW_a@j_>*~t{n(qRALgEWRwB`h>_%@Fs-4}YzDCr@9`74SE%3Ay z-n}!`Z2J_2m}x~3Cr1M?KMW9^@-{ouw{?rC(JJn=J^M{FLt7yJG++ndFyJ)cJm3Q0 Q5@3O?>>oioo9u7<4?2=0EC2ui diff --git a/metadata_utils.py b/metadata_utils.py index e3d2516..a3c994e 100644 --- a/metadata_utils.py +++ b/metadata_utils.py @@ -3,7 +3,7 @@ Compatibility shim for MetaHub Save Node metadata helpers. The implementation is kept in metadata_utils_impl.py; this module exposes the same public API expected by the save nodes while pinning the published node -version to 1.1.3. +version to 1.1.4. """ try: @@ -11,7 +11,7 @@ try: except ImportError: import metadata_utils_impl as _impl -METAHUB_SAVE_NODE_VERSION = "1.1.3" +METAHUB_SAVE_NODE_VERSION = "1.1.4" _impl.METAHUB_SAVE_NODE_VERSION = METAHUB_SAVE_NODE_VERSION for _name in dir(_impl): diff --git a/pyproject.toml b/pyproject.toml index 1c946c3..98863eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "imagemetahub-comfyui-save" description = "Official companion node for Image MetaHub. Saves A1111/Civitai-compatible parameters plus extended Image MetaHub metadata (workflow JSON, SHA256 model hashes, VRAM peak/total, GPU device, generation time, and steps/sec) for reproducibility and benchmarking." -version = "1.1.3" +version = "1.1.4" license = {file = "LICENSE"} # classifiers = [ # # For OS-independent nodes (works on all operating systems) diff --git a/tests/test_workflow_extractor.py b/tests/test_workflow_extractor.py index f78d7ec..aaec601 100644 --- a/tests/test_workflow_extractor.py +++ b/tests/test_workflow_extractor.py @@ -135,6 +135,75 @@ def test_workflow_extractor_detects_lora_alternate_keys(): assert data["lora_list"] == [{"name": "style.safetensors", "weight": 0.65}] +def test_workflow_extractor_detects_rgthree_power_lora_objects(): + prompt = { + "67": { + "class_type": "Power Lora Loader (rgthree)", + "inputs": { + "lora_1": { + "on": True, + "lora": "Z-Detail-Slider.safetensors", + "strength": 0.5325, + }, + "lora_2": { + "on": True, + "lora": "zy_CinematicShot_zit.safetensors", + "strength": 0.6875, + }, + "lora_3": { + "on": False, + "lora": "disabled.safetensors", + "strength": 1.0, + }, + }, + } + } + + extractor = WorkflowExtractor(prompt) + data, _missing = extractor.extract() + + assert data["lora_list"] == [ + {"name": "Z-Detail-Slider.safetensors", "weight": 0.5325}, + {"name": "zy_CinematicShot_zit.safetensors", "weight": 0.6875}, + ] + + +def test_workflow_extractor_reads_style_prompt_encoder_through_basic_guider(): + prompt = { + "61": { + "class_type": "SamplerCustomAdvanced", + "inputs": { + "noise": ["63", 0], + "guider": ["101", 0], + "sampler": ["108", 0], + "sigmas": ["62", 0], + "latent_image": ["113", 0], + }, + }, + "101": { + "class_type": "BasicGuider", + "inputs": { + "model": ["100", 0], + "conditioning": ["114", 0], + }, + }, + "114": { + "class_type": "StylePromptEncoder2 //ZImagePowerNodes", + "inputs": { + "style": "\"Production Photo\"", + "text": "A white cat on the roof of a brick house", + "clip": ["67", 1], + }, + }, + } + + extractor = WorkflowExtractor(prompt) + data, missing = extractor.extract() + + assert data["positive"] == "A white cat on the roof of a brick house" + assert "positive" not in missing + + def test_workflow_extractor_resolves_connected_seed_and_prompt_strings(): prompt = { "1": { diff --git a/workflow_extractor.py b/workflow_extractor.py index 4368981..08238be 100644 --- a/workflow_extractor.py +++ b/workflow_extractor.py @@ -274,8 +274,12 @@ class WorkflowExtractor: if stacked_loras: loras.extend(stacked_loras) continue + dynamic_loras = self._extract_dynamic_lora_entries(inputs) + if dynamic_loras: + loras.extend(dynamic_loras) + continue lora_name = self._get_first_literal(inputs, ("lora_name", "lora", "lora_name_1", "lora_1")) - if not lora_name: + if not isinstance(lora_name, str) or not lora_name.strip(): continue strength_model = self._get_first_literal( inputs, @@ -291,6 +295,28 @@ class WorkflowExtractor: return loras, has_lora_nodes + def _extract_dynamic_lora_entries(self, inputs: Dict[str, Any]) -> List[Dict[str, Any]]: + loras: List[Dict[str, Any]] = [] + for key, raw_lora in inputs.items(): + if not key.lower().startswith("lora_") or not isinstance(raw_lora, dict): + continue + if raw_lora.get("on") is False or raw_lora.get("active") is False: + continue + name = raw_lora.get("lora") or raw_lora.get("lora_name") or raw_lora.get("name") + if not isinstance(name, str) or not name.strip(): + continue + weight = self._coerce_float( + raw_lora.get("strength") + if raw_lora.get("strength") is not None + else raw_lora.get("modelStrength") + ) + if weight is None: + weight = self._coerce_float(raw_lora.get("strength_model")) + if weight is None: + weight = 1.0 + loras.append({"name": name, "weight": float(weight)}) + return loras + def _extract_lora_manager_entries(self, inputs: Dict[str, Any]) -> List[Dict[str, Any]]: raw_loras = inputs.get("loras") if isinstance(raw_loras, dict) and isinstance(raw_loras.get("__value__"), list): @@ -453,7 +479,7 @@ class WorkflowExtractor: class_type = self._class_type(node) if class_type == "ConditioningZeroOut": return "" - if class_type in self.CLIP_NODES: + if self._is_prompt_encoder(class_type): text = self._get_clip_text(node) if text is not None: texts.append(text) @@ -506,7 +532,7 @@ class WorkflowExtractor: if class_type == "ConditioningZeroOut": return "" - if class_type in self.CLIP_NODES: + if self._is_prompt_encoder(class_type): return self._get_clip_text(node) if class_lower == "joinstrings" or "join strings" in class_lower: @@ -663,3 +689,9 @@ class WorkflowExtractor: if class_type in cls.LORA_NODES: return True return "lora" in class_type.lower() + + @classmethod + def _is_prompt_encoder(cls, class_type: str) -> bool: + if class_type in cls.CLIP_NODES: + return True + return "promptencoder" in class_type.lower().replace(" ", "")