From d50349dda3fca3b2f34677103a5ede18c790147a Mon Sep 17 00:00:00 2001 From: HalfikChan <122530958+HalfikCode@users.noreply.github.com> Date: Sat, 21 Mar 2026 16:05:08 +0500 Subject: [PATCH] Add files via upload --- Main Pipeline.png | Bin 0 -> 128252 bytes README.md | 154 ++++++++++++++++++++++++- __init__.py | 28 +++++ api_routes.py | 177 +++++++++++++++++++++++++++++ db.py | 279 ++++++++++++++++++++++++++++++++++++++++++++++ nodes.py | 253 +++++++++++++++++++++++++++++++++++++++++ prompts.json | 0 7 files changed, 889 insertions(+), 2 deletions(-) create mode 100644 Main Pipeline.png create mode 100644 __init__.py create mode 100644 api_routes.py create mode 100644 db.py create mode 100644 nodes.py create mode 100644 prompts.json diff --git a/Main Pipeline.png b/Main Pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa04b290d598e558ae9ee46ead33d2066f7a83a GIT binary patch literal 128252 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

I9ncQO0atL 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 HB{Ts5)O#T& literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 1a0fed4..600ed91 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,152 @@ -# ComfyUI-Prompt-DB -A powerful Prompt and LoRA database manager with a Web UI for ComfyUI +# šŸ“¦ ComfyUI Prompt Database + +A powerful prompt management system for ComfyUI. Store, categorize, search, and combine prompts with full LoRA integration — all from a beautiful built-in web UI. + +![Main Pipeline](Main%20Pipeline.png) + +--- + +## ✨ Features + +### šŸ—‚ļø Prompt Management (Web UI) +- **Categories** — organize prompts into named groups +- **Create / Edit / Delete** prompts with a slide-out drawer +- **Search** across names, text, and categories +- **Drag & Drop** — reorder prompts and move them between categories +- **Grid & List views** — toggle layout with persistent preference +- **Sorting** — by name (A→Z / Z→A), newest, oldest, category, or custom order +- **Export / Import** — backup your entire database as JSON; import with **Merge** (append new, skip duplicates) or **Overwrite** +- **Keyboard shortcuts** — `Ctrl+N` new prompt, `/` focus search, `Esc` close + +### šŸ“– LoRA Integration +- **Attach LoRAs** to any prompt with custom strength values (supports negative values) +- **LoRA auto-discovery** — scans your ComfyUI `loras` folder +- **Per-LoRA enable/disable** toggle in Apply Lora Stack (inline circle ā—) +- **Strength adjustment** — ā—€ ā–¶ arrows or manual input, range -2.0 to 2.0 +- **Reset to defaults** — restore original prompt-defined LoRA strengths + +### šŸ”— Node System +Four nodes that work together: + +| Node | Purpose | +|------|---------| +| **Prompt DB Manager** | Opens the web UI for managing your database | +| **Prompt Selector** | Pick one prompt from a category → outputs text + LoRA stack | +| **Prompt Combiner** | Connect multiple selectors → combines all prompts into one string + merged LoRA stack | +| **Apply Lora Stack** | Takes a LoRA stack and applies it to model + clip | + +--- + +## šŸš€ Installation + +### ComfyUI Manager +Search for **"Prompt Database"** in the ComfyUI Manager and install. + +### Manual +```bash +cd ComfyUI/custom_nodes/ +git clone https://github.com/your-username/comfyui-prompt-db.git +``` + +Restart ComfyUI. No additional dependencies required. + +--- + +## šŸ“‹ Nodes + +### Prompt DB Manager +Opens the Prompt Database web interface. Add it to your workflow and click the **"šŸ“‚ Open Manager"** button. + +**Outputs:** None (management only) + +--- + +### Prompt Selector +Select a single prompt from a category. + +**Outputs:** +| Output | Type | Description | +|--------|------|-------------| +| `prompt_text` | STRING | The selected prompt's text | +| `db_selection` | DB_SELECTION | Category name (connect to Combiner) | +| `lora_stack` | LORA_STACK | LoRAs attached to this prompt | + +--- + +### Prompt Combiner +Accepts multiple `DB_SELECTION` inputs (from Prompt Selectors). Each connected input shows a dropdown for selecting a prompt within that category. Combines all selected prompts into one string. + +**Inputs:** +- `separator` — how to join prompts: `, ` / newline / space / none +- `selection_1..N` — DB_SELECTION inputs (dynamic, auto-expands) + +**Outputs:** +| Output | Type | Description | +|--------|------|-------------| +| `combined_prompt` | STRING | All selected prompts joined by separator | +| `lora_stack` | LORA_STACK | Merged LoRAs from all selected prompts | + +**Features:** +- **Inline mute toggle** (ā— circle) — mute individual categories without disconnecting +- **ā—€ ā–¶ arrows** — cycle through prompts quickly +- **Click prompt name** — opens dropdown for full selection +- Prompts are combined **in input order** (selection_1, selection_2, ...) + +--- + +### Apply Lora Stack +Applies a `LORA_STACK` to model and clip. + +**Inputs:** +| Input | Type | Description | +|-------|------|-------------| +| `model` | MODEL | Base model | +| `clip` | CLIP | CLIP model | +| `lora_stack` | LORA_STACK | LoRAs to apply | + +**Outputs:** `model`, `clip` (with LoRAs applied) + +**Features:** +- **Per-LoRA toggle** — click the circle (ā—) to enable/disable individual LoRAs +- **Strength control** — ā—€ ā–¶ arrows to adjust, supports -2.0 to 2.0 range +- **Reset Values** button — restores all strengths to prompt defaults +- Missing LoRA files are skipped gracefully with a console warning + +--- + +## šŸ”§ Typical Workflow + +``` +[Prompt Selector: Character] ──► selection_1 ─┐ +[Prompt Selector: Mood] ──► selection_2 ─┤ +[Prompt Selector: Clothes] ──► selection_3 ─┼──► [Prompt Combiner] ──► combined_prompt ──► [CLIP Text Encode] +[Prompt Selector: Action] ──► selection_4 ─┤ │ +[Prompt Selector: Location] ──► selection_5 ā”€ā”˜ └── lora_stack ──► [Apply Lora Stack] ──► model/clip +``` + +1. Add a **Prompt DB Manager** node and create your categories & prompts +2. Add **Prompt Selector** nodes for each category +3. Connect them to a **Prompt Combiner** to merge everything +4. Route the `lora_stack` output to **Apply Lora Stack** + +--- + +## šŸ“ Data Storage + +Prompts are stored in `prompts.json` in the node pack directory. Back up this file or use the **Export** feature in the web UI. + +--- + +## āŒØļø Keyboard Shortcuts (Web UI) + +| Shortcut | Action | +|----------|--------| +| `Ctrl + N` | Create new prompt | +| `/` | Focus search bar | +| `Esc` | Close drawer / modal | + +--- + +## šŸ“„ License + +MIT diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..c5c11b8 --- /dev/null +++ b/__init__.py @@ -0,0 +1,28 @@ +""" +ComfyUI Custom Node Pack: Prompt Database +========================================== +Allows storing, categorizing, and selecting prompts from a local JSON database. +""" + +from .nodes import PromptDBManager, PromptSelector, PromptCombiner, ApplyLoraStack + +# Register API routes on import +from . import api_routes # noqa: F401 + +NODE_CLASS_MAPPINGS = { + "PromptDBManager": PromptDBManager, + "PromptSelector": PromptSelector, + "PromptCombiner": PromptCombiner, + "ApplyLoraStack": ApplyLoraStack, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "PromptDBManager": "Prompt DB Manager", + "PromptSelector": "Prompt Selector", + "PromptCombiner": "Prompt Combiner", + "ApplyLoraStack": "Apply Lora Stack", +} + +WEB_DIRECTORY = "./web" + +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] diff --git a/api_routes.py b/api_routes.py new file mode 100644 index 0000000..537a3d5 --- /dev/null +++ b/api_routes.py @@ -0,0 +1,177 @@ +""" +REST API routes for Prompt Database CRUD operations. +Registered with ComfyUI's PromptServer on import. +""" + +import os +from aiohttp import web +from server import PromptServer +from . import db + +HTML_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "web") + +routes = PromptServer.instance.routes + + +@routes.get("/prompt_db/manager") +async def serve_manager(request): + """Serve the Prompt Database Manager HTML page.""" + html_path = os.path.join(HTML_DIR, "prompt_manager.html") + return web.FileResponse(html_path) + + +@routes.get("/prompt_db/categories") +async def get_categories(request): + categories = db.get_categories() + return web.json_response({"categories": categories}) + + +@routes.get("/prompt_db/prompts") +async def get_prompts(request): + category = request.query.get("category", None) + prompts = db.get_prompts(category) + return web.json_response({"prompts": prompts}) + + +@routes.get("/prompt_db/all") +async def get_all(request): + data = db.load_db() + return web.json_response(data) + + +@routes.get("/prompt_db/loras") +async def get_loras(request): + """Return list of available LoRA files from ComfyUI's models folder.""" + loras = db.get_available_loras() + return web.json_response({"loras": loras}) + + +@routes.post("/prompt_db/prompt") +async def add_prompt(request): + try: + body = await request.json() + category = body.get("category", "") + name = body.get("name", "") + text = body.get("text", "") + loras = body.get("loras", []) + + if not category or not name: + return web.json_response( + {"error": "category and name are required"}, status=400 + ) + + prompt = db.add_prompt(category, name, text, loras=loras) + return web.json_response({"prompt": prompt}) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.put("/prompt_db/prompt/{prompt_id}") +async def update_prompt(request): + try: + prompt_id = request.match_info["prompt_id"] + body = await request.json() + result = db.update_prompt( + prompt_id, + category=body.get("category"), + name=body.get("name"), + text=body.get("text"), + loras=body.get("loras"), + ) + if result: + return web.json_response({"prompt": result}) + return web.json_response({"error": "Prompt not found"}, status=404) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.delete("/prompt_db/prompt/{prompt_id}") +async def delete_prompt(request): + try: + prompt_id = request.match_info["prompt_id"] + if db.delete_prompt(prompt_id): + return web.json_response({"success": True}) + return web.json_response({"error": "Prompt not found"}, status=404) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.post("/prompt_db/category") +async def add_category(request): + try: + body = await request.json() + name = body.get("name", "") + if not name: + return web.json_response({"error": "name is required"}, status=400) + if db.add_category(name): + return web.json_response({"success": True}) + return web.json_response({"error": "Category already exists"}, status=409) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.delete("/prompt_db/category/{name}") +async def delete_category(request): + try: + name = request.match_info["name"] + if db.delete_category(name): + return web.json_response({"success": True}) + return web.json_response({"error": "Category not found"}, status=404) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.put("/prompt_db/categories/reorder") +async def reorder_categories(request): + try: + body = await request.json() + ordered = body.get("categories", []) + if not ordered: + return web.json_response({"error": "categories list required"}, status=400) + if db.reorder_categories(ordered): + return web.json_response({"success": True}) + return web.json_response( + {"error": "Category list does not match existing categories"}, status=400 + ) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.put("/prompt_db/prompts/reorder") +async def reorder_prompts(request): + try: + body = await request.json() + ordered_ids = body.get("prompt_ids", []) + if not ordered_ids: + return web.json_response({"error": "prompt_ids list required"}, status=400) + if db.reorder_prompts(ordered_ids): + return web.json_response({"success": True}) + return web.json_response({"error": "Reorder failed"}, status=400) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.get("/prompt_db/export") +async def export_db_route(request): + try: + data = db.export_db() + return web.json_response(data) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) + + +@routes.post("/prompt_db/import") +async def import_db_route(request): + try: + body = await request.json() + mode = body.get("mode", "merge") + incoming = body.get("data") + if not incoming or "categories" not in incoming or "prompts" not in incoming: + return web.json_response( + {"error": "Invalid import data: must have categories and prompts"}, + status=400, + ) + stats = db.import_db(incoming, mode) + return web.json_response({"success": True, **stats}) + except Exception as e: + return web.json_response({"error": str(e)}, status=500) diff --git a/db.py b/db.py new file mode 100644 index 0000000..a77a250 --- /dev/null +++ b/db.py @@ -0,0 +1,279 @@ +""" +Thread-safe JSON database for storing prompts with categories. +Prompts can optionally have LoRA attachments. +""" + +import json +import os +import uuid +import threading + +DB_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "prompts.json") +_lock = threading.Lock() + +DEFAULT_DB = { + "categories": ["Location", "Character", "Style", "Mood"], + "prompts": [] +} + + +def load_db(): + """Load the database from disk. Returns default if file missing or corrupted.""" + with _lock: + if not os.path.exists(DB_FILE): + save_db_unsafe(DEFAULT_DB) + return DEFAULT_DB.copy() + try: + with open(DB_FILE, "r", encoding="utf-8") as f: + data = json.load(f) + if "categories" not in data or "prompts" not in data: + data = DEFAULT_DB.copy() + save_db_unsafe(data) + # Ensure all prompts have a loras field + for p in data.get("prompts", []): + if "loras" not in p: + p["loras"] = [] + return data + except (json.JSONDecodeError, IOError): + save_db_unsafe(DEFAULT_DB) + return DEFAULT_DB.copy() + + +def save_db_unsafe(data): + """Save database without acquiring lock (caller must hold lock).""" + with open(DB_FILE, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2, ensure_ascii=False) + + +def save_db(data): + """Save database to disk (thread-safe).""" + with _lock: + save_db_unsafe(data) + + +def get_categories(): + """Return list of category names.""" + data = load_db() + return data.get("categories", []) + + +def get_prompts(category=None): + """Return prompts, optionally filtered by category.""" + data = load_db() + prompts = data.get("prompts", []) + if category: + prompts = [p for p in prompts if p.get("category") == category] + return prompts + + +def get_prompt_by_id(prompt_id): + """Return a single prompt by its ID, or None.""" + data = load_db() + for p in data.get("prompts", []): + if p.get("id") == prompt_id: + return p + return None + + +def get_prompt_by_name(name, category=None): + """Return a single prompt by its name and optionally category, or None.""" + data = load_db() + for p in data.get("prompts", []): + if p.get("name") == name: + if category is None or p.get("category") == category: + return p + return None + + +def add_prompt(category, name, text, loras=None): + """Add a new prompt. Returns the new prompt dict.""" + with _lock: + data = _load_unsafe() + prompt = { + "id": str(uuid.uuid4()), + "category": category, + "name": name, + "text": text, + "loras": loras or [], + } + data["prompts"].append(prompt) + save_db_unsafe(data) + return prompt + + +def update_prompt(prompt_id, category=None, name=None, text=None, loras=None): + """Update an existing prompt by ID. Returns updated prompt or None.""" + with _lock: + data = _load_unsafe() + for p in data["prompts"]: + if p["id"] == prompt_id: + if category is not None: + p["category"] = category + if name is not None: + p["name"] = name + if text is not None: + p["text"] = text + if loras is not None: + p["loras"] = loras + save_db_unsafe(data) + return p + return None + + +def delete_prompt(prompt_id): + """Delete a prompt by ID. Returns True if found and deleted.""" + with _lock: + data = _load_unsafe() + original_len = len(data["prompts"]) + data["prompts"] = [p for p in data["prompts"] if p["id"] != prompt_id] + if len(data["prompts"]) < original_len: + save_db_unsafe(data) + return True + return False + + +def add_category(name): + """Add a new category. Returns True if added, False if already exists.""" + with _lock: + data = _load_unsafe() + if name in data["categories"]: + return False + data["categories"].append(name) + save_db_unsafe(data) + return True + + +def delete_category(name): + """Delete a category and all its prompts. Returns True if found and deleted.""" + with _lock: + data = _load_unsafe() + if name not in data["categories"]: + return False + data["categories"].remove(name) + data["prompts"] = [p for p in data["prompts"] if p["category"] != name] + save_db_unsafe(data) + return True + + +def reorder_categories(ordered_names): + """Reorder categories to match the given list. Returns True if successful.""" + with _lock: + data = _load_unsafe() + existing = set(data["categories"]) + given = set(ordered_names) + if existing != given: + return False + data["categories"] = list(ordered_names) + save_db_unsafe(data) + return True + + +def reorder_prompts(ordered_ids): + """Reorder prompts to match the given ID list. Unmentioned prompts keep their relative order at the end.""" + with _lock: + data = _load_unsafe() + by_id = {p["id"]: p for p in data["prompts"]} + reordered = [] + for pid in ordered_ids: + if pid in by_id: + reordered.append(by_id.pop(pid)) + # Append any remaining prompts not in the ordered list + for p in data["prompts"]: + if p["id"] in by_id: + reordered.append(p) + data["prompts"] = reordered + save_db_unsafe(data) + return True + + +def get_available_loras(): + """Return list of available LoRA filenames from ComfyUI's models folder.""" + try: + import folder_paths + return folder_paths.get_filename_list("loras") + except Exception: + return [] + + +def export_db(): + """Return full database dict for export.""" + return load_db() + + +def import_db(incoming, mode="merge"): + """Import prompts from an incoming dict. + mode='overwrite': replace entire DB. + mode='merge': add new categories and prompts, skip duplicates (by name+category). + Returns dict with stats: {categories_added, prompts_added, prompts_skipped}. + """ + with _lock: + if mode == "overwrite": + # Ensure all prompts have IDs and loras + for p in incoming.get("prompts", []): + if "id" not in p: + p["id"] = str(uuid.uuid4()) + if "loras" not in p: + p["loras"] = [] + save_db_unsafe(incoming) + return { + "categories_added": len(incoming.get("categories", [])), + "prompts_added": len(incoming.get("prompts", [])), + "prompts_skipped": 0, + } + + # Merge mode + data = _load_unsafe() + cats_added = 0 + prompts_added = 0 + prompts_skipped = 0 + + # Add missing categories + existing_cats = set(data["categories"]) + for cat in incoming.get("categories", []): + if cat not in existing_cats: + data["categories"].append(cat) + existing_cats.add(cat) + cats_added += 1 + + # Add prompts that don't exist yet (by name + category) + existing_prompts = {(p["name"], p["category"]) for p in data["prompts"]} + for p in incoming.get("prompts", []): + key = (p.get("name", ""), p.get("category", "")) + if key in existing_prompts: + prompts_skipped += 1 + continue + prompt = { + "id": p.get("id") or str(uuid.uuid4()), + "name": p.get("name", ""), + "category": p.get("category", ""), + "text": p.get("text", ""), + "loras": p.get("loras", []), + } + data["prompts"].append(prompt) + existing_prompts.add(key) + prompts_added += 1 + + save_db_unsafe(data) + return { + "categories_added": cats_added, + "prompts_added": prompts_added, + "prompts_skipped": prompts_skipped, + } + + +def _load_unsafe(): + """Load database without lock (internal use only).""" + if not os.path.exists(DB_FILE): + save_db_unsafe(DEFAULT_DB) + return DEFAULT_DB.copy() + try: + with open(DB_FILE, "r", encoding="utf-8") as f: + data = json.load(f) + # Ensure all prompts have loras field + for p in data.get("prompts", []): + if "loras" not in p: + p["loras"] = [] + return data + except (json.JSONDecodeError, IOError): + save_db_unsafe(DEFAULT_DB) + return DEFAULT_DB.copy() diff --git a/nodes.py b/nodes.py new file mode 100644 index 0000000..04c0d83 --- /dev/null +++ b/nodes.py @@ -0,0 +1,253 @@ +""" +ComfyUI custom nodes for Prompt Database. +""" + +import json as _json +import re as _re +import folder_paths + + +def _clean_name(name): + """Strip the šŸ“– LoRA marker suffix added by the JS frontend.""" + return _re.sub(r'\s*šŸ“–$', '', name).strip() +import comfy.sd +import comfy.utils +from . import db + + +class PromptDBManager: + """ + Management node — provides a UI button to open the prompt database manager. + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "hidden": { + "unique_id": "UNIQUE_ID", + }, + } + + RETURN_TYPES = () + FUNCTION = "manage" + CATEGORY = "Prompt Database" + OUTPUT_NODE = True + + def manage(self, unique_id=None): + return {} + + +class PromptSelector: + """ + Selector node — pick a category and prompt. + Outputs: + - prompt_text (STRING): the selected prompt text (no LoRA tags) + - db_selection (DB_SELECTION): the category name (for PromptCombiner) + - lora_stack (LORA_STACK): LoRAs attached to the selected prompt + """ + + @classmethod + def INPUT_TYPES(cls): + categories = db.get_categories() + if not categories: + categories = ["(no categories)"] + + all_prompts = db.get_prompts() + prompt_names = list({p["name"] for p in all_prompts}) + if not prompt_names: + prompt_names = ["(no prompts)"] + + return { + "required": { + "category": (categories, {"default": categories[0]}), + "prompt_name": (prompt_names, {"default": prompt_names[0]}), + }, + } + + RETURN_TYPES = ("STRING", "DB_SELECTION", "LORA_STACK") + RETURN_NAMES = ("prompt_text", "db_selection", "lora_stack") + FUNCTION = "select_prompt" + CATEGORY = "Prompt Database" + + def select_prompt(self, category, prompt_name): + prompt_name = _clean_name(prompt_name) + prompt = db.get_prompt_by_name(prompt_name, category) + if not prompt: + prompt = db.get_prompt_by_name(prompt_name) + if not prompt: + return ("", category, []) + + text = prompt["text"] + loras = prompt.get("loras", []) + # Normalize lora entries + lora_stack = [] + for l in loras: + lora_stack.append({ + "name": l.get("name", ""), + "strength": float(l.get("strength", 1.0)), + }) + + return (text, category, lora_stack) + + @classmethod + def IS_CHANGED(cls, category, prompt_name): + prompt_name = _clean_name(prompt_name) + prompt = db.get_prompt_by_name(prompt_name, category) + if prompt: + return prompt["text"] + str(prompt.get("loras", [])) + return "" + + +class PromptCombiner: + """ + Combiner node — accepts multiple DB_SELECTION inputs (category names), + shows a prompt dropdown per category inside the node, + and combines selected prompts into one STRING + merged LORA_STACK. + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "separator": ( + ["comma_space", "newline", "space", "none"], + {"default": "comma_space"}, + ), + "prompt_selections": ( + "STRING", + {"default": "{}", "multiline": False}, + ), + }, + "optional": { + "selection_1": ("DB_SELECTION", {"forceInput": True}), + }, + } + + RETURN_TYPES = ("STRING", "LORA_STACK") + RETURN_NAMES = ("combined_prompt", "lora_stack") + FUNCTION = "combine" + CATEGORY = "Prompt Database" + OUTPUT_NODE = True + + def combine(self, separator="comma_space", prompt_selections="{}", **kwargs): + sep_map = { + "comma_space": ", ", + "newline": "\n", + "space": " ", + "none": "", + } + sep = sep_map.get(separator, ", ") + + try: + selections = _json.loads(prompt_selections) + except _json.JSONDecodeError: + selections = {} + + texts = [] + merged_loras = [] + seen_loras = set() + + selection_keys = [k for k in kwargs.keys() if k.startswith("selection_")] + selection_keys.sort(key=lambda k: int(k.split("_")[1])) + + for key in selection_keys: + category = kwargs[key] + if not category: + continue + prompt_name = _clean_name(selections.get(key, "")) + if not prompt_name: + continue + prompt = db.get_prompt_by_name(prompt_name, category) + if prompt: + texts.append(prompt["text"]) + # Collect LoRAs (deduplicate by name) + for l in prompt.get("loras", []): + lname = l.get("name", "") + if lname and lname not in seen_loras: + seen_loras.add(lname) + merged_loras.append({ + "name": lname, + "strength": float(l.get("strength", 1.0)), + }) + + combined = sep.join(texts) + return (combined, merged_loras) + + @classmethod + def IS_CHANGED(cls, separator, prompt_selections="{}", **kwargs): + return prompt_selections + str(kwargs) + + +class ApplyLoraStack: + """ + Applies LoRAs from a LORA_STACK to a model and clip. + The lora_config hidden widget stores per-LoRA overrides + (enable/disable + custom strength). + """ + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "model": ("MODEL",), + "clip": ("CLIP",), + "lora_config": ( + "STRING", + {"default": "{}", "multiline": False}, + ), + }, + "optional": { + "lora_stack": ("LORA_STACK",), + }, + } + + RETURN_TYPES = ("MODEL", "CLIP") + RETURN_NAMES = ("model", "clip") + FUNCTION = "apply_loras" + CATEGORY = "Prompt Database" + + def apply_loras(self, model, clip, lora_config="{}", lora_stack=None): + if not lora_stack: + return (model, clip) + + # Parse overrides + try: + config = _json.loads(lora_config) + except _json.JSONDecodeError: + config = {} + + for lora_entry in lora_stack: + name = lora_entry.get("name", "") + default_strength = lora_entry.get("strength", 1.0) + if not name: + continue + + # Apply per-LoRA overrides from config + override = config.get(name, {}) + if not override.get("enabled", True): + print(f"[PromptDB] LoRA skipped (disabled): {name}") + continue + + strength = float(override.get("strength", default_strength)) + + # Load LoRA file + lora_path = folder_paths.get_full_path("loras", name) + if not lora_path: + print(f"[PromptDB] LoRA file not found: {name}") + continue + + try: + lora = comfy.utils.load_torch_file(lora_path, safe_load=True) + model, clip = comfy.sd.load_lora_for_models( + model, clip, lora, strength, strength + ) + print(f"[PromptDB] LoRA applied: {name} (strength={strength:.2f})") + except Exception as e: + print(f"[PromptDB] Error loading LoRA {name}: {e}") + + return (model, clip) + + @classmethod + def IS_CHANGED(cls, model, clip, lora_config="{}", lora_stack=None): + return str(lora_stack) + lora_config diff --git a/prompts.json b/prompts.json new file mode 100644 index 0000000..e69de29