From b757ec6149bf567ada1a84f7f11cdbb5452bd37e Mon Sep 17 00:00:00 2001 From: zeeoale Date: Sat, 14 Feb 2026 00:43:52 +0100 Subject: [PATCH] Add JSON name to input --- PromptTagsExtractorNode.py | 71 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/PromptTagsExtractorNode.py b/PromptTagsExtractorNode.py index 4704f5c..3dc53dd 100644 --- a/PromptTagsExtractorNode.py +++ b/PromptTagsExtractorNode.py @@ -1,4 +1,5 @@ import re +import os from collections import Counter @@ -19,6 +20,14 @@ class PromptTagsExtractorNode: # whitelist manuale, es: "nun, veil, latex, ritual" "keep_csv": ("STRING", {"default": ""}), "min_len": ("INT", {"default": 4, "min": 3, "max": 12}), + # ✅ nuovo: nome world/json per includere tag “identitari” + # esempi: + # "PFN_Tokyo_Street_Style_HipHop.json" + # "PFN_Tokyo_Dance_Crew_Studio" + "json_name": ("STRING", {"default": ""}), + # se vuoi controllare quanto “forzare” i token del nome + "force_name_tokens": ("BOOLEAN", {"default": True}), + "name_tokens_max": ("INT", {"default": 12, "min": 3, "max": 24}), } } @@ -39,7 +48,7 @@ class PromptTagsExtractorNode: _PROMPT_GARBAGE = set(""" masterpiece best quality amazing 4k ultra detailed absurdres newest scenery depth field volumetric lighting - high resolution aesthetic cinematic detailed ultra highres sharp focus + high resolution aesthetic cinematic detailed ultra highres sharp focus """.split()) # ------------------------- @@ -56,6 +65,46 @@ class PromptTagsExtractorNode: text = re.sub(r"\s+", " ", text).strip().lower() return text + def _tokenize_json_name(self, json_name: str, min_len: int, max_tokens: int): + if not json_name: + return [] + + # se arriva un path o un filename, prendiamo solo il basename + base = os.path.basename(json_name.strip()) + + # togli estensione .json se presente + base = re.sub(r"\.json$", "", base, flags=re.IGNORECASE) + + # normalizza separatori: underscore, dash, spazi + base = base.replace("-", " ").replace("_", " ") + base = re.sub(r"\s+", " ", base).strip().lower() + + # tokenizza + raw = base.split() + + out = [] + for w in raw: + if len(w) < min_len: + continue + # filtra roba troppo “tecnica” + if w in {"json"}: + continue + # se vuoi tenere "pfn" come tag identitario, NON filtrarlo. + # Se invece non lo vuoi, aggiungilo qui: + # if w == "pfn": continue + + out.append(w) + + # de-dup preservando ordine + seen = set() + uniq = [] + for w in out: + if w not in seen: + seen.add(w) + uniq.append(w) + + return uniq[:max_tokens] + def _extract_tags(self, prompt: str, top_k: int, min_len: int, keep_csv: str): keep_set = set( w.strip().lower() @@ -89,8 +138,24 @@ class PromptTagsExtractorNode: # Nodo # ------------------------- - def run(self, prompt, top_k, keep_csv="", min_len=4): - tags = self._extract_tags(prompt, top_k, min_len, keep_csv) + def run(self, prompt, top_k, keep_csv="", min_len=4, json_name="", force_name_tokens=True, name_tokens_max=12): + base_tags = self._extract_tags(prompt, top_k, min_len, keep_csv) + + name_tokens = self._tokenize_json_name(json_name, min_len=min_len, max_tokens=name_tokens_max) + + if name_tokens: + if force_name_tokens: + # ✅ forzali in testa (identità sempre presente) + tags = name_tokens + [t for t in base_tags if t not in set(name_tokens)] + else: + # alternativa: aggiungili solo se non ci sono già + tags = base_tags[:] + for t in name_tokens: + if t not in tags: + tags.append(t) + else: + tags = base_tags + tags_csv = ", ".join(tags) tags_space = " ".join(tags) return (tags_csv, tags_space)