diff --git a/README.md b/README.md index 41e6601..4370686 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,23 @@ A local web-based GUI for managing character profiles (JSON) and generating cons - **Character Gallery**: Automatically scans your `characters/` folder and builds a searchable, sortable database. - **Outfit Gallery**: Manage reusable outfit presets that can be applied to any character. - **Actions Gallery**: A library of reusable poses and actions (e.g., "Belly Dancing", "Sword Fighting") that can be previewed on any character model. -- **AI-Powered Creation**: Create new characters, outfits, and actions using AI to generate profiles from descriptions, or manually create blank templates. -- **character-Integrated Previews**: Standalone items (Outfits/Actions) can be previewed directly on a specific character's model with automatic style injection (e.g., background color matching). +- **Styles Gallery**: Manage art style / artist LoRA presets with AI-assisted bulk creation from your styles LoRA folder. +- **Scenes Gallery**: Background and environment LoRA presets, previewable with any character. +- **Detailers Gallery**: Detail enhancement LoRA presets for fine-tuning face, hands, and other features. +- **Checkpoints Gallery**: Browse all your installed SDXL checkpoints (Illustrious & Noob families). Stores per-checkpoint generation settings (steps, CFG, sampler, VAE, base prompts) via JSON files in `data/checkpoints/`. Supports AI-assisted metadata generation from accompanying HTML files. +- **AI-Powered Creation**: Create and populate gallery entries using AI to generate profiles from descriptions or LoRA HTML files, or manually create blank templates. +- **Character-Integrated Previews**: Standalone items (Outfits/Actions/Styles/Scenes/Detailers/Checkpoints) can be previewed directly on a specific character's model. - **Granular Prompt Control**: Every field in your JSON models (Identity, Wardrobe, Styles, Action details) has a checkbox. You decide exactly what is sent to the AI. - **ComfyUI Integration**: - **SDXL Optimized**: Designed for high-quality SDXL/Illustrious workflows. - **Localized ADetailer**: Automated Face and Hand detailing with focused prompts (e.g., only eye color and expression are sent to the face detailer). - - **Triple LoRA Chaining**: Chains up to three distinct LoRAs (Character + Outfit + Action) sequentially in the generation workflow. + - **Quad LoRA Chaining**: Chains up to four distinct LoRAs (Character + Outfit + Action + Style/Detailer/Scene) sequentially in the generation workflow. + - **Per-Checkpoint Settings**: Steps, CFG, sampler name, VAE, and base prompts are applied automatically from each checkpoint's JSON profile. - **Real-time Progress**: Live progress bars and queue status via WebSockets (with a reliable polling fallback). - **Batch Processing**: - - **Fill Missing**: Generate covers for every character missing one with a single click. -- **Advanced Generator**: A dedicated page to mix-and-match characters with different checkpoints (Illustrious/Noob support) and custom prompt additions. + - **Fill Missing**: Generate covers for every item missing one with a single click, across all galleries. + - **Bulk Create from LoRAs/Checkpoints**: Auto-generate JSON metadata for entire directories using an LLM. +- **Advanced Generator**: A dedicated mix-and-match page combining any character, outfit, action, style, scene, and detailer in a single generation. - **Smart URLs**: Sanitized, human-readable URLs (slugs) that handle special characters and slashes gracefully. ## Prerequisites @@ -70,8 +76,13 @@ A local web-based GUI for managing character profiles (JSON) and generating cons - `/data/characters`: Character JSON files. - `/data/clothing`: Outfit preset JSON files. - `/data/actions`: Action/Pose preset JSON files. +- `/data/styles`: Art style / artist LoRA JSON files. +- `/data/scenes`: Scene/background LoRA JSON files. +- `/data/detailers`: Detailer LoRA JSON files. +- `/data/checkpoints`: Per-checkpoint metadata JSON files (steps, CFG, sampler, VAE, base prompts). +- `/data/prompts`: LLM system prompts used by the AI-assisted bulk creation features. - `/static/uploads`: Generated images (organized by subfolders). - `app.py`: Flask backend and prompt-building logic. - `comfy_workflow.json`: The API-format workflow used for generations. - `models.py`: SQLAlchemy database models. -- `DEVELOPMENT_GUIDE.md`: Architectual patterns for extending the browser. +- `DEVELOPMENT_GUIDE.md`: Architectural patterns for extending the browser. diff --git a/TAG_MCP_README.md b/TAG_MCP_README.md new file mode 100644 index 0000000..b34fa78 --- /dev/null +++ b/TAG_MCP_README.md @@ -0,0 +1,208 @@ +# danbooru-mcp + +An MCP (Model Context Protocol) server that lets an LLM search, validate, and get suggestions for valid **Danbooru tags** — the prompt vocabulary used by Illustrious and other Danbooru-trained Stable Diffusion models. + +Tags are scraped directly from the **Danbooru public API** and stored in a local SQLite database with an **FTS5 full-text search index** for fast prefix/substring queries. Each tag includes its post count, category, and deprecation status so the LLM can prioritise well-used, canonical tags. + +--- + +## Tools + +| Tool | Description | +|------|-------------| +| `search_tags(query, limit=20, category=None)` | Prefix/full-text search — returns rich tag objects ordered by relevance | +| `validate_tags(tags)` | Exact-match validation — splits into `valid`, `deprecated`, `invalid` | +| `suggest_tags(partial, limit=10, category=None)` | Autocomplete for partial tag strings, sorted by post count | + +### Return object shape + +All tools return tag objects with: + +```json +{ + "name": "blue_hair", + "post_count": 1079908, + "category": "general", + "is_deprecated": false +} +``` + +### Category filter values + +`"general"` · `"artist"` · `"copyright"` · `"character"` · `"meta"` + +--- + +## Setup + +### 1. Install dependencies + +```bash +pip install -e . +``` + +### 2. Build the SQLite database (scrapes the Danbooru API) + +```bash +python scripts/scrape_tags.py +``` + +This scrapes ~1–2 million tags from the Danbooru public API (no account required) +and stores them in `db/tags.db` with a FTS5 index. +Estimated time: **5–15 minutes** depending on network speed. + +``` +Options: + --db PATH Output database path (default: db/tags.db) + --workers N Parallel HTTP workers (default: 4) + --max-page N Safety cap on pages (default: 2500) + --no-resume Re-scrape all pages from scratch + --no-fts Skip FTS5 rebuild (for incremental runs) +``` + +The scraper is **resumable** — if interrupted, re-run it and it will +continue from where it left off. + +### 3. (Optional) Test API access first + +```bash +python scripts/test_danbooru_api.py +``` + +### 4. Run the MCP server + +```bash +python src/server.py +``` + +--- + +## Docker + +### Quick start (pre-built DB — recommended) + +Use this when you've already run `python scripts/scrape_tags.py` and have `db/tags.db`: + +```bash +# Build image with the pre-built DB baked in (~30 seconds) +docker build -f Dockerfile.prebuilt -t danbooru-mcp . + +# Verify +docker run --rm --entrypoint python danbooru-mcp \ + -c "import sqlite3,sys; c=sqlite3.connect('/app/db/tags.db'); sys.stderr.write(str(c.execute('SELECT COUNT(*) FROM tags').fetchone()[0]) + ' tags\n')" +``` + +### Build from scratch (runs the scraper during Docker build) + +```bash +# Scrapes the Danbooru API during build — takes ~15 minutes +docker build \ + --build-arg DANBOORU_USER=your_username \ + --build-arg DANBOORU_API_KEY=your_api_key \ + -t danbooru-mcp . +``` + +### MCP client config (Docker) + +```json +{ + "mcpServers": { + "danbooru-tags": { + "command": "docker", + "args": ["run", "--rm", "-i", "danbooru-mcp:latest"] + } + } +} +``` + +--- + +## MCP Client Configuration + +### Claude Desktop (`claude_desktop_config.json`) + +```json +{ + "mcpServers": { + "danbooru-tags": { + "command": "python", + "args": ["/absolute/path/to/danbooru-mcp/src/server.py"] + } + } +} +``` + +### Custom DB path via environment variable + +```json +{ + "mcpServers": { + "danbooru-tags": { + "command": "python", + "args": ["/path/to/src/server.py"], + "env": { + "DANBOORU_TAGS_DB": "/custom/path/to/tags.db" + } + } + } +} +``` + +--- + +## Example LLM Prompt Workflow + +``` +User: Generate a prompt for a girl with blue hair and a sword. + +LLM calls validate_tags(["1girl", "blue_hairs", "sword", "looking_at_vewer"]) +→ { + "valid": ["1girl", "sword"], + "deprecated": [], + "invalid": ["blue_hairs", "looking_at_vewer"] + } + +LLM calls suggest_tags("blue_hair", limit=3) +→ [ + {"name": "blue_hair", "post_count": 1079908, "category": "general"}, + {"name": "blue_hairband", "post_count": 26905, "category": "general"}, + ... + ] + +LLM calls suggest_tags("looking_at_viewer", limit=1) +→ [{"name": "looking_at_viewer", "post_count": 4567890, "category": "general"}] + +Final validated prompt: 1girl, blue_hair, sword, looking_at_viewer +``` + +--- + +## Project Structure + +``` +danbooru-mcp/ +├── data/ +│ └── all_tags.csv # original CSV export (legacy, replaced by API scrape) +├── db/ +│ └── tags.db # SQLite DB (generated, gitignored) +├── plans/ +│ └── danbooru-mcp-plan.md # Architecture plan +├── scripts/ +│ ├── scrape_tags.py # API scraper → SQLite (primary) +│ ├── import_tags.py # Legacy CSV importer +│ └── test_danbooru_api.py # API connectivity tests +├── src/ +│ └── server.py # MCP server +├── pyproject.toml +├── .gitignore +└── README.md +``` + +--- + +## Requirements + +- Python 3.10+ +- `mcp[cli]` — official Python MCP SDK +- `requests` — HTTP client for API scraping +- `sqlite3` — Python stdlib (no install needed) diff --git a/app.py b/app.py index 42ac690..250708b 100644 --- a/app.py +++ b/app.py @@ -4,10 +4,13 @@ import time import re import requests import random +import asyncio +from mcp import ClientSession, StdioServerParameters +from mcp.client.stdio import stdio_client from flask import Flask, render_template, request, redirect, url_for, flash, session from flask_session import Session from werkzeug.utils import secure_filename -from models import db, Character, Settings, Outfit, Action, Style, Detailer, Scene +from models import db, Character, Settings, Outfit, Action, Style, Detailer, Scene, Checkpoint app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' @@ -20,6 +23,7 @@ app.config['ACTIONS_DIR'] = 'data/actions' app.config['STYLES_DIR'] = 'data/styles' app.config['SCENES_DIR'] = 'data/scenes' app.config['DETAILERS_DIR'] = 'data/detailers' +app.config['CHECKPOINTS_DIR'] = 'data/checkpoints' app.config['COMFYUI_URL'] = 'http://127.0.0.1:8188' app.config['ILLUSTRIOUS_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Illustrious/' app.config['NOOB_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Noob/' @@ -33,6 +37,19 @@ app.config['SESSION_PERMANENT'] = False db.init_app(app) Session(app) +@app.context_processor +def inject_comfyui_ws_url(): + url = app.config.get('COMFYUI_URL', 'http://127.0.0.1:8188') + # If the URL is localhost/127.0.0.1, replace it with the current request's host + # so that remote clients connect to the correct machine for WebSockets. + if '127.0.0.1' in url or 'localhost' in url: + host = request.host.split(':')[0] + url = url.replace('127.0.0.1', host).replace('localhost', host) + + # Convert http/https to ws/wss + ws_url = url.replace('http://', 'ws://').replace('https://', 'wss://') + return dict(COMFYUI_WS_URL=f"{ws_url}/ws") + ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'} def get_available_loras(): @@ -84,6 +101,16 @@ def get_available_detailer_loras(): loras.append(f"Illustrious/Detailers/{f}") return sorted(loras) +def get_available_scene_loras(): + """Get LoRAs from the Backgrounds directory for scene LoRAs.""" + backgrounds_lora_dir = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Backgrounds/' + loras = [] + if os.path.exists(backgrounds_lora_dir): + for f in os.listdir(backgrounds_lora_dir): + if f.endswith('.safetensors'): + loras.append(f"Illustrious/Backgrounds/{f}") + return sorted(loras) + def get_available_checkpoints(): checkpoints = [] @@ -564,32 +591,309 @@ def sync_detailers(): db.session.commit() +def sync_scenes(): + if not os.path.exists(app.config['SCENES_DIR']): + return + + current_ids = [] + + for filename in os.listdir(app.config['SCENES_DIR']): + if filename.endswith('.json'): + file_path = os.path.join(app.config['SCENES_DIR'], filename) + try: + with open(file_path, 'r') as f: + data = json.load(f) + scene_id = data.get('scene_id') or filename.replace('.json', '') + + current_ids.append(scene_id) + + # Generate URL-safe slug + slug = re.sub(r'[^a-zA-Z0-9_]', '', scene_id) + + # Check if scene already exists + scene = Scene.query.filter_by(scene_id=scene_id).first() + name = data.get('scene_name', scene_id.replace('_', ' ').title()) + + if scene: + scene.data = data + scene.name = name + scene.slug = slug + scene.filename = filename + + # Check if cover image still exists + if scene.image_path: + full_img_path = os.path.join(app.config['UPLOAD_FOLDER'], scene.image_path) + if not os.path.exists(full_img_path): + print(f"Image missing for {scene.name}, clearing path.") + scene.image_path = None + + flag_modified(scene, "data") + else: + new_scene = Scene( + scene_id=scene_id, + slug=slug, + filename=filename, + name=name, + data=data + ) + db.session.add(new_scene) + except Exception as e: + print(f"Error importing scene {filename}: {e}") + + # Remove scenes that are no longer in the folder + all_scenes = Scene.query.all() + for scene in all_scenes: + if scene.scene_id not in current_ids: + db.session.delete(scene) + + db.session.commit() + +def _default_checkpoint_data(checkpoint_path, filename): + """Return template-default data for a checkpoint with no JSON file.""" + name_base = filename.rsplit('.', 1)[0] + return { + "checkpoint_path": checkpoint_path, + "checkpoint_name": filename, + "base_positive": "anime", + "base_negative": "text, logo", + "steps": 25, + "cfg": 5, + "sampler_name": "euler_ancestral", + "vae": "integrated" + } + +def sync_checkpoints(): + checkpoints_dir = app.config.get('CHECKPOINTS_DIR', 'data/checkpoints') + os.makedirs(checkpoints_dir, exist_ok=True) + + # Load all JSON data files keyed by checkpoint_path + json_data_by_path = {} + for filename in os.listdir(checkpoints_dir): + if filename.endswith('.json') and not filename.endswith('.template'): + file_path = os.path.join(checkpoints_dir, filename) + try: + with open(file_path, 'r') as f: + data = json.load(f) + ckpt_path = data.get('checkpoint_path') + if ckpt_path: + json_data_by_path[ckpt_path] = data + except Exception as e: + print(f"Error reading checkpoint JSON {filename}: {e}") + + current_ids = [] + dirs = [ + (app.config.get('ILLUSTRIOUS_MODELS_DIR', ''), 'Illustrious'), + (app.config.get('NOOB_MODELS_DIR', ''), 'Noob'), + ] + for dirpath, family in dirs: + if not dirpath or not os.path.exists(dirpath): + continue + for f in sorted(os.listdir(dirpath)): + if not (f.endswith('.safetensors') or f.endswith('.ckpt')): + continue + checkpoint_path = f"{family}/{f}" + checkpoint_id = checkpoint_path + slug = re.sub(r'[^a-zA-Z0-9_]', '_', checkpoint_path.rsplit('.', 1)[0]).lower().strip('_') + name_base = f.rsplit('.', 1)[0] + friendly_name = re.sub(r'[^a-zA-Z0-9]+', ' ', name_base).strip().title() + current_ids.append(checkpoint_id) + + data = json_data_by_path.get(checkpoint_path, + _default_checkpoint_data(checkpoint_path, f)) + display_name = data.get('checkpoint_name', f).rsplit('.', 1)[0] + display_name = re.sub(r'[^a-zA-Z0-9]+', ' ', display_name).strip().title() or friendly_name + + ckpt = Checkpoint.query.filter_by(checkpoint_id=checkpoint_id).first() + if ckpt: + ckpt.name = display_name + ckpt.slug = slug + ckpt.checkpoint_path = checkpoint_path + ckpt.data = data + flag_modified(ckpt, "data") + if ckpt.image_path: + full_img_path = os.path.join(app.config['UPLOAD_FOLDER'], ckpt.image_path) + if not os.path.exists(full_img_path): + ckpt.image_path = None + else: + db.session.add(Checkpoint( + checkpoint_id=checkpoint_id, + slug=slug, + name=display_name, + checkpoint_path=checkpoint_path, + data=data, + )) + + all_ckpts = Checkpoint.query.all() + for ckpt in all_ckpts: + if ckpt.checkpoint_id not in current_ids: + db.session.delete(ckpt) + + db.session.commit() + +DANBOORU_TOOLS = [ + { + "type": "function", + "function": { + "name": "search_tags", + "description": "Prefix/full-text search for Danbooru tags. Returns rich tag objects ordered by relevance.", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "Search string. Trailing * added automatically."}, + "limit": {"type": "integer", "description": "Max results (1-200)", "default": 20}, + "category": {"type": "string", "enum": ["general", "artist", "copyright", "character", "meta"], "description": "Optional category filter."} + }, + "required": ["query"] + } + } + }, + { + "type": "function", + "function": { + "name": "validate_tags", + "description": "Exact-match validation for a list of tags. Splits into valid, deprecated, and invalid.", + "parameters": { + "type": "object", + "properties": { + "tags": {"type": "array", "items": {"type": "string"}, "description": "Tags to validate."} + }, + "required": ["tags"] + } + } + }, + { + "type": "function", + "function": { + "name": "suggest_tags", + "description": "Autocomplete-style suggestions for a partial or approximate tag. Sorted by post count.", + "parameters": { + "type": "object", + "properties": { + "partial": {"type": "string", "description": "Partial tag or rough approximation."}, + "limit": {"type": "integer", "description": "Max suggestions (1-50)", "default": 10}, + "category": {"type": "string", "enum": ["general", "artist", "copyright", "character", "meta"], "description": "Optional category filter."} + }, + "required": ["partial"] + } + } + } +] + +async def _run_mcp_tool(name, arguments): + server_params = StdioServerParameters( + command="docker", + args=["run", "--rm", "-i", "danbooru-mcp:latest"], + ) + async with stdio_client(server_params) as (read, write): + async with ClientSession(read, write) as session: + await session.initialize() + result = await session.call_tool(name, arguments) + return result.content[0].text + +def call_mcp_tool(name, arguments): + try: + return asyncio.run(_run_mcp_tool(name, arguments)) + except Exception as e: + print(f"MCP Tool Error: {e}") + return json.dumps({"error": str(e)}) + +def load_prompt(filename): + path = os.path.join('data/prompts', filename) + if os.path.exists(path): + with open(path, 'r') as f: + return f.read() + return None + def call_llm(prompt, system_prompt="You are a creative assistant."): settings = Settings.query.first() - if not settings or not settings.openrouter_api_key: - raise ValueError("OpenRouter API Key not configured. Please configure it in Settings.") + if not settings: + raise ValueError("Settings not configured.") - headers = { - "Authorization": f"Bearer {settings.openrouter_api_key}", - "Content-Type": "application/json" - } - data = { - "model": settings.openrouter_model or 'google/gemini-2.0-flash-001', - "messages": [ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": prompt} - ] - } + is_local = settings.llm_provider != 'openrouter' - try: - response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data) - response.raise_for_status() - result = response.json() - return result['choices'][0]['message']['content'] - except requests.exceptions.RequestException as e: - raise RuntimeError(f"LLM API request failed: {str(e)}") from e - except (KeyError, IndexError) as e: - raise RuntimeError(f"Unexpected LLM response format: {str(e)}") from e + if not is_local: + if not settings.openrouter_api_key: + raise ValueError("OpenRouter API Key not configured. Please configure it in Settings.") + + url = "https://openrouter.ai/api/v1/chat/completions" + headers = { + "Authorization": f"Bearer {settings.openrouter_api_key}", + "Content-Type": "application/json", + "HTTP-Referer": request.url_root, + "X-Title": "Character Browser" + } + model = settings.openrouter_model or 'google/gemini-2.0-flash-001' + else: + # Local provider (Ollama or LMStudio) + if not settings.local_base_url: + raise ValueError(f"{settings.llm_provider.title()} Base URL not configured.") + + url = f"{settings.local_base_url.rstrip('/')}/chat/completions" + headers = {"Content-Type": "application/json"} + model = settings.local_model + if not model: + raise ValueError(f"No local model selected for {settings.llm_provider.title()}. Please select one in Settings.") + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": prompt} + ] + + max_turns = 10 + use_tools = True + + while max_turns > 0: + max_turns -= 1 + data = { + "model": model, + "messages": messages, + } + + # Only add tools if supported/requested + if use_tools: + data["tools"] = DANBOORU_TOOLS + data["tool_choice"] = "auto" + + try: + response = requests.post(url, headers=headers, json=data) + + # If 400 Bad Request and we were using tools, try once without tools + if response.status_code == 400 and use_tools: + print(f"LLM Provider {settings.llm_provider} rejected tools. Retrying without tool calling...") + use_tools = False + max_turns += 1 # Reset turn for the retry + continue + + response.raise_for_status() + result = response.json() + + message = result['choices'][0]['message'] + + if message.get('tool_calls'): + messages.append(message) + for tool_call in message['tool_calls']: + name = tool_call['function']['name'] + args = json.loads(tool_call['function']['arguments']) + print(f"Executing MCP tool: {name}({args})") + tool_result = call_mcp_tool(name, args) + messages.append({ + "role": "tool", + "tool_call_id": tool_call['id'], + "name": name, + "content": tool_result + }) + continue + + return message['content'] + except requests.exceptions.RequestException as e: + error_body = "" + try: error_body = f" - Body: {response.text}" + except: pass + raise RuntimeError(f"LLM API request failed: {str(e)}{error_body}") from e + except (KeyError, IndexError) as e: + raise RuntimeError(f"Unexpected LLM response format: {str(e)}") from e + + raise RuntimeError("LLM tool calling loop exceeded maximum turns") @app.route('/get_openrouter_models', methods=['POST']) def get_openrouter_models(): @@ -607,6 +911,21 @@ def get_openrouter_models(): except Exception as e: return {'error': str(e)}, 500 +@app.route('/get_local_models', methods=['POST']) +def get_local_models(): + base_url = request.form.get('base_url') + if not base_url: + return {'error': 'Base URL is required'}, 400 + + try: + response = requests.get(f"{base_url.rstrip('/')}/models") + response.raise_for_status() + models = response.json().get('data', []) + # Ollama/LMStudio often follow the same structure as OpenAI + return {'models': [{'id': m['id'], 'name': m.get('name', m['id'])} for m in models]} + except Exception as e: + return {'error': str(e)}, 500 + @app.route('/settings', methods=['GET', 'POST']) def settings(): settings = Settings.query.first() @@ -616,8 +935,11 @@ def settings(): db.session.commit() if request.method == 'POST': + settings.llm_provider = request.form.get('llm_provider', 'openrouter') settings.openrouter_api_key = request.form.get('api_key') settings.openrouter_model = request.form.get('model') + settings.local_base_url = request.form.get('local_base_url') + settings.local_model = request.form.get('local_model') db.session.commit() flash('Settings updated successfully!') return redirect(url_for('settings')) @@ -635,11 +957,76 @@ def rescan(): flash('Database synced with character files.') return redirect(url_for('index')) +def build_extras_prompt(actions, outfits, scenes, styles, detailers): + """Combine positive prompt text from all selected category items.""" + parts = [] + + for action in actions: + data = action.data + lora = data.get('lora', {}) + if lora.get('lora_triggers'): + parts.append(lora['lora_triggers']) + parts.extend(data.get('tags', [])) + for key in ['full_body', 'additional']: + val = data.get('action', {}).get(key) + if val: + parts.append(val) + + for outfit in outfits: + data = outfit.data + wardrobe = data.get('wardrobe', {}) + for key in ['full_body', 'headwear', 'top', 'bottom', 'legwear', 'footwear', 'hands', 'accessories']: + val = wardrobe.get(key) + if val: + parts.append(val) + lora = data.get('lora', {}) + if lora.get('lora_triggers'): + parts.append(lora['lora_triggers']) + parts.extend(data.get('tags', [])) + + for scene in scenes: + data = scene.data + scene_fields = data.get('scene', {}) + for key in ['background', 'foreground', 'lighting']: + val = scene_fields.get(key) + if val: + parts.append(val) + lora = data.get('lora', {}) + if lora.get('lora_triggers'): + parts.append(lora['lora_triggers']) + parts.extend(data.get('tags', [])) + + for style in styles: + data = style.data + style_fields = data.get('style', {}) + if style_fields.get('artist_name'): + parts.append(f"by {style_fields['artist_name']}") + if style_fields.get('artistic_style'): + parts.append(style_fields['artistic_style']) + lora = data.get('lora', {}) + if lora.get('lora_triggers'): + parts.append(lora['lora_triggers']) + + for detailer in detailers: + data = detailer.data + parts.extend(data.get('prompt', [])) + lora = data.get('lora', {}) + if lora.get('lora_triggers'): + parts.append(lora['lora_triggers']) + + return ", ".join(p for p in parts if p) + + @app.route('/generator', methods=['GET', 'POST']) def generator(): characters = Character.query.order_by(Character.name).all() checkpoints = get_available_checkpoints() - + actions = Action.query.order_by(Action.name).all() + outfits = Outfit.query.order_by(Outfit.name).all() + scenes = Scene.query.order_by(Scene.name).all() + styles = Style.query.order_by(Style.name).all() + detailers = Detailer.query.order_by(Detailer.name).all() + if not checkpoints: checkpoints = ["Noob/oneObsession_v19Atypical.safetensors"] @@ -648,30 +1035,66 @@ def generator(): checkpoint = request.form.get('checkpoint') custom_positive = request.form.get('positive_prompt', '') custom_negative = request.form.get('negative_prompt', '') - + client_id = request.form.get('client_id') + + action_slugs = request.form.getlist('action_slugs') + outfit_slugs = request.form.getlist('outfit_slugs') + scene_slugs = request.form.getlist('scene_slugs') + style_slugs = request.form.getlist('style_slugs') + detailer_slugs = request.form.getlist('detailer_slugs') + override_prompt = request.form.get('override_prompt', '').strip() + width = request.form.get('width') or 1024 + height = request.form.get('height') or 1024 + character = Character.query.filter_by(slug=char_slug).first_or_404() - + + sel_actions = Action.query.filter(Action.slug.in_(action_slugs)).all() if action_slugs else [] + sel_outfits = Outfit.query.filter(Outfit.slug.in_(outfit_slugs)).all() if outfit_slugs else [] + sel_scenes = Scene.query.filter(Scene.slug.in_(scene_slugs)).all() if scene_slugs else [] + sel_styles = Style.query.filter(Style.slug.in_(style_slugs)).all() if style_slugs else [] + sel_detailers = Detailer.query.filter(Detailer.slug.in_(detailer_slugs)).all() if detailer_slugs else [] + try: with open('comfy_workflow.json', 'r') as f: workflow = json.load(f) - + # Build base prompts from character defaults prompts = build_prompt(character.data, default_fields=character.default_fields) - - # Append custom additions to the "main" prompt - if custom_positive: - prompts["main"] = f"{prompts['main']}, {custom_positive}" - - # Prepare workflow with custom checkpoint and negative prompt - workflow = _prepare_workflow(workflow, character, prompts, checkpoint, custom_negative, detailer=None) + + if override_prompt: + prompts["main"] = override_prompt + else: + extras = build_extras_prompt(sel_actions, sel_outfits, sel_scenes, sel_styles, sel_detailers) + combined = prompts["main"] + if extras: + combined = f"{combined}, {extras}" + if custom_positive: + combined = f"{combined}, {custom_positive}" + prompts["main"] = combined + + # Prepare workflow - first selected item per category supplies its LoRA slot + workflow = _prepare_workflow( + workflow, character, prompts, checkpoint, custom_negative, + outfit=sel_outfits[0] if sel_outfits else None, + action=sel_actions[0] if sel_actions else None, + style=sel_styles[0] if sel_styles else None, + detailer=sel_detailers[0] if sel_detailers else None, + scene=sel_scenes[0] if sel_scenes else None, + width=width, + height=height, + ) print(f"Queueing generator prompt for {character.character_id}") - prompt_response = queue_prompt(workflow) + prompt_response = queue_prompt(workflow, client_id=client_id) if 'prompt_id' not in prompt_response: raise Exception(f"ComfyUI failed: {prompt_response.get('error', 'Unknown error')}") prompt_id = prompt_response['prompt_id'] + + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return {'status': 'queued', 'prompt_id': prompt_id} + flash("Generation started...") max_retries = 120 @@ -692,16 +1115,86 @@ def generator(): f.write(image_data) relative_path = f"characters/{character.slug}/{filename}" - return render_template('generator.html', characters=characters, checkpoints=checkpoints, + return render_template('generator.html', + characters=characters, checkpoints=checkpoints, + actions=actions, outfits=outfits, scenes=scenes, + styles=styles, detailers=detailers, generated_image=relative_path, selected_char=char_slug, selected_ckpt=checkpoint) time.sleep(2) max_retries -= 1 flash("Generation timed out.") except Exception as e: print(f"Generator error: {e}") + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return {'error': str(e)}, 500 flash(f"Error: {str(e)}") - return render_template('generator.html', characters=characters, checkpoints=checkpoints) + return render_template('generator.html', characters=characters, checkpoints=checkpoints, + actions=actions, outfits=outfits, scenes=scenes, + styles=styles, detailers=detailers) + +@app.route('/generator/finalize//', methods=['POST']) +def finalize_generator(slug, prompt_id): + character = Character.query.filter_by(slug=slug).first_or_404() + + try: + history = get_history(prompt_id) + if prompt_id not in history: + return {'error': 'History not found'}, 404 + + outputs = history[prompt_id]['outputs'] + for node_id in outputs: + if 'images' in outputs[node_id]: + image_info = outputs[node_id]['images'][0] + image_data = get_image(image_info['filename'], image_info['subfolder'], image_info['type']) + + char_folder = os.path.join(app.config['UPLOAD_FOLDER'], f"characters/{slug}") + os.makedirs(char_folder, exist_ok=True) + filename = f"gen_{int(time.time())}.png" + file_path = os.path.join(char_folder, filename) + with open(file_path, 'wb') as f: + f.write(image_data) + + relative_path = f"characters/{slug}/{filename}" + return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')} + + return {'error': 'No image found in output'}, 404 + except Exception as e: + print(f"Finalize error: {e}") + return {'error': str(e)}, 500 + +@app.route('/generator/preview_prompt', methods=['POST']) +def generator_preview_prompt(): + char_slug = request.form.get('character') + if not char_slug: + return {'error': 'No character selected'}, 400 + + character = Character.query.filter_by(slug=char_slug).first() + if not character: + return {'error': 'Character not found'}, 404 + + action_slugs = request.form.getlist('action_slugs') + outfit_slugs = request.form.getlist('outfit_slugs') + scene_slugs = request.form.getlist('scene_slugs') + style_slugs = request.form.getlist('style_slugs') + detailer_slugs = request.form.getlist('detailer_slugs') + custom_positive = request.form.get('positive_prompt', '') + + sel_actions = Action.query.filter(Action.slug.in_(action_slugs)).all() if action_slugs else [] + sel_outfits = Outfit.query.filter(Outfit.slug.in_(outfit_slugs)).all() if outfit_slugs else [] + sel_scenes = Scene.query.filter(Scene.slug.in_(scene_slugs)).all() if scene_slugs else [] + sel_styles = Style.query.filter(Style.slug.in_(style_slugs)).all() if style_slugs else [] + sel_detailers = Detailer.query.filter(Detailer.slug.in_(detailer_slugs)).all() if detailer_slugs else [] + + prompts = build_prompt(character.data, default_fields=character.default_fields) + extras = build_extras_prompt(sel_actions, sel_outfits, sel_scenes, sel_styles, sel_detailers) + combined = prompts["main"] + if extras: + combined = f"{combined}, {extras}" + if custom_positive: + combined = f"{combined}, {custom_positive}" + + return {'prompt': combined} @app.route('/character/') def detail(slug): @@ -744,52 +1237,10 @@ def create_character(): return redirect(request.url) # Generate JSON with LLM - system_prompt = """You are a JSON generator. output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "character_id": "WILL_BE_REPLACED", - "character_name": "WILL_BE_REPLACED", - "identity": { - "base_specs": "string (e.g. 1girl, build, skin)", - "hair": "string", - "eyes": "string", - "hands": "string", - "arms": "string", - "torso": "string", - "pelvis": "string", - "legs": "string", - "feet": "string", - "extra": "string" - }, - "defaults": { - "expression": "", - "pose": "", - "scene": "" - }, - "wardrobe": { - "full_body": "string (e.g. bodysuit, dress, full outfit description)", - "headwear": "string", - "top": "string", - "bottom": "string", - "legwear": "string", - "footwear": "string", - "hands": "string", - "accessories": "string" - }, - "styles": { - "aesthetic": "string", - "primary_color": "string", - "secondary_color": "string", - "tertiary_color": "string" - }, - "lora": { - "lora_name": "", - "lora_weight": 1.0, - "lora_triggers": "" - }, - "tags": ["string", "string"] - } - Fill the fields based on the user's description. Use Danbooru-style tags for the values (e.g. 'long hair', 'blue eyes'). Keep values concise. Use empty strings "" for fields that are not applicable or unknown - never use words like "none" or "n/a". Leave defaults fields empty.""" + system_prompt = load_prompt('character_system.txt') + if not system_prompt: + flash("System prompt file not found.") + return redirect(request.url) try: llm_response = call_llm(f"Create a character profile for '{name}' based on this description: {prompt}", system_prompt) @@ -1182,7 +1633,7 @@ def replace_cover_from_preview(slug): return redirect(url_for('detail', slug=slug)) -def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_negative=None, outfit=None, action=None, style=None, detailer=None, scene=None): +def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_negative=None, outfit=None, action=None, style=None, detailer=None, scene=None, width=None, height=None): # 1. Update prompts using replacement to preserve embeddings workflow["6"]["inputs"]["text"] = workflow["6"]["inputs"]["text"].replace("{{POSITIVE_PROMPT}}", prompts["main"]) @@ -1290,7 +1741,14 @@ def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_nega workflow["3"]["inputs"]["seed"] = gen_seed if "11" in workflow: workflow["11"]["inputs"]["seed"] = gen_seed if "13" in workflow: workflow["13"]["inputs"]["seed"] = gen_seed - + + # 5. Set image dimensions + if "5" in workflow: + if width: + workflow["5"]["inputs"]["width"] = int(width) + if height: + workflow["5"]["inputs"]["height"] = int(height) + return workflow def _queue_generation(character, action='preview', selected_fields=None, client_id=None): @@ -1467,6 +1925,19 @@ def clear_all_action_covers(): db.session.commit() return {'success': True} +@app.route('/get_missing_scenes') +def get_missing_scenes(): + missing = Scene.query.filter((Scene.image_path == None) | (Scene.image_path == '')).all() + return {'missing': [{'slug': s.slug, 'name': s.name} for s in missing]} + +@app.route('/clear_all_scene_covers', methods=['POST']) +def clear_all_scene_covers(): + scenes = Scene.query.all() + for scene in scenes: + scene.image_path = None + db.session.commit() + return {'success': True} + # ============ OUTFIT ROUTES ============ @app.route('/outfits') @@ -1780,29 +2251,10 @@ def create_outfit(): return redirect(request.url) # Generate JSON with LLM - system_prompt = """You are a JSON generator. output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "outfit_id": "WILL_BE_REPLACED", - "outfit_name": "WILL_BE_REPLACED", - "wardrobe": { - "full_body": "string (e.g. bodysuit, dress, full outfit description)", - "headwear": "string (e.g. hairband, cap)", - "top": "string (e.g. blouse, corset, jacket)", - "bottom": "string (e.g. skirt, pants, shorts)", - "legwear": "string (e.g. stockings, tights, socks)", - "footwear": "string (e.g. heels, boots, sneakers)", - "hands": "string (e.g. gloves, sleeves)", - "accessories": "string (e.g. necklace, belt, apron)" - }, - "lora": { - "lora_name": "", - "lora_weight": 0.8, - "lora_triggers": "" - }, - "tags": ["string", "string"] - } - Fill the fields based on the user's description. Use Danbooru-style tags for the values (e.g. 'frilled skirt', 'lace stockings'). Keep values concise. Use empty strings "" for fields that are not applicable or unknown - never use words like "none" or "n/a". Leave lora fields empty - they can be configured later.""" + system_prompt = load_prompt('outfit_system.txt') + if not system_prompt: + flash("System prompt file not found.") + return redirect(request.url) try: llm_response = call_llm(f"Create an outfit profile for '{name}' based on this description: {prompt}", system_prompt) @@ -2345,34 +2797,15 @@ def bulk_create_actions_from_loras(): flash('Actions LoRA directory not found.', 'error') return redirect(url_for('actions_index')) + overwrite = request.form.get('overwrite') == 'true' created_count = 0 skipped_count = 0 + overwritten_count = 0 - system_prompt = """You are a JSON generator. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "action_id": "WILL_BE_REPLACED", - "action_name": "WILL_BE_REPLACED", - "action": { - "full_body": "string (pose description)", - "head": "string (expression/head position)", - "eyes": "string", - "arms": "string", - "hands": "string", - "torso": "string", - "pelvis": "string", - "legs": "string", - "feet": "string", - "additional": "string" - }, - "lora": { - "lora_name": "WILL_BE_REPLACED", - "lora_weight": 1.0, - "lora_triggers": "WILL_BE_REPLACED" - }, - "tags": ["string", "string"] - } - Use the provided LoRA filename as a clue to what the action/pose represents. Fill the fields with descriptive, high-quality tags.""" + system_prompt = load_prompt('action_system.txt') + if not system_prompt: + flash('Action system prompt file not found.', 'error') + return redirect(url_for('actions_index')) for filename in os.listdir(actions_lora_dir): if filename.endswith('.safetensors'): @@ -2383,30 +2816,60 @@ def bulk_create_actions_from_loras(): json_filename = f"{action_id}.json" json_path = os.path.join(app.config['ACTIONS_DIR'], json_filename) - if os.path.exists(json_path): + is_existing = os.path.exists(json_path) + if is_existing and not overwrite: skipped_count += 1 continue + html_filename = f"{name_base}.html" + html_path = os.path.join(actions_lora_dir, html_filename) + html_content = "" + if os.path.exists(html_path): + try: + with open(html_path, 'r', encoding='utf-8', errors='ignore') as hf: + html_raw = hf.read() + # Strip HTML tags but keep text content for LLM context + clean_html = re.sub(r']*>.*?', '', html_raw, flags=re.DOTALL) + clean_html = re.sub(r']*>.*?', '', clean_html, flags=re.DOTALL) + clean_html = re.sub(r']*>', '', clean_html) + clean_html = re.sub(r'<[^>]+>', ' ', clean_html) + html_content = ' '.join(clean_html.split()) + except Exception as e: + print(f"Error reading HTML {html_filename}: {e}") + try: print(f"Asking LLM to describe action: {action_name}") - llm_response = call_llm(f"Describe an action/pose for an AI image generation model based on the LoRA filename: '{filename}'", system_prompt) + prompt = f"Describe an action/pose for an AI image generation model based on the LoRA filename: '{filename}'" + if html_content: + prompt += f"\n\nHere is descriptive text and metadata extracted from an associated HTML file for this LoRA:\n###\n{html_content[:3000]}\n###" + + llm_response = call_llm(prompt, system_prompt) # Clean response clean_json = llm_response.replace('```json', '').replace('```', '').strip() action_data = json.loads(clean_json) - # Enforce system values + # Enforce system values while preserving LLM-extracted metadata action_data['action_id'] = action_id action_data['action_name'] = action_name - action_data['lora'] = { - "lora_name": f"Illustrious/Poses/{filename}", - "lora_weight": 1.0, - "lora_triggers": name_base - } + + # Update lora dict safely + if 'lora' not in action_data: action_data['lora'] = {} + action_data['lora']['lora_name'] = f"Illustrious/Poses/{filename}" + + # Fallbacks if LLM failed to extract metadata + if not action_data['lora'].get('lora_triggers'): + action_data['lora']['lora_triggers'] = name_base + if action_data['lora'].get('lora_weight') is None: + action_data['lora']['lora_weight'] = 1.0 with open(json_path, 'w') as f: json.dump(action_data, f, indent=2) - created_count += 1 + + if is_existing: + overwritten_count += 1 + else: + created_count += 1 # Small delay to avoid API rate limits if many files time.sleep(0.5) @@ -2414,11 +2877,14 @@ def bulk_create_actions_from_loras(): except Exception as e: print(f"Error creating action for {filename}: {e}") - if created_count > 0: + if created_count > 0 or overwritten_count > 0: sync_actions() - flash(f'Successfully created {created_count} new actions with AI descriptions. (Skipped {skipped_count} existing)') + msg = f'Successfully processed actions: {created_count} created, {overwritten_count} overwritten.' + if skipped_count > 0: + msg += f' (Skipped {skipped_count} existing)' + flash(msg) else: - flash(f'No new actions created. {skipped_count} existing actions found.') + flash(f'No actions created or overwritten. {skipped_count} existing actions found.') return redirect(url_for('actions_index')) @@ -2448,30 +2914,10 @@ def create_action(): flash("Description is required when AI generation is enabled.") return redirect(request.url) - system_prompt = """You are a JSON generator. output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "action_id": "WILL_BE_REPLACED", - "action_name": "WILL_BE_REPLACED", - "action": { - "full_body": "string (pose description)", - "head": "string (expression/head position)", - "eyes": "string", - "arms": "string", - "hands": "string", - "torso": "string", - "pelvis": "string", - "legs": "string", - "feet": "string", - "additional": "string" - }, - "lora": { - "lora_name": "", - "lora_weight": 1.0, - "lora_triggers": "" - }, - "tags": ["string", "string"] - }""" + system_prompt = load_prompt('action_system.txt') + if not system_prompt: + flash("Action system prompt file not found.") + return redirect(request.url) try: llm_response = call_llm(f"Create an action profile for '{name}' based on this description: {prompt}", system_prompt) @@ -2953,54 +3399,86 @@ def bulk_create_styles_from_loras(): flash('Styles LoRA directory not found.', 'error') return redirect(url_for('styles_index')) + overwrite = request.form.get('overwrite') == 'true' created_count = 0 skipped_count = 0 + overwritten_count = 0 + + system_prompt = load_prompt('style_system.txt') + if not system_prompt: + flash('Style system prompt file not found.', 'error') + return redirect(url_for('styles_index')) for filename in os.listdir(styles_lora_dir): if filename.endswith('.safetensors'): - # Generate style_id and style_name from filename - # Remove extension name_base = filename.rsplit('.', 1)[0] - # Replace special characters with underscores for ID style_id = re.sub(r'[^a-zA-Z0-9_]', '_', name_base.lower()) - # Format name: replace underscores/dashes with spaces and title case style_name = re.sub(r'[^a-zA-Z0-9]+', ' ', name_base).title() - # Check if JSON file already exists json_filename = f"{style_id}.json" json_path = os.path.join(app.config['STYLES_DIR'], json_filename) - if os.path.exists(json_path): + is_existing = os.path.exists(json_path) + if is_existing and not overwrite: skipped_count += 1 continue - # Create JSON content - style_data = { - "style_id": style_id, - "style_name": style_name, - "style": { - "artist_name": "", - "artistic_style": "" - }, - "lora": { - "lora_name": f"Illustrious/Styles/{filename}", - "lora_weight": 1.0, - "lora_triggers": name_base # Default to filename base as trigger - } - } + html_filename = f"{name_base}.html" + html_path = os.path.join(styles_lora_dir, html_filename) + html_content = "" + if os.path.exists(html_path): + try: + with open(html_path, 'r', encoding='utf-8', errors='ignore') as hf: + html_raw = hf.read() + clean_html = re.sub(r']*>.*?', '', html_raw, flags=re.DOTALL) + clean_html = re.sub(r']*>.*?', '', clean_html, flags=re.DOTALL) + clean_html = re.sub(r']*>', '', clean_html) + clean_html = re.sub(r'<[^>]+>', ' ', clean_html) + html_content = ' '.join(clean_html.split()) + except Exception as e: + print(f"Error reading HTML {html_filename}: {e}") try: + print(f"Asking LLM to describe style: {style_name}") + prompt = f"Describe an art style or artist LoRA for AI image generation based on the filename: '{filename}'" + if html_content: + prompt += f"\n\nHere is descriptive text and metadata extracted from an associated HTML file for this LoRA:\n###\n{html_content[:3000]}\n###" + + llm_response = call_llm(prompt, system_prompt) + clean_json = llm_response.replace('```json', '').replace('```', '').strip() + style_data = json.loads(clean_json) + + style_data['style_id'] = style_id + style_data['style_name'] = style_name + + if 'lora' not in style_data: style_data['lora'] = {} + style_data['lora']['lora_name'] = f"Illustrious/Styles/{filename}" + + if not style_data['lora'].get('lora_triggers'): + style_data['lora']['lora_triggers'] = name_base + if style_data['lora'].get('lora_weight') is None: + style_data['lora']['lora_weight'] = 1.0 + with open(json_path, 'w') as f: json.dump(style_data, f, indent=2) - created_count += 1 + + if is_existing: + overwritten_count += 1 + else: + created_count += 1 + + time.sleep(0.5) except Exception as e: print(f"Error creating style for {filename}: {e}") - if created_count > 0: + if created_count > 0 or overwritten_count > 0: sync_styles() - flash(f'Successfully created {created_count} new styles from LoRAs. (Skipped {skipped_count} existing)') + msg = f'Successfully processed styles: {created_count} created, {overwritten_count} overwritten.' + if skipped_count > 0: + msg += f' (Skipped {skipped_count} existing)' + flash(msg) else: - flash(f'No new styles created. {skipped_count} existing styles found.') + flash(f'No styles created or overwritten. {skipped_count} existing styles found.') return redirect(url_for('styles_index')) @@ -3426,31 +3904,15 @@ def bulk_create_scenes_from_loras(): flash('Backgrounds LoRA directory not found.', 'error') return redirect(url_for('scenes_index')) + overwrite = request.form.get('overwrite') == 'true' created_count = 0 skipped_count = 0 + overwritten_count = 0 - system_prompt = """You are a JSON generator. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "scene_id": "WILL_BE_REPLACED", - "scene_name": "WILL_BE_REPLACED", - "description": "string (brief description of the scene)", - "scene": { - "background": "string (Danbooru-style tags)", - "foreground": "string (Danbooru-style tags)", - "furniture": ["string", "string"], - "colors": ["string", "string"], - "lighting": "string", - "theme": "string" - }, - "lora": { - "lora_name": "WILL_BE_REPLACED", - "lora_weight": 1.0, - "lora_triggers": "WILL_BE_REPLACED" - }, - "tags": ["string", "string"] - } - Use the provided LoRA filename as a clue to what the scene represents. Fill the fields with descriptive, high-quality tags.""" + system_prompt = load_prompt('scene_system.txt') + if not system_prompt: + flash('Scene system prompt file not found.', 'error') + return redirect(url_for('scenes_index')) for filename in os.listdir(backgrounds_lora_dir): if filename.endswith('.safetensors'): @@ -3461,30 +3923,58 @@ def bulk_create_scenes_from_loras(): json_filename = f"{scene_id}.json" json_path = os.path.join(app.config['SCENES_DIR'], json_filename) - if os.path.exists(json_path): + is_existing = os.path.exists(json_path) + if is_existing and not overwrite: skipped_count += 1 continue + html_filename = f"{name_base}.html" + html_path = os.path.join(backgrounds_lora_dir, html_filename) + html_content = "" + if os.path.exists(html_path): + try: + with open(html_path, 'r', encoding='utf-8', errors='ignore') as hf: + html_raw = hf.read() + # Strip HTML tags but keep text content for LLM context + clean_html = re.sub(r']*>.*?', '', html_raw, flags=re.DOTALL) + clean_html = re.sub(r']*>.*?', '', clean_html, flags=re.DOTALL) + clean_html = re.sub(r']*>', '', clean_html) + clean_html = re.sub(r'<[^>]+>', ' ', clean_html) + html_content = ' '.join(clean_html.split()) + except Exception as e: + print(f"Error reading HTML {html_filename}: {e}") + try: print(f"Asking LLM to describe scene: {scene_name}") - llm_response = call_llm(f"Describe a scene for an AI image generation model based on the LoRA filename: '{filename}'", system_prompt) + prompt = f"Describe a scene for an AI image generation model based on the LoRA filename: '{filename}'" + if html_content: + prompt += f"\n\nHere is descriptive text and metadata extracted from an associated HTML file for this LoRA:\n###\n{html_content[:3000]}\n###" + + llm_response = call_llm(prompt, system_prompt) # Clean response clean_json = llm_response.replace('```json', '').replace('```', '').strip() scene_data = json.loads(clean_json) - # Enforce system values + # Enforce system values while preserving LLM-extracted metadata scene_data['scene_id'] = scene_id scene_data['scene_name'] = scene_name - scene_data['lora'] = { - "lora_name": f"Illustrious/Backgrounds/{filename}", - "lora_weight": 1.0, - "lora_triggers": name_base - } + + if 'lora' not in scene_data: scene_data['lora'] = {} + scene_data['lora']['lora_name'] = f"Illustrious/Backgrounds/{filename}" + + if not scene_data['lora'].get('lora_triggers'): + scene_data['lora']['lora_triggers'] = name_base + if scene_data['lora'].get('lora_weight') is None: + scene_data['lora']['lora_weight'] = 1.0 with open(json_path, 'w') as f: json.dump(scene_data, f, indent=2) - created_count += 1 + + if is_existing: + overwritten_count += 1 + else: + created_count += 1 # Small delay to avoid API rate limits if many files time.sleep(0.5) @@ -3492,11 +3982,14 @@ def bulk_create_scenes_from_loras(): except Exception as e: print(f"Error creating scene for {filename}: {e}") - if created_count > 0: + if created_count > 0 or overwritten_count > 0: sync_scenes() - flash(f'Successfully created {created_count} new scenes with AI descriptions. (Skipped {skipped_count} existing)') + msg = f'Successfully processed scenes: {created_count} created, {overwritten_count} overwritten.' + if skipped_count > 0: + msg += f' (Skipped {skipped_count} existing)' + flash(msg) else: - flash(f'No new scenes created. {skipped_count} existing scenes found.') + flash(f'No scenes created or overwritten. {skipped_count} existing scenes found.') return redirect(url_for('scenes_index')) @@ -3909,22 +4402,15 @@ def bulk_create_detailers_from_loras(): flash('Detailers LoRA directory not found.', 'error') return redirect(url_for('detailers_index')) + overwrite = request.form.get('overwrite') == 'true' created_count = 0 skipped_count = 0 + overwritten_count = 0 - system_prompt = """You are a JSON generator. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. - Structure: - { - "detailer_id": "WILL_BE_REPLACED", - "detailer_name": "WILL_BE_REPLACED", - "prompt": "string (Danbooru-style tags for the effect)", - "lora": { - "lora_name": "WILL_BE_REPLACED", - "lora_weight": 1.0, - "lora_triggers": "WILL_BE_REPLACED" - } - } - Use the provided LoRA filename as a clue to what refinement it provides. Fill the prompt field with descriptive, high-quality tags that trigger or enhance the effect.""" + system_prompt = load_prompt('detailer_system.txt') + if not system_prompt: + flash('Detailer system prompt file not found.', 'error') + return redirect(url_for('detailers_index')) for filename in os.listdir(detailers_lora_dir): if filename.endswith('.safetensors'): @@ -3935,35 +4421,68 @@ def bulk_create_detailers_from_loras(): json_filename = f"{detailer_id}.json" json_path = os.path.join(app.config['DETAILERS_DIR'], json_filename) - if os.path.exists(json_path): + is_existing = os.path.exists(json_path) + if is_existing and not overwrite: skipped_count += 1 continue + html_filename = f"{name_base}.html" + html_path = os.path.join(detailers_lora_dir, html_filename) + html_content = "" + if os.path.exists(html_path): + try: + with open(html_path, 'r', encoding='utf-8', errors='ignore') as hf: + html_raw = hf.read() + clean_html = re.sub(r']*>.*?', '', html_raw, flags=re.DOTALL) + clean_html = re.sub(r']*>.*?', '', clean_html, flags=re.DOTALL) + clean_html = re.sub(r']*>', '', clean_html) + clean_html = re.sub(r'<[^>]+>', ' ', clean_html) + html_content = ' '.join(clean_html.split()) + except Exception as e: + print(f"Error reading HTML {html_filename}: {e}") + try: - llm_response = call_llm(f"Describe a detailer LoRA for AI image generation based on the filename: '{filename}'", system_prompt) + print(f"Asking LLM to describe detailer: {detailer_name}") + prompt = f"Describe a detailer LoRA for AI image generation based on the filename: '{filename}'" + if html_content: + prompt += f"\n\nHere is descriptive text and metadata extracted from an associated HTML file for this LoRA:\n###\n{html_content[:3000]}\n###" + + llm_response = call_llm(prompt, system_prompt) clean_json = llm_response.replace('```json', '').replace('```', '').strip() detailer_data = json.loads(clean_json) detailer_data['detailer_id'] = detailer_id detailer_data['detailer_name'] = detailer_name - detailer_data['lora'] = { - "lora_name": f"Illustrious/Detailers/{filename}", - "lora_weight": 1.0, - "lora_triggers": name_base - } + + if 'lora' not in detailer_data: detailer_data['lora'] = {} + detailer_data['lora']['lora_name'] = f"Illustrious/Detailers/{filename}" + + if not detailer_data['lora'].get('lora_triggers'): + detailer_data['lora']['lora_triggers'] = name_base + if detailer_data['lora'].get('lora_weight') is None: + detailer_data['lora']['lora_weight'] = 1.0 with open(json_path, 'w') as f: json.dump(detailer_data, f, indent=2) - created_count += 1 + + if is_existing: + overwritten_count += 1 + else: + created_count += 1 + + # Small delay to avoid API rate limits if many files time.sleep(0.5) except Exception as e: print(f"Error creating detailer for {filename}: {e}") - if created_count > 0: + if created_count > 0 or overwritten_count > 0: sync_detailers() - flash(f'Successfully created {created_count} new detailers. (Skipped {skipped_count} existing)') + msg = f'Successfully processed detailers: {created_count} created, {overwritten_count} overwritten.' + if skipped_count > 0: + msg += f' (Skipped {skipped_count} existing)' + flash(msg) else: - flash(f'No new detailers created.') + flash(f'No new detailers created or overwritten. {skipped_count} existing detailers found.') return redirect(url_for('detailers_index')) @@ -4018,6 +4537,535 @@ def create_detailer(): return render_template('detailers/create.html') + +# --------------------------------------------------------------------------- +# Checkpoints +# --------------------------------------------------------------------------- + +@app.route('/checkpoints') +def checkpoints_index(): + checkpoints = Checkpoint.query.order_by(Checkpoint.name).all() + return render_template('checkpoints/index.html', checkpoints=checkpoints) + +@app.route('/checkpoints/rescan', methods=['POST']) +def rescan_checkpoints(): + sync_checkpoints() + flash('Checkpoint list synced from disk.') + return redirect(url_for('checkpoints_index')) + +@app.route('/checkpoint/') +def checkpoint_detail(slug): + ckpt = Checkpoint.query.filter_by(slug=slug).first_or_404() + characters = Character.query.order_by(Character.name).all() + preview_image = session.get(f'preview_checkpoint_{slug}') + selected_character = session.get(f'char_checkpoint_{slug}') + return render_template('checkpoints/detail.html', ckpt=ckpt, characters=characters, + preview_image=preview_image, selected_character=selected_character) + +@app.route('/checkpoint//upload', methods=['POST']) +def upload_checkpoint_image(slug): + ckpt = Checkpoint.query.filter_by(slug=slug).first_or_404() + if 'image' not in request.files: + flash('No file part') + return redirect(url_for('checkpoint_detail', slug=slug)) + file = request.files['image'] + if file.filename == '': + flash('No selected file') + return redirect(url_for('checkpoint_detail', slug=slug)) + if file and allowed_file(file.filename): + folder = os.path.join(app.config['UPLOAD_FOLDER'], f"checkpoints/{slug}") + os.makedirs(folder, exist_ok=True) + filename = secure_filename(file.filename) + file.save(os.path.join(folder, filename)) + ckpt.image_path = f"checkpoints/{slug}/{filename}" + db.session.commit() + flash('Image uploaded successfully!') + return redirect(url_for('checkpoint_detail', slug=slug)) + +def _apply_checkpoint_settings(workflow, ckpt_data): + """Apply checkpoint-specific sampler/prompt/VAE settings to the workflow.""" + steps = ckpt_data.get('steps') + cfg = ckpt_data.get('cfg') + sampler_name = ckpt_data.get('sampler_name') + base_positive = ckpt_data.get('base_positive', '') + base_negative = ckpt_data.get('base_negative', '') + vae = ckpt_data.get('vae', 'integrated') + + # KSampler (node 3) + if steps and '3' in workflow: + workflow['3']['inputs']['steps'] = int(steps) + if cfg and '3' in workflow: + workflow['3']['inputs']['cfg'] = float(cfg) + if sampler_name and '3' in workflow: + workflow['3']['inputs']['sampler_name'] = sampler_name + + # Face/hand detailers (nodes 11, 13) + for node_id in ['11', '13']: + if node_id in workflow: + if steps: + workflow[node_id]['inputs']['steps'] = int(steps) + if cfg: + workflow[node_id]['inputs']['cfg'] = float(cfg) + if sampler_name: + workflow[node_id]['inputs']['sampler_name'] = sampler_name + + # Prepend base_positive to positive prompt + if base_positive and '6' in workflow: + workflow['6']['inputs']['text'] = f"{base_positive}, {workflow['6']['inputs']['text']}" + + # Append base_negative to negative prompt + if base_negative and '7' in workflow: + workflow['7']['inputs']['text'] = f"{workflow['7']['inputs']['text']}, {base_negative}" + + # VAE: if not integrated, inject a VAELoader node and rewire + if vae and vae != 'integrated': + workflow['21'] = { + 'inputs': {'vae_name': vae}, + 'class_type': 'VAELoader' + } + if '8' in workflow: + workflow['8']['inputs']['vae'] = ['21', 0] + for node_id in ['11', '13']: + if node_id in workflow: + workflow[node_id]['inputs']['vae'] = ['21', 0] + + return workflow + +def _queue_checkpoint_generation(ckpt_obj, character=None, client_id=None): + with open('comfy_workflow.json', 'r') as f: + workflow = json.load(f) + + if character: + combined_data = character.data.copy() + combined_data['character_id'] = character.character_id + selected_fields = [] + for key in ['base_specs', 'hair', 'eyes']: + if character.data.get('identity', {}).get(key): + selected_fields.append(f'identity::{key}') + selected_fields.append('special::name') + wardrobe = character.get_active_wardrobe() + for key in ['full_body', 'top', 'bottom']: + if wardrobe.get(key): + selected_fields.append(f'wardrobe::{key}') + prompts = build_prompt(combined_data, selected_fields, None, active_outfit=character.active_outfit) + primary_color = character.data.get('styles', {}).get('primary_color', '') + prompts["main"] = f"{prompts['main']}, {primary_color + ' ' if primary_color else ''}simple background" + else: + prompts = { + "main": "masterpiece, best quality, 1girl, solo, simple background, looking at viewer", + "face": "masterpiece, best quality", + "hand": "masterpiece, best quality", + } + + workflow = _prepare_workflow(workflow, character, prompts, checkpoint=ckpt_obj.checkpoint_path) + + ckpt_data = ckpt_obj.data or {} + workflow = _apply_checkpoint_settings(workflow, ckpt_data) + + return queue_prompt(workflow, client_id=client_id) + +@app.route('/checkpoint//generate', methods=['POST']) +def generate_checkpoint_image(slug): + ckpt = Checkpoint.query.filter_by(slug=slug).first_or_404() + try: + client_id = request.form.get('client_id') + character_slug = request.form.get('character_slug', '') + character = None + if character_slug == '__random__': + all_characters = Character.query.all() + if all_characters: + character = random.choice(all_characters) + character_slug = character.slug + elif character_slug: + character = Character.query.filter_by(slug=character_slug).first() + + session[f'char_checkpoint_{slug}'] = character_slug + prompt_response = _queue_checkpoint_generation(ckpt, character, client_id=client_id) + + if 'prompt_id' not in prompt_response: + raise Exception(f"ComfyUI failed: {prompt_response.get('error', 'Unknown error')}") + + prompt_id = prompt_response['prompt_id'] + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return {'status': 'queued', 'prompt_id': prompt_id} + return redirect(url_for('checkpoint_detail', slug=slug)) + except Exception as e: + print(f"Checkpoint generation error: {e}") + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return {'error': str(e)}, 500 + flash(f"Error during generation: {str(e)}") + return redirect(url_for('checkpoint_detail', slug=slug)) + +@app.route('/checkpoint//finalize_generation/', methods=['POST']) +def finalize_checkpoint_generation(slug, prompt_id): + ckpt = Checkpoint.query.filter_by(slug=slug).first_or_404() + action = request.form.get('action', 'preview') + try: + history = get_history(prompt_id) + if prompt_id not in history: + return {'error': 'History not found'}, 404 + outputs = history[prompt_id]['outputs'] + for node_id in outputs: + if 'images' in outputs[node_id]: + image_info = outputs[node_id]['images'][0] + image_data = get_image(image_info['filename'], image_info['subfolder'], image_info['type']) + folder = os.path.join(app.config['UPLOAD_FOLDER'], f"checkpoints/{slug}") + os.makedirs(folder, exist_ok=True) + filename = f"gen_{int(time.time())}.png" + with open(os.path.join(folder, filename), 'wb') as f: + f.write(image_data) + relative_path = f"checkpoints/{slug}/{filename}" + session[f'preview_checkpoint_{slug}'] = relative_path + session.modified = True + if action == 'replace': + ckpt.image_path = relative_path + db.session.commit() + return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')} + return {'error': 'No image found in output'}, 404 + except Exception as e: + print(f"Finalize checkpoint error: {e}") + return {'error': str(e)}, 500 + +@app.route('/checkpoint//replace_cover_from_preview', methods=['POST']) +def replace_checkpoint_cover_from_preview(slug): + ckpt = Checkpoint.query.filter_by(slug=slug).first_or_404() + preview_path = session.get(f'preview_checkpoint_{slug}') + if preview_path: + ckpt.image_path = preview_path + db.session.commit() + flash('Cover image updated from preview!') + else: + flash('No preview image available', 'error') + return redirect(url_for('checkpoint_detail', slug=slug)) + +@app.route('/get_missing_checkpoints') +def get_missing_checkpoints(): + missing = Checkpoint.query.filter((Checkpoint.image_path == None) | (Checkpoint.image_path == '')).all() + return {'missing': [{'slug': c.slug, 'name': c.name} for c in missing]} + +@app.route('/clear_all_checkpoint_covers', methods=['POST']) +def clear_all_checkpoint_covers(): + for ckpt in Checkpoint.query.all(): + ckpt.image_path = None + db.session.commit() + return {'success': True} + +@app.route('/checkpoints/bulk_create', methods=['POST']) +def bulk_create_checkpoints(): + checkpoints_dir = app.config.get('CHECKPOINTS_DIR', 'data/checkpoints') + os.makedirs(checkpoints_dir, exist_ok=True) + + overwrite = request.form.get('overwrite') == 'true' + created_count = 0 + skipped_count = 0 + overwritten_count = 0 + + system_prompt = load_prompt('checkpoint_system.txt') + if not system_prompt: + flash('Checkpoint system prompt file not found.', 'error') + return redirect(url_for('checkpoints_index')) + + dirs = [ + (app.config.get('ILLUSTRIOUS_MODELS_DIR', ''), 'Illustrious'), + (app.config.get('NOOB_MODELS_DIR', ''), 'Noob'), + ] + + for dirpath, family in dirs: + if not dirpath or not os.path.exists(dirpath): + continue + + for filename in sorted(os.listdir(dirpath)): + if not (filename.endswith('.safetensors') or filename.endswith('.ckpt')): + continue + + checkpoint_path = f"{family}/{filename}" + name_base = filename.rsplit('.', 1)[0] + safe_id = re.sub(r'[^a-zA-Z0-9_]', '_', checkpoint_path.rsplit('.', 1)[0]).lower().strip('_') + json_filename = f"{safe_id}.json" + json_path = os.path.join(checkpoints_dir, json_filename) + + is_existing = os.path.exists(json_path) + if is_existing and not overwrite: + skipped_count += 1 + continue + + # Look for a matching HTML file alongside the model file + html_path = os.path.join(dirpath, f"{name_base}.html") + html_content = "" + if os.path.exists(html_path): + try: + with open(html_path, 'r', encoding='utf-8', errors='ignore') as hf: + html_raw = hf.read() + clean_html = re.sub(r']*>.*?', '', html_raw, flags=re.DOTALL) + clean_html = re.sub(r']*>.*?', '', clean_html, flags=re.DOTALL) + clean_html = re.sub(r']*>', '', clean_html) + clean_html = re.sub(r'<[^>]+>', ' ', clean_html) + html_content = ' '.join(clean_html.split()) + except Exception as e: + print(f"Error reading HTML for {filename}: {e}") + + defaults = _default_checkpoint_data(checkpoint_path, filename) + + if html_content: + try: + print(f"Asking LLM to describe checkpoint: {filename}") + prompt = ( + f"Generate checkpoint metadata JSON for the model file: '{filename}' " + f"(checkpoint_path: '{checkpoint_path}').\n\n" + f"Here is descriptive text extracted from an associated HTML file:\n###\n{html_content[:3000]}\n###" + ) + llm_response = call_llm(prompt, system_prompt) + clean_json = llm_response.replace('```json', '').replace('```', '').strip() + ckpt_data = json.loads(clean_json) + # Enforce fixed fields + ckpt_data['checkpoint_path'] = checkpoint_path + ckpt_data['checkpoint_name'] = filename + # Fill missing fields with defaults + for key, val in defaults.items(): + if key not in ckpt_data or ckpt_data[key] is None: + ckpt_data[key] = val + time.sleep(0.5) + except Exception as e: + print(f"LLM error for {filename}: {e}. Using defaults.") + ckpt_data = defaults + else: + ckpt_data = defaults + + try: + with open(json_path, 'w') as f: + json.dump(ckpt_data, f, indent=2) + if is_existing: + overwritten_count += 1 + else: + created_count += 1 + except Exception as e: + print(f"Error saving JSON for {filename}: {e}") + + if created_count > 0 or overwritten_count > 0: + sync_checkpoints() + msg = f'Successfully processed checkpoints: {created_count} created, {overwritten_count} overwritten.' + if skipped_count > 0: + msg += f' (Skipped {skipped_count} existing)' + flash(msg) + else: + flash(f'No checkpoints created or overwritten. {skipped_count} existing entries found.') + + return redirect(url_for('checkpoints_index')) + +# --------------------------------------------------------------------------- +# Gallery +# --------------------------------------------------------------------------- + +GALLERY_CATEGORIES = ['characters', 'actions', 'outfits', 'scenes', 'styles', 'detailers'] + +_MODEL_MAP = { + 'characters': Character, + 'actions': Action, + 'outfits': Outfit, + 'scenes': Scene, + 'styles': Style, + 'detailers': Detailer, +} + + +def _scan_gallery_images(category_filter='all', slug_filter=''): + """Return sorted list of image dicts from the uploads directory.""" + upload_folder = app.config['UPLOAD_FOLDER'] + images = [] + cats = GALLERY_CATEGORIES if category_filter == 'all' else [category_filter] + + for cat in cats: + cat_folder = os.path.join(upload_folder, cat) + if not os.path.isdir(cat_folder): + continue + try: + slugs = os.listdir(cat_folder) + except OSError: + continue + for item_slug in slugs: + if slug_filter and slug_filter != item_slug: + continue + item_folder = os.path.join(cat_folder, item_slug) + if not os.path.isdir(item_folder): + continue + try: + files = os.listdir(item_folder) + except OSError: + continue + for filename in files: + if not filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp')): + continue + try: + ts = int(filename.replace('gen_', '').rsplit('.', 1)[0]) + except ValueError: + ts = 0 + images.append({ + 'path': f"{cat}/{item_slug}/{filename}", + 'category': cat, + 'slug': item_slug, + 'filename': filename, + 'timestamp': ts, + }) + + images.sort(key=lambda x: x['timestamp'], reverse=True) + return images + + +def _enrich_with_names(images): + """Add item_name field to each image dict, querying DB once per category.""" + by_cat = {} + for img in images: + by_cat.setdefault(img['category'], set()).add(img['slug']) + + name_map = {} + for cat, slugs in by_cat.items(): + Model = _MODEL_MAP.get(cat) + if not Model: + continue + items = Model.query.filter(Model.slug.in_(slugs)).with_entities(Model.slug, Model.name).all() + for slug, name in items: + name_map[(cat, slug)] = name + + for img in images: + img['item_name'] = name_map.get((img['category'], img['slug']), img['slug']) + return images + + +@app.route('/gallery') +def gallery(): + category = request.args.get('category', 'all') + slug = request.args.get('slug', '') + sort = request.args.get('sort', 'newest') + page = max(1, int(request.args.get('page', 1))) + per_page = int(request.args.get('per_page', 48)) + per_page = per_page if per_page in (24, 48, 96) else 48 + + images = _scan_gallery_images(category, slug) + + if sort == 'oldest': + images.reverse() + + total = len(images) + total_pages = max(1, (total + per_page - 1) // per_page) + page = min(page, total_pages) + page_images = images[(page - 1) * per_page: page * per_page] + _enrich_with_names(page_images) + + slug_options = [] + if category != 'all': + Model = _MODEL_MAP.get(category) + if Model: + slug_options = [(r.slug, r.name) for r in Model.query.order_by(Model.name).with_entities(Model.slug, Model.name).all()] + + return render_template( + 'gallery.html', + images=page_images, + page=page, + per_page=per_page, + total=total, + total_pages=total_pages, + category=category, + slug=slug, + sort=sort, + categories=GALLERY_CATEGORIES, + slug_options=slug_options, + ) + + +def _parse_comfy_png_metadata(image_path): + """Read ComfyUI generation metadata from a PNG's tEXt 'prompt' chunk. + + Returns a dict with keys: positive, negative, checkpoint, loras, + seed, steps, cfg, sampler, scheduler. Any missing field is None/[]. + """ + from PIL import Image as PilImage + + result = { + 'positive': None, + 'negative': None, + 'checkpoint': None, + 'loras': [], # list of {name, strength} + 'seed': None, + 'steps': None, + 'cfg': None, + 'sampler': None, + 'scheduler': None, + } + + try: + with PilImage.open(image_path) as im: + raw = im.info.get('prompt') + if not raw: + return result + nodes = json.loads(raw) + except Exception: + return result + + for node in nodes.values(): + ct = node.get('class_type', '') + inp = node.get('inputs', {}) + + if ct == 'KSampler': + result['seed'] = inp.get('seed') + result['steps'] = inp.get('steps') + result['cfg'] = inp.get('cfg') + result['sampler'] = inp.get('sampler_name') + result['scheduler'] = inp.get('scheduler') + + elif ct == 'CheckpointLoaderSimple': + result['checkpoint'] = inp.get('ckpt_name') + + elif ct == 'CLIPTextEncode': + # Identify positive vs negative by which KSampler input they connect to. + # Simpler heuristic: node "6" = positive, node "7" = negative (our fixed workflow). + # But to be robust, we check both via node graph references where possible. + # Fallback: first CLIPTextEncode = positive, second = negative. + text = inp.get('text', '') + if result['positive'] is None: + result['positive'] = text + elif result['negative'] is None: + result['negative'] = text + + elif ct == 'LoraLoader': + name = inp.get('lora_name', '') + if name: + result['loras'].append({ + 'name': name, + 'strength': inp.get('strength_model', 1.0), + }) + + # Re-parse with fixed node IDs from the known workflow (more reliable) + try: + if '6' in nodes: + result['positive'] = nodes['6']['inputs'].get('text', result['positive']) + if '7' in nodes: + result['negative'] = nodes['7']['inputs'].get('text', result['negative']) + except Exception: + pass + + return result + + +@app.route('/gallery/prompt-data') +def gallery_prompt_data(): + """Return generation metadata for a specific image by reading its PNG tEXt chunk.""" + img_path = request.args.get('path', '') + if not img_path: + return {'error': 'path parameter required'}, 400 + + # Validate path stays within uploads folder + upload_folder = os.path.abspath(app.config['UPLOAD_FOLDER']) + abs_img = os.path.abspath(os.path.join(upload_folder, img_path)) + if not abs_img.startswith(upload_folder + os.sep): + return {'error': 'Invalid path'}, 400 + if not os.path.isfile(abs_img): + return {'error': 'File not found'}, 404 + + meta = _parse_comfy_png_metadata(abs_img) + meta['path'] = img_path + return meta + + if __name__ == '__main__': with app.app_context(): os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) @@ -4046,10 +5094,46 @@ if __name__ == '__main__': print("default_fields column already exists in action table") else: print(f"Migration action note: {e}") + + # Migration: Add new columns to settings table + columns_to_add = [ + ('llm_provider', "VARCHAR(50) DEFAULT 'openrouter'"), + ('local_base_url', "VARCHAR(255)"), + ('local_model', "VARCHAR(100)") + ] + for col_name, col_type in columns_to_add: + try: + db.session.execute(text(f'ALTER TABLE settings ADD COLUMN {col_name} {col_type}')) + db.session.commit() + print(f"Added {col_name} column to settings table") + except Exception as e: + if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower(): + pass + else: + print(f"Migration settings note ({col_name}): {e}") + + # Ensure settings exist + if not Settings.query.first(): + db.session.add(Settings()) + db.session.commit() + print("Created default settings") sync_characters() sync_outfits() sync_actions() + # Migration: Add data column to checkpoint table + try: + db.session.execute(text('ALTER TABLE checkpoint ADD COLUMN data JSON')) + db.session.commit() + print("Added data column to checkpoint table") + except Exception as e: + if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower(): + print("data column already exists in checkpoint table") + else: + print(f"Migration checkpoint note: {e}") + sync_styles() sync_detailers() - app.run(debug=True, port=5000) + sync_scenes() + sync_checkpoints() + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/data/actions/3p_sex_000037.json b/data/actions/3p_sex_000037.json index 4866fbd..ea5bd3b 100644 --- a/data/actions/3p_sex_000037.json +++ b/data/actions/3p_sex_000037.json @@ -2,32 +2,29 @@ "action_id": "3p_sex_000037", "action_name": "3P Sex 000037", "action": { - "full_body": "group sex, threesome, 3 subjects, intertwined bodies, on bed", - "head": "pleasured expression, heavy breathing, blush, sweating, tongue out, saliva", - "eyes": "half-closed eyes, rolling back, heart pupils, looking at partner", - "arms": "wrapping around partners, arm locking, grabbing shoulders", - "hands": "groping, fondling, gripping hair, fingers digging into skin", - "torso": "arching back, bare skin, sweat drops, pressing chests together", - "pelvis": "connected, hips grinding, penetration", - "legs": "spread legs, legs in air, wrapped around waist, kneeling", - "feet": "toes curled, arched feet", - "additional": "sex act, bodily fluids, cum, motion blur, intimacy, nsfw" - }, - "participants": { - "solo_focus": "false", - "orientation": "MfF" + "full_body": "threesome", + "head": "blush", + "eyes": "half-closed_eyes", + "arms": "reaching", + "hands": "groping", + "torso": "nude", + "pelvis": "sex", + "legs": "spread_legs", + "feet": "toes_curled", + "additional": "sweat" }, "lora": { "lora_name": "Illustrious/Poses/3P_SEX-000037.safetensors", - "lora_weight": 1.0, - "lora_triggers": "3P_SEX-000037" + "lora_weight": 0.8, + "lora_triggers": "threesome, group_sex" }, "tags": [ - "group sex", "threesome", - "3p", - "nsfw", - "sexual intercourse", - "pleasure" + "group_sex", + "nude", + "sex", + "blush", + "groping", + "sweat" ] } \ No newline at end of file diff --git a/data/actions/4p_sex.json b/data/actions/4p_sex.json index 848d5ce..c5d8a28 100644 --- a/data/actions/4p_sex.json +++ b/data/actions/4p_sex.json @@ -2,34 +2,32 @@ "action_id": "4p_sex", "action_name": "4P Sex", "action": { - "full_body": "complex group composition involving four subjects in close physical contact, bodies intertwined or overlapping in a cluster", - "head": "heads positioned close together, looking at each other or facing different directions, varied expressions", - "eyes": "open or half-closed, gazing at other subjects", - "arms": "arms reaching out, holding, or embracing other subjects in the group, creating a web of limbs", - "hands": "hands placed on others' bodies, grasping or touching", - "torso": "torsos leaning into each other, pressed together or arranged in a pile", - "pelvis": "pelvises positioned in close proximity, aligned with group arrangement", - "legs": "legs entangled, kneeling, lying down, or wrapped around others", - "feet": "feet resting on the ground or tucked in", - "additional": "high density composition, multiple angles of interaction, tangled arrangement of bodies" - }, - "participants": { - "solo_focus": "false", - "orientation": "MFFF" + "full_body": "Choreographed foursome group sex scene involving four participants (e.g., 1 girl and 3 boys or 3 girls and 1 boy) engaged in simultaneous sexual acts like double penetration or cooperative fellatio.", + "head": "Moaning expression, open mouth, potentially heavily breathing or performing fellatio.", + "eyes": "Heart-shaped pupils, ahegao, or rolling back in pleasure.", + "arms": "Bracing on the surface (all fours), holding onto partners, or grabbing sheets.", + "hands": "Grabbing breasts, holding legs, fingering, or resting on knees/shoulders.", + "torso": "Nude, arching back, breasts exposed and pressed or being touched.", + "pelvis": "Engaged in intercourse, involving vaginal or anal penetration, potentially double penetration.", + "legs": "Spread wide, positioned in all fours, missionary, or reverse cowgirl depending on specific interaction.", + "feet": "Toes curled, dynamic positioning based on stance (kneeling or lying).", + "additional": "Sexual fluids, messy after-sex atmosphere, sweat, steaming body." }, "lora": { "lora_name": "Illustrious/Poses/4P_sex.safetensors", - "lora_weight": 1.0, - "lora_triggers": "4P_sex" + "lora_weight": 0.6, + "lora_triggers": "4P_sexV1" }, "tags": [ - "4girls", - "group", - "tangled", - "multiple_viewers", - "all_fours", - "entangled_legs", - "close_contact", - "crowded" + "4P_sexV1", + "group sex", + "foursome", + "4P", + "double penetration", + "fellatio", + "all fours", + "uncensored", + "hetero", + "sex" ] } \ No newline at end of file diff --git a/data/actions/after_sex_fellatio_illustriousxl_lora_nochekaiser_r1.json b/data/actions/after_sex_fellatio_illustriousxl_lora_nochekaiser_r1.json index 39213c4..1ee6963 100644 --- a/data/actions/after_sex_fellatio_illustriousxl_lora_nochekaiser_r1.json +++ b/data/actions/after_sex_fellatio_illustriousxl_lora_nochekaiser_r1.json @@ -2,36 +2,36 @@ "action_id": "after_sex_fellatio_illustriousxl_lora_nochekaiser_r1", "action_name": "After Sex Fellatio Illustriousxl Lora Nochekaiser R1", "action": { - "full_body": "kneeling on the floor in a submissive posture (seiza) or sitting back on heels", - "head": "tilted upwards slightly, heavy blush on cheeks, messy hair, mouth held open", - "eyes": "half-closed, looking up at viewer, glazed expression, maybe heart-shaped pupils", - "arms": "resting slightly limp at sides or hands placed on thighs", - "hands": "resting on thighs or one hand wiping corner of mouth", - "torso": "leaning slightly forward, relaxed posture implying exhaustion", - "pelvis": "hips resting on heels", - "legs": "bent at knees, kneeling", - "feet": "tucked under buttocks", - "additional": "cum on face, cum on mouth, semen, saliva trail, drooling, tongue stuck out, heavy breathing, sweat, after sex atmosphere" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "completely_nude, lying, on_back, m_legs, spread_legs", + "head": "looking_at_viewer, tongue, open_mouth, blush, messing_hair", + "eyes": "half-closed_eyes, blue_eyes", + "arms": "arms_at_sides, on_bed", + "hands": "on_bed, pressing_bed", + "torso": "large_breasts, nipples, sweat", + "pelvis": "pussy, cum_in_pussy, leaking_cum", + "legs": "m_legs, spread_legs, legs_up", + "feet": "barefoot, toes", + "additional": "after_sex, after_vaginal, fellatio, penis, cum, cumdrip, messy_body, bed_sheet" }, "lora": { "lora_name": "Illustrious/Poses/after-sex-fellatio-illustriousxl-lora-nochekaiser_r1.safetensors", "lora_weight": 1.0, - "lora_triggers": "after-sex-fellatio-illustriousxl-lora-nochekaiser_r1" + "lora_triggers": "after sex fellatio" }, "tags": [ - "after fellatio", - "cum on face", - "messy face", - "saliva", - "tongue out", - "kneeling", - "looking up", - "blush", - "sweat", - "open mouth" + "after_sex", + "after_vaginal", + "fellatio", + "cum_in_pussy", + "m_legs", + "lying", + "on_back", + "on_bed", + "cumdrip", + "completely_nude", + "nipples", + "tongue", + "penis", + "cum" ] } \ No newline at end of file diff --git a/data/actions/afterfellatio_ill.json b/data/actions/afterfellatio_ill.json new file mode 100644 index 0000000..223936c --- /dev/null +++ b/data/actions/afterfellatio_ill.json @@ -0,0 +1,33 @@ +{ + "action_id": "afterfellatio_ill", + "action_name": "Afterfellatio Ill", + "action": { + "full_body": "kneeling, leaning_forward, pov", + "head": "looking_at_viewer, blush, tilted_head, cum_on_face", + "eyes": "half-closed_eyes, tears", + "arms": "arms_down, reaching_towards_viewer", + "hands": "handjob, touching_penis", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "barefoot", + "additional": "cum_string, cum_in_mouth, closed_mouth" + }, + "lora": { + "lora_name": "Illustrious/Poses/afterfellatio_ill.safetensors", + "lora_weight": 0.8, + "lora_triggers": "after fellatio, cum in mouth, closed mouth, cum string" + }, + "tags": [ + "after_fellatio", + "cum_in_mouth", + "cum_string", + "closed_mouth", + "blush", + "half-closed_eyes", + "looking_at_viewer", + "kneeling", + "pov", + "handjob" + ] +} \ No newline at end of file diff --git a/data/actions/afteroral.json b/data/actions/afteroral.json index a79d0a1..bea429e 100644 --- a/data/actions/afteroral.json +++ b/data/actions/afteroral.json @@ -2,33 +2,32 @@ "action_id": "afteroral", "action_name": "Afteroral", "action": { - "full_body": "", - "head": "cum in mouth, facial, blush, open mouth, tongue out, messy hair, sweat, panting", - "eyes": "half-closed eyes, glazed eyes, looking up, tears", - "arms": "", - "hands": "", - "torso": "", - "pelvis": "", - "legs": "", - "feet": "", - "additional": "saliva, saliva string, heavy breathing, after fellatio, bodily fluids" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "Character depicted immediately after performing oral sex, often focusing on the upper body and face.", + "head": "Messy hair, flushed cheeks, mouth slightly open or panting.", + "eyes": "Half-closed or dazed expression, potentially with runny mascara or makeup.", + "arms": "Relaxed or wiping mouth.", + "hands": "Resting or near face.", + "torso": "Heaving chest indicative of heavy breathing.", + "pelvis": "N/A (typically upper body focus)", + "legs": "N/A", + "feet": "N/A", + "additional": "Presence of bodily fluids like saliva trails or excessive cum on face and messy makeup." }, "lora": { "lora_name": "Illustrious/Poses/afteroral.safetensors", "lora_weight": 1.0, - "lora_triggers": "afteroral" + "lora_triggers": "after oral, after deepthroat" }, "tags": [ - "after oral", - "wiping mouth", - "saliva", - "kneeling", - "blush", - "messy", - "panting" + "after_fellatio", + "runny_makeup", + "smeared_lipstick", + "saliva_trail", + "excessive_cum", + "messy_hair", + "heavy_breathing", + "cum_bubble", + "penis_on_face", + "sweat" ] } \ No newline at end of file diff --git a/data/actions/aftersexbreakv2.json b/data/actions/aftersexbreakv2.json index 2b5919a..cdfa405 100644 --- a/data/actions/aftersexbreakv2.json +++ b/data/actions/aftersexbreakv2.json @@ -2,36 +2,40 @@ "action_id": "aftersexbreakv2", "action_name": "Aftersexbreakv2", "action": { - "full_body": "lying in bed, exhausted", - "head": "messy hair, flushed face, sweating, panting", - "eyes": "half-closed eyes, ", - "arms": "", - "hands": "", - "torso": "sweaty skin, glistening skin, heavy breathing,", - "pelvis": "cum drip", - "legs": "legs spread", - "feet": "", - "additional": "ripped clothing, panties aside, rumpled bed sheets, messy bed, dim lighting, intimate atmosphere, exhausted" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "lying, on_back, on_bed, bowlegged_pose, spread_legs, twisted_torso", + "head": "messy_hair, head_back, sweaty_face", + "eyes": "rolling_eyes, half-closed_eyes, ahegao", + "arms": "arms_spread, arms_above_head", + "hands": "relaxed_hands", + "torso": "sweat, nipples, collarbone, heavy_breathing", + "pelvis": "hips, navel, female_pubic_hair", + "legs": "spread_legs, legs_up, bent_legs", + "feet": "barefoot", + "additional": "condom_wrapper, used_tissue, stained_sheets, cum_pool, bead_of_sweat" }, "lora": { "lora_name": "Illustrious/Poses/AfterSexBreakV2.safetensors", "lora_weight": 1.0, - "lora_triggers": "AfterSexBreakV2" + "lora_triggers": "aftersexbreak, after sex, male sitting" }, "tags": [ - "after sex", - "post-coital", - "lying in bed", - "messy hair", - "sweaty skin", - "covered by sheet", - "bedroom eyes", - "exhausted", - "intimate", - "rumpled sheets" + "after_sex", + "lying", + "on_back", + "on_bed", + "fucked_silly", + "spread_legs", + "bowlegged_pose", + "sweat", + "blush", + "messy_hair", + "heavy_breathing", + "rolling_eyes", + "ahegao", + "cum_pool", + "condom_wrapper", + "used_tissue", + "bed_sheet", + "stained_sheets" ] } \ No newline at end of file diff --git a/data/actions/amateur_pov_filming.json b/data/actions/amateur_pov_filming.json index 6dc2bfa..03c0f40 100644 --- a/data/actions/amateur_pov_filming.json +++ b/data/actions/amateur_pov_filming.json @@ -2,33 +2,32 @@ "action_id": "amateur_pov_filming", "action_name": "Amateur Pov Filming", "action": { - "full_body": "POV shot, subject positioned close to the lens, selfie composition or handheld camera style", - "head": "facing the camera directly, slightly tilted or chin tucked, candid expression", - "eyes": "looking directly at viewer, intense eye contact", - "arms": "one or both arms raised towards the viewer holding the capturing device", - "hands": "holding smartphone, clutching camera, fingers visible on device edges", - "torso": "upper body visible, facing forward, close proximity", - "pelvis": "obscured or out of frame", - "legs": "out of frame", - "feet": "out of frame", - "additional": "phone screen, camera interface, amateur footage quality, blurry background, indoor lighting, candid atmosphere" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "selfie pose, standing or sitting, facing viewer or mirror", + "head": "looking_at_viewer, blush, maybe open mouth or shy expression", + "eyes": "looking_at_viewer, contact with camera", + "arms": "raised to hold phone or camera", + "hands": "holding_phone, holding_id_card, or adjusting clothes", + "torso": "upper body in frame, breasts, nipples", + "pelvis": "hips visible if full body mirror selfie", + "legs": "standing or sitting", + "feet": "barefoot if visible", + "additional": "phone recording interface, smartphone, mirror, amateur aesthetic" }, "lora": { "lora_name": "Illustrious/Poses/Amateur_POV_Filming.safetensors", "lora_weight": 1.0, - "lora_triggers": "Amateur_POV_Filming" + "lora_triggers": "Homemade_PornV1, recording, pov, prostitution" }, "tags": [ + "recording", "pov", "selfie", - "holding phone", - "amateur", - "candid", - "recording", - "close-up" + "holding_phone", + "smartphone", + "mirror_selfie", + "holding_id_card", + "looking_at_viewer", + "prostitution", + "indoors" ] } \ No newline at end of file diff --git a/data/actions/arch_back_sex_v1_1_illustriousxl.json b/data/actions/arch_back_sex_v1_1_illustriousxl.json index 10627c3..1a2ac2e 100644 --- a/data/actions/arch_back_sex_v1_1_illustriousxl.json +++ b/data/actions/arch_back_sex_v1_1_illustriousxl.json @@ -2,35 +2,28 @@ "action_id": "arch_back_sex_v1_1_illustriousxl", "action_name": "Arch Back Sex V1 1 Illustriousxl", "action": { - "full_body": "character positioned with an exaggerated spinal curve, emphasizing the posterior", - "head": "thrown back in pleasure or looking back over the shoulder", - "eyes": "half-closed, rolled back, or heavily blushing", - "arms": "supporting body weight on elbows or hands, or reaching forward", - "hands": "gripping bedsheets or pressing firmly against the surface", - "torso": "extremely arched back, chest pressed down or lifted depending on angle", - "pelvis": "tilted upwards, hips raised high", - "legs": "kneeling or lying prone with knees bent", - "feet": "toes curled or extending upwards", - "additional": "sweat, blush, heavy breathing indication" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "doggystyle, sex_from_behind, all_fours", + "head": "head_back, looking_back", + "eyes": "closed_eyes, blush", + "arms": "arms_support", + "hands": "grabbing_another's_ass", + "torso": "arched_back", + "pelvis": "lifted_hip", + "legs": "kneeling, spread_legs", + "feet": "toes", + "additional": "kiss, sweat, saliva, intense_pleasure" }, "lora": { "lora_name": "Illustrious/Poses/arch-back-sex-v1.1-illustriousxl.safetensors", "lora_weight": 1.0, - "lora_triggers": "arch-back-sex-v1.1-illustriousxl" + "lora_triggers": "kiss, arched_back, sex_from_behind" }, "tags": [ - "arch back", - "arched back", - "hips up", - "curved spine", - "ass focus", - "hyper-extension", - "prone", - "kneeling", - "from behind" + "hetero", + "sex", + "vaginal", + "penis", + "nude", + "indoors" ] } \ No newline at end of file diff --git a/data/actions/arm_grab_missionary_ill_10.json b/data/actions/arm_grab_missionary_ill_10.json index 989940b..ec58485 100644 --- a/data/actions/arm_grab_missionary_ill_10.json +++ b/data/actions/arm_grab_missionary_ill_10.json @@ -2,35 +2,37 @@ "action_id": "arm_grab_missionary_ill_10", "action_name": "Arm Grab Missionary Ill 10", "action": { - "full_body": "lying on back, missionary position, submissive posture", - "head": "head tilted back, blushing, heavy breathing", - "eyes": "looking at viewer, half-closed eyes, rolling eyes", - "arms": "arms raised above head, arms grabbed, wrists held, armpits exposed", - "hands": "hands pinned, helpless", - "torso": "arched back, chest exposed", - "pelvis": "exposed crotch", - "legs": "spread legs, knees bent upwards, m-legs", - "feet": "toes curled", - "additional": "on bed, bed sheet, pov, submission, restraint" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "missionary, lying, on_back, sex, vaginal", + "head": "expressive face, open mouth, one_eye_closed, blushing", + "eyes": "looking_at_viewer (optional), dilated_pupils", + "arms": "arms_up, pinned, restrained, grabbed_wrists", + "hands": "interlocked_fingers, holding_hands", + "torso": "breasts, nipples, medium_breasts", + "pelvis": "legs_spread, lifted_pelvis", + "legs": "spread_legs, legs_up, knees_up, straddling (if applicable)", + "feet": "barefoot (implied)", + "additional": "faceless_male, male_focus, motion_lines, sweat" }, "lora": { "lora_name": "Illustrious/Poses/arm_grab_missionary_ill-10.safetensors", "lora_weight": 1.0, - "lora_triggers": "arm_grab_missionary_ill-10" + "lora_triggers": "arm_grab_missionary" }, "tags": [ - "arm grab", "missionary", - "lying on back", - "arms above head", - "wrists held", - "legs spread", - "armpits", - "submission", - "pov" + "spread_legs", + "interlocked_fingers", + "holding_hands", + "arms_up", + "pinned", + "lying", + "on_back", + "sex", + "vaginal", + "faceless_male", + "one_eye_closed", + "open_mouth", + "breasts", + "nipples" ] } \ No newline at end of file diff --git a/data/actions/ballsdeep_il_v2_2_s.json b/data/actions/ballsdeep_il_v2_2_s.json index cc0b4a4..b8ac2bd 100644 --- a/data/actions/ballsdeep_il_v2_2_s.json +++ b/data/actions/ballsdeep_il_v2_2_s.json @@ -2,33 +2,29 @@ "action_id": "ballsdeep_il_v2_2_s", "action_name": "Ballsdeep Il V2 2 S", "action": { - "full_body": "intense sexual intercourse, intimate close-up on genital connection, visceral physical interaction", - "head": "flushed face, expression of intense pleasure, head thrown back, mouth slightly open, panting", - "eyes": "eyes rolling back, ahegao or tightly closed eyes, heavy breathing", - "arms": "muscular arms tensed, holding partner's hips firmly, veins visible", - "hands": "hands gripping waist or buttocks, fingers digging into skin, pulling partner closer", - "torso": "sweaty skin, arched back, abdominal muscles engaged", - "pelvis": "hips slammed forward, testicles pressed firmly against partner's skin, complete insertion", - "legs": "thighs interlocking, kneeling or legs wrapped around partner's waist", - "feet": "toes curled tightly", - "additional": "sex, vaginal, balls deep, motion blur on hips, bodily fluids, skin indentation, anatomical focus" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sexual intercourse, variable position (prone, girl on top, or from behind)", + "head": "expression of intensity or pleasure, often looking back or face down", + "eyes": "rolled back or squeezed shut", + "arms": "grasping sheets or holding partner", + "hands": "clenched or grabbing", + "torso": "arched or pressed against contrasting surface", + "pelvis": "hips pushed firmly against partner's hips, joined genitals", + "legs": "spread wide or wrapped around partner", + "feet": "toes curled", + "additional": "deep penetration, testicles pressed flat against skin, stomach bulge visible" }, "lora": { "lora_name": "Illustrious/Poses/BallsDeep-IL-V2.2-S.safetensors", "lora_weight": 1.0, - "lora_triggers": "BallsDeep-IL-V2.2-S" + "lora_triggers": "deep penetration" }, "tags": [ - "nsfw", + "deep_penetration", + "testicles", + "stomach_bulge", "sex", + "anal", "vaginal", - "internal view", - "cross-section", - "deep penetration", - "mating press" + "gaping" ] } \ No newline at end of file diff --git a/data/actions/bathingtogether.json b/data/actions/bathingtogether.json index 62718fe..cfe8cd8 100644 --- a/data/actions/bathingtogether.json +++ b/data/actions/bathingtogether.json @@ -2,33 +2,30 @@ "action_id": "bathingtogether", "action_name": "Bathingtogether", "action": { - "full_body": "two characters sharing a bathtub, sitting close together in water", - "head": "wet hair, flushed cheeks, relaxed expressions, looking at each other", - "eyes": "gentle gaze, half-closed", - "arms": "resting on the tub rim, washing each other, or embracing", - "hands": "holding soap, sponge, or touching skin", - "torso": "wet skin, water droplets, partially submerged, steam rising", - "pelvis": "submerged in soapy water", - "legs": "knees bent, submerged, intertwined", - "feet": "underwater", - "additional": "bathroom tiles, steam clouds, soap bubbles, rubber duck, faucet" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "bathing, sitting, partially_submerged", + "head": "looking_at_viewer, facing_viewer", + "eyes": "eye_contact", + "arms": "arms_resting", + "hands": "resting", + "torso": "bare_shoulders", + "pelvis": "submerged", + "legs": "knees_up, submerged", + "feet": "no_shoes", + "additional": "bathtub, steam, water, bubbles, wet" }, "lora": { "lora_name": "Illustrious/Poses/bathingtogether.safetensors", "lora_weight": 1.0, - "lora_triggers": "bathingtogether" + "lora_triggers": "bathing together" }, "tags": [ "bathing", - "couple", + "bathtub", + "partially_submerged", + "pov", + "looking_at_viewer", "wet", "steam", - "bathtub", - "shared bath", - "soap bubbles" + "bare_shoulders" ] } \ No newline at end of file diff --git a/data/actions/before_after_1230829.json b/data/actions/before_after_1230829.json index 2c6016e..68aec5a 100644 --- a/data/actions/before_after_1230829.json +++ b/data/actions/before_after_1230829.json @@ -2,32 +2,32 @@ "action_id": "before_after_1230829", "action_name": "Before After 1230829", "action": { - "full_body": "split view composition, side-by-side comparison, two panels showing the same character", - "head": "varying expressions, sad vs happy, neutral vs excited", - "eyes": "looking at viewer, varying intensity", - "arms": "neutral pose vs confident pose", - "hands": "hanging loosely vs gesturing", - "torso": "visible change in clothing or physique", - "pelvis": "standing or sitting", - "legs": "standing or sitting", - "feet": "neutral stance", - "additional": "transformation, makeover, dividing line, progression, evolution" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "2koma, before_and_after", + "head": "heavy_breathing, orgasm, sticky_face", + "eyes": "eyes_closed", + "arms": "variation", + "hands": "variation", + "torso": "upper_body", + "pelvis": "variation", + "legs": "variation", + "feet": "variation", + "additional": "facial, bukkake, cum, cum_on_face" }, "lora": { "lora_name": "Illustrious/Poses/before_after_1230829.safetensors", - "lora_weight": 1.0, - "lora_triggers": "before_after_1230829" + "lora_weight": 0.9, + "lora_triggers": "before_after" }, "tags": [ - "split view", - "comparison", - "transformation", - "before and after", - "multiple views", - "concept art" + "before_and_after", + "2koma", + "facial", + "bukkake", + "cum", + "cum_on_face", + "orgasm", + "heavy_breathing", + "upper_body", + "split_theme" ] } \ No newline at end of file diff --git a/data/actions/bentback.json b/data/actions/bentback.json index dd76007..69a9a2f 100644 --- a/data/actions/bentback.json +++ b/data/actions/bentback.json @@ -2,33 +2,28 @@ "action_id": "bentback", "action_name": "Bentback", "action": { - "full_body": "standing, upper body bent forward at the waist, torso parallel to the ground", - "head": "turned to look back, looking over shoulder, chin raised", - "eyes": "looking at viewer, focused gaze", - "arms": "arms extended downward or resting on legs", - "hands": "hands on knees, hands on thighs", - "torso": "back arched, spinal curve emphasized, bent forward", - "pelvis": "hips pushed back, buttocks protruding", - "legs": "straight legs, locked knees or slight bend", - "feet": "feet shoulder-width apart, waiting", - "additional": "view from behind, dorsal view, dynamic posture" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "bent_over, leaning_forward, from_behind", + "head": "looking_at_viewer, looking_back", + "eyes": "open_eyes", + "arms": "arms_at_sides", + "hands": "hands_on_legs", + "torso": "twisted_torso, arched_back", + "pelvis": "ass_focus", + "legs": "kneepits", + "feet": "barefoot", + "additional": "unnatural_body" }, "lora": { "lora_name": "Illustrious/Poses/BentBack.safetensors", "lora_weight": 1.0, - "lora_triggers": "BentBack" + "lora_triggers": "bentback, kneepits" }, "tags": [ - "bent over", - "standing", - "hands on knees", - "looking back", - "from behind", - "arched back", - "torso bend" + "bent_over", + "from_behind", + "looking_back", + "kneepits", + "twisted_torso", + "ass_focus" ] } \ No newline at end of file diff --git a/data/actions/blowjobcomicpart2.json b/data/actions/blowjobcomicpart2.json index 5f59cdd..66ca8bf 100644 --- a/data/actions/blowjobcomicpart2.json +++ b/data/actions/blowjobcomicpart2.json @@ -2,34 +2,31 @@ "action_id": "blowjobcomicpart2", "action_name": "Blowjobcomicpart2", "action": { - "full_body": "kneeling in front of standing partner, intimate interaction, oral sex pose", - "head": "tilted up, mouth open, cheek bulge, blushing, messy face", - "eyes": "rolled back, heart-shaped pupils, crossed eyes, or looking up", - "arms": "reaching forward, holding partner's legs or hips", - "hands": "stroking, gripping thighs, holding shaft, guiding", - "torso": "leaning forward, subordinate posture", - "pelvis": "kneeling on ground", - "legs": "bent at knees, shins on floor", - "feet": "tucked under or toes curled", - "additional": "saliva, slobber, motion lines, speech bubbles, sound effects, comic panel structure, greyscale or screentones" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "3koma, comic layout, vertical panel sequence", + "head": "tongue_out, open mouth, saliva", + "eyes": "empty_eyes, rolled eyes", + "arms": "arms_down or holding_head", + "hands": "fingers_on_penis", + "torso": "visible torso", + "pelvis": "sexual_activity", + "legs": "kneeling or sitting", + "feet": "out_of_frame", + "additional": "fellatio, irrumatio, licking_penis, ejaculation, excessive_cum" }, "lora": { "lora_name": "Illustrious/Poses/BlowjobComicPart2.safetensors", "lora_weight": 1.0, - "lora_triggers": "BlowjobComicPart2" + "lora_triggers": "bjmcut" }, "tags": [ - "nsfw", - "fellatio", - "oral sex", - "kneeling", + "3koma", "comic", - "monochrome", - "saliva", - "ahegao" + "fellatio", + "irrumatio", + "licking_penis", + "ejaculation", + "excessive_cum", + "empty_eyes", + "tongue_out" ] } \ No newline at end of file diff --git a/data/actions/bodybengirl.json b/data/actions/bodybengirl.json index 01dfec6..b14bf12 100644 --- a/data/actions/bodybengirl.json +++ b/data/actions/bodybengirl.json @@ -2,32 +2,29 @@ "action_id": "bodybengirl", "action_name": "Bodybengirl", "action": { - "full_body": "character standing and bending forward at the waist, hips raised high", - "head": "looking back at viewer or head inverted", - "eyes": "looking at viewer", - "arms": "extended downwards towards the ground", - "hands": "touching toes, ankles, or palms flat on the floor", - "torso": "upper body folded down parallel to or against the legs", - "pelvis": "lifted upwards, prominent posterior view", - "legs": "straight or knees slightly locked, shoulder-width apart", - "feet": "planted firmly on the ground", - "additional": "often viewed from behind or the side to emphasize flexibility and curve" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "suspended_congress, lifting_person, standing", + "head": "", + "eyes": "", + "arms": "reaching", + "hands": "", + "torso": "torso_grab, bent_over", + "pelvis": "", + "legs": "legs_hanging", + "feet": "", + "additional": "1boy, 1girl, suspended" }, "lora": { "lora_name": "Illustrious/Poses/BodyBenGirl.safetensors", "lora_weight": 1.0, - "lora_triggers": "BodyBenGirl" + "lora_triggers": "bentstand-front, bentstand-behind" }, "tags": [ - "bending over", - "touching toes", - "from behind", - "flexibility", + "suspended_congress", + "torso_grab", + "bent_over", + "reaching", "standing", - "jack-o' pose" + "1boy", + "1girl" ] } \ No newline at end of file diff --git a/data/actions/bodybengirlpart2.json b/data/actions/bodybengirlpart2.json index 43131a9..5ffb58c 100644 --- a/data/actions/bodybengirlpart2.json +++ b/data/actions/bodybengirlpart2.json @@ -2,31 +2,30 @@ "action_id": "bodybengirlpart2", "action_name": "Bodybengirlpart2", "action": { - "full_body": "standing pose, bending forward at the waist while facing away from the camera", - "head": "turned backward looking over the shoulder", - "eyes": "looking directly at the viewer", - "arms": "extended downwards or resting on upper thighs", - "hands": "placed on knees or hanging freely", - "torso": "bent forward at a 90-degree angle, lower back arched", - "pelvis": "pushed back and tilted upwards", - "legs": "straight or slightly unlocked at the knees", - "feet": "standing firmly on the ground", - "additional": "view from behind, emphasizing hip curvature and flexibility" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "body suspended in mid-air, held by torso, bent over forward", + "head": "embarrassed, sweating, scared", + "eyes": "open, looking away or down", + "arms": "arms hanging down, limp arms, arms at sides", + "hands": "hands open, limp", + "torso": "torso grab, bent forward", + "pelvis": "hips raised if bent over", + "legs": "legs dangling, knees together, feet apart", + "feet": "feet off ground, dangling", + "additional": "motion lines, sweat drops" }, "lora": { "lora_name": "Illustrious/Poses/BodyBenGirlPart2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "BodyBenGirlPart2" + "lora_weight": 0.9, + "lora_triggers": "bentstand-behind, dangling legs, dangling arms, from_side, arms hanging down, torso_grab, suspended" }, "tags": [ - "bent over", - "looking back", - "from behind", - "standing", - "flexible" + "torso_grab", + "suspension", + "bent_over", + "knees_together_feet_apart", + "arms_at_sides", + "motion_lines", + "embarrassed", + "sweat" ] } \ No newline at end of file diff --git a/data/actions/breast_pressh.json b/data/actions/breast_pressh.json index 2badf6f..d9a4926 100644 --- a/data/actions/breast_pressh.json +++ b/data/actions/breast_pressh.json @@ -2,33 +2,32 @@ "action_id": "breast_pressh", "action_name": "Breast Pressh", "action": { - "full_body": "character pressing breasts together with hands or arms to enhance cleavage", - "head": "slightly tilted forward, often with a flushed or embarrassed expression", - "eyes": "looking down at chest or shyly at viewer", - "arms": "bent at elbows, brought in front of the chest", - "hands": "placed on the sides or underneath breasts, actively squeezing or pushing them inward", - "torso": "upper body leaned slightly forward or arched back to emphasize the chest area", - "pelvis": "neutral standing or sitting position", - "legs": "standing straight or sitting with knees together", - "feet": "planted firmly on ground if standing", - "additional": "emphasis on soft body physics, squish deformation, and skin indentation around the fingers" - }, - "participants": { - "solo_focus": "false", - "orientation": "FF" + "full_body": "sandwiched, girl_sandwich, standing, height_difference, size_difference", + "head": "head_between_breasts, face_between_breasts, cheek_squash", + "eyes": "eyes_closed, squints", + "arms": "hugging, arms_around_waist", + "hands": "hands_on_back", + "torso": "breast_press, chest_to_chest", + "pelvis": "hips_touching", + "legs": "standing, legs_apart", + "feet": "barefoot", + "additional": "1boy, 2girls, multiple_girls, hetero" }, "lora": { "lora_name": "Illustrious/Poses/breast_pressH.safetensors", - "lora_weight": 1.0, + "lora_weight": 0.6, "lora_triggers": "breast_pressH" }, "tags": [ - "breast press", - "squeezing breasts", - "cleavage", - "hands on breasts", - "self groping", - "squish", - "upper body" + "height_difference", + "girl_sandwich", + "breast_press", + "sandwiched", + "size_difference", + "head_between_breasts", + "cheek_squash", + "face_between_breasts", + "1boy", + "2girls" ] } \ No newline at end of file diff --git a/data/actions/carwashv2.json b/data/actions/carwashv2.json index ca7f268..3f85bfc 100644 --- a/data/actions/carwashv2.json +++ b/data/actions/carwashv2.json @@ -2,36 +2,35 @@ "action_id": "carwashv2", "action_name": "Carwashv2", "action": { - "full_body": "leaning forward, bending over car hood, dynamic scrubbing pose, wet body", - "head": "looking at viewer, smiling, wet hair sticking to face", - "eyes": "open, energetic, happy", - "arms": "stretched forward, one arm scrubbing, active motion", - "hands": "holding large yellow sponge, covered in soap suds", - "torso": "bent at waist, leaning forward, arched back, wet clothes clinging", - "pelvis": "hips pushed back, tilted", - "legs": "straddling or standing wide for stability", - "feet": "planted on wet pavement", - "additional": "soap bubbles, heavy foam on body and car, water splashing, car background" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "washing_vehicle, standing, bending_over", + "head": "wet_hair", + "eyes": "looking_at_viewer", + "arms": "reaching, arms_up", + "hands": "holding_sponge, holding_hose", + "torso": "wet_clothes, breast_press, breasts_on_glass", + "pelvis": "shorts, denim_shorts", + "legs": "standing, legs_apart", + "feet": "barefoot", + "additional": "car, motor_vehicle, soap_bubbles, outdoors, car_interior" }, "lora": { "lora_name": "Illustrious/Poses/CarWashV2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "CarWashV2" + "lora_weight": 0.8, + "lora_triggers": "w4sh1n, w4sh0ut" }, "tags": [ - "car wash", - "holding sponge", - "leaning forward", - "bending over", + "car", + "motor_vehicle", + "washing_vehicle", + "soap_bubbles", "wet", - "wet clothes", - "foam", - "bubbles", - "soapy water", - "scrubbing" + "wet_hair", + "wet_clothes", + "holding_sponge", + "holding_hose", + "breasts_on_glass", + "breast_press", + "outdoors", + "car_interior" ] } \ No newline at end of file diff --git a/data/actions/cat_stretchill.json b/data/actions/cat_stretchill.json index 51d1888..5a425d7 100644 --- a/data/actions/cat_stretchill.json +++ b/data/actions/cat_stretchill.json @@ -2,34 +2,33 @@ "action_id": "cat_stretchill", "action_name": "Cat Stretchill", "action": { - "full_body": "character on all fours performing a deep cat stretch, kneeling with chest pressed to the floor and hips raised high", - "head": "chin resting on the floor, looking forward or to the side", - "eyes": "looking up or generally forward", - "arms": "fully extended forward along the ground", - "hands": "palms flat on the floor", - "torso": "deeply arched back, chest touching the ground", - "pelvis": "elevated high in the air, creating a steep angle with the spine", - "legs": "kneeling, bent at the knees", - "feet": "toes touching the ground", - "additional": "emphasizes the curve of the spine and flexibility" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "kneeling, all_fours, cat_stretch, pose", + "head": "looking_ahead, head_down", + "eyes": "closed_eyes, trembling", + "arms": "outstretched_arms, reaching_forward, hands_on_ground", + "hands": "palms_down", + "torso": "arched_back, chest_down", + "pelvis": "hips_up, buttocks_up", + "legs": "kneeling, knees_on_ground", + "feet": "feet_up", + "additional": "cat_ears, cat_tail, trembling" }, "lora": { "lora_name": "Illustrious/Poses/cat_stretchILL.safetensors", - "lora_weight": 1.0, - "lora_triggers": "cat_stretchILL" + "lora_weight": 0.7, + "lora_triggers": "stretching, cat stretch, downward dog, trembling" }, "tags": [ - "all fours", - "ass up", + "cat_stretch", "kneeling", - "cat pose", + "all_fours", "stretching", - "arms extended", - "on floor", - "arched back" + "arched_back", + "outstretched_arms", + "hands_on_ground", + "downward_dog", + "trembling", + "cat_ears", + "cat_tail" ] } \ No newline at end of file diff --git a/data/actions/caught_masturbating_illustrious.json b/data/actions/caught_masturbating_illustrious.json index cd42e65..c15fbfc 100644 --- a/data/actions/caught_masturbating_illustrious.json +++ b/data/actions/caught_masturbating_illustrious.json @@ -2,39 +2,37 @@ "action_id": "caught_masturbating_illustrious", "action_name": "Caught Masturbating Illustrious", "action": { - "full_body": "character receiving a sudden shock while in a private moment of self-pleasure, body freezing or jerking in surprise", - "head": "face flushed red with deep blush, expression of pure panic and embarrassment, mouth gaped open in a gasp", - "eyes": "wide-eyed stare, pupils dilated, locking eyes with the intruder (viewer)", - "arms": "shoulders tensed, one arm frantically trying to cover the chest or face, the other halted mid-motion near the crotch", - "hands": "one hand stopping mid-masturbation typically under skirt or inside panties, other hand gesturing to stop or hiding face", - "torso": "leaning back onto elbows or pillows, clothing disheveled, shirt lifted", - "pelvis": "hips exposed, underwear pulled down to thighs or ankles, vulva accessible", - "legs": "legs spread wide in an M-shape or V-shape, knees bent, trembling", - "feet": "toes curled tightly in tension", - "additional": "context of an intruded private bedroom, messy bed sheets, atmosphere of sudden discovery and shame" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "standing in doorway, confronting viewer", + "head": "looking down or at viewer, surprised expression, blushing", + "eyes": "wide open, looking away or at penis", + "arms": "arms at sides or covering mouth", + "hands": "relaxed or raised in shock", + "torso": "facing viewer", + "pelvis": "standing straight", + "legs": "standing, legs together", + "feet": "standing on floor", + "additional": "male pov, male masturbation in foreground, open door background" }, "lora": { "lora_name": "Illustrious/Poses/Caught_Masturbating_ILLUSTRIOUS.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Caught_Masturbating_ILLUSTRIOUS" + "lora_weight": 0.75, + "lora_triggers": "caught, male pov, male masturbation, girl walking in door, standing in doorway" }, "tags": [ + "pov", + "male_masturbation", + "penis", + "erection", + "walk-in", "caught", - "masturbation", - "embarrassed", - "blush", + "doorway", + "open_door", + "standing", "surprised", - "open mouth", - "looking at viewer", - "panties down", - "hand in panties", - "skirt lift", - "sweat", - "legs spread", - "panic" + "blush", + "looking_at_penis", + "looking_at_viewer", + "wide_shot", + "indoors" ] } \ No newline at end of file diff --git a/data/actions/charm_person_magic.json b/data/actions/charm_person_magic.json index 044ebb2..e23938a 100644 --- a/data/actions/charm_person_magic.json +++ b/data/actions/charm_person_magic.json @@ -2,33 +2,32 @@ "action_id": "charm_person_magic", "action_name": "Charm Person Magic", "action": { - "full_body": "standing, casting pose, dynamic angle, upper body focused", - "head": "facing viewer, head tilted, alluring expression, seductive smile", - "eyes": "looking at viewer, glowing eyes, heart-shaped pupils, hypnotic gaze", - "arms": "reaching towards viewer, one arm outstretched, hand near face", - "hands": "open palm, casting gesture, finger snaps, beckoning motion", - "torso": "facing forward, slight arch", - "pelvis": "hips swayed, weight shifted", - "legs": "standing, crossed legs", - "feet": "out of frame", - "additional": "pink magic, magical aura, sparkles, heart particles, glowing hands, casting spell, enchantment, visual effects" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "casting_spell, standing, magical_presence", + "head": "smile, confident_expression, glowing_eyes", + "eyes": "looking_at_viewer, glowing_eyes", + "arms": "outstretched_hand, reaching_towards_viewer, arms_up", + "hands": "open_hand, hand_gesture", + "torso": "upper_body, facing_viewer", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "aura, soft_light, magic_effects, sparkling" }, "lora": { "lora_name": "Illustrious/Poses/charm_person_magic.safetensors", - "lora_weight": 1.0, - "lora_triggers": "charm_person_magic" + "lora_weight": 0.7, + "lora_triggers": "charm_person_(magic), cham_aura" }, "tags": [ + "casting_spell", "magic", - "fantasy", - "enchantment", - "hypnotic", - "alluring", - "spellcasting", - "pink energy" + "aura", + "outstretched_hand", + "reaching_towards_viewer", + "glowing_eyes", + "looking_at_viewer", + "smile", + "cowboy_shot", + "solo" ] } \ No newline at end of file diff --git a/data/actions/cheekbulge.json b/data/actions/cheekbulge.json index 2284af8..7160c3c 100644 --- a/data/actions/cheekbulge.json +++ b/data/actions/cheekbulge.json @@ -2,33 +2,29 @@ "action_id": "cheekbulge", "action_name": "Cheekbulge", "action": { - "full_body": "kneeling, leaning forward, close-up focus on face", - "head": "visible cheek bulge, distorted cheek, stuffed mouth, mouth stretched", - "eyes": "looking up, upturned eyes, teary eyes, eye contact", - "arms": "reaching forward or resting on partner's legs", - "hands": "holding object, guiding, or resting on thighs", - "torso": "angled forward", - "pelvis": "neutral kneeling posture", - "legs": "kneeling, bent knees", - "feet": "toes pointing back", - "additional": "fellatio, oral sex, saliva, saliva trail, penis in mouth, face deformation" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "fellatio", + "head": "cheek_bulge, head_tilt, saliva", + "eyes": "looking_up", + "arms": "arms_behind_back", + "hands": "hands_on_head", + "torso": "upper_body", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "plantar_flexion", + "additional": "deepthroat, pov, penis" }, "lora": { "lora_name": "Illustrious/Poses/cheekbulge.safetensors", "lora_weight": 1.0, - "lora_triggers": "cheekbulge" + "lora_triggers": "cheek bulge" }, "tags": [ - "cheek bulge", - "stuffed mouth", + "cheek_bulge", + "deepthroat", "fellatio", - "distorted face", - "oral sex", - "looking up", - "face deformation" + "saliva", + "head_tilt", + "penis", + "pov" ] } \ No newline at end of file diff --git a/data/actions/chokehold.json b/data/actions/chokehold.json index a2529d6..fba4a01 100644 --- a/data/actions/chokehold.json +++ b/data/actions/chokehold.json @@ -2,38 +2,34 @@ "action_id": "chokehold", "action_name": "Chokehold", "action": { - "full_body": "dynamic combat pose, character positioning behind an opponent, executing a rear chokehold, two people grappling", - "head": "chin tucked tight, face pressed close to the opponent's head, intense or straining expression", - "eyes": "focused, narrowed in concentration", - "arms": "one arm wrapped tightly around the opponent's neck, the other arm locking the hold by gripping the bicep or clasping hands", - "hands": "clenching tight, gripping own bicep or locking fingers behind opponent's neck", - "torso": "chest pressed firmly against the opponent's back, leaning back slightly for leverage", - "pelvis": "pressed close to opponent's lower back", - "legs": "wrapped around the opponent's waist (body triangle or hooks in) or wide standing stance for stability", - "feet": "hooked inside opponent's thighs or planted firmly on the ground", - "additional": "struggle, tension, submission hold, restrictive motion, self-defense scenario" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "rear_naked_choke, from_behind, struggling, kneeling", + "head": "head_back, expressionless, open_mouth", + "eyes": "rolling_eyes, tearing_up, empty_eyes", + "arms": "arm_around_neck, struggling, grabbing_arm", + "hands": "clenched_hands, struggling", + "torso": "leaning_forward, arched_back", + "pelvis": "kneeling, bent_over", + "legs": "kneeling, spread_legs", + "feet": "barefoot, toes_curled", + "additional": "distress, blushing, saliva, veins" }, "lora": { "lora_name": "Illustrious/Poses/chokehold.safetensors", "lora_weight": 1.0, - "lora_triggers": "chokehold" + "lora_triggers": "choke hold" }, "tags": [ - "chokehold", - "grappling", - "rear naked choke", - "fighting", - "wrestling", - "martial arts", - "restraining", - "submission", - "headlock", - "strangle", - "duo", - "struggle" + "choke_hold", + "rear_naked_choke", + "strangling", + "arm_around_neck", + "from_behind", + "struggling", + "head_back", + "clenched_teeth", + "rolling_eyes", + "drooling", + "saliva", + "ohogao" ] } \ No newline at end of file diff --git a/data/actions/cleavageteasedwnsty_000008.json b/data/actions/cleavageteasedwnsty_000008.json index d322fe7..9fd86ce 100644 --- a/data/actions/cleavageteasedwnsty_000008.json +++ b/data/actions/cleavageteasedwnsty_000008.json @@ -2,35 +2,36 @@ "action_id": "cleavageteasedwnsty_000008", "action_name": "Cleavageteasedwnsty 000008", "action": { - "full_body": "Medium shot or close-up focus on the upper body, character facing forward", - "head": "Looking directly at viewer, chin slightly tucked or tilted, expression varying from shy blush to seductive smile", - "eyes": "Eye contact, focused on the viewer", - "arms": "Elbows bent, forearms brought up towards the chest", - "hands": "Fingers grasping the hem of the collar or neckline of the top, pulling it downwards", - "torso": "Clothing fabric stretched taut, neckline pulled down low to reveal cleavage, emphasis on the chest area", - "pelvis": "Neutral position, often obscured in close-up shots", - "legs": "Neutral or out of frame", - "feet": "Out of frame", - "additional": "Fabric tension lines, revealing skin, seductive atmosphere" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "leaning_forward, sexually_suggestive", + "head": "looking_at_viewer, smile, blush, one_eye_closed", + "eyes": "blue_eyes, looking_at_viewer", + "arms": "arms_bent_at_elbows", + "hands": "hands_on_own_chest, clothes_pull, adjusting_clothes", + "torso": "cleavage, breasts_squeezed_together, areola_slip, bare_shoulders, collarbone", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "teasing, undressing" }, "lora": { "lora_name": "Illustrious/Poses/CleavageTeaseDwnsty-000008.safetensors", "lora_weight": 1.0, - "lora_triggers": "CleavageTeaseDwnsty-000008" + "lora_triggers": "pulling down own clothes, teasing" }, "tags": [ - "cleavage", - "clothes pull", - "collar pull", - "shirt pull", - "looking at viewer", - "breasts", + "clothes_pull", + "shirt_pull", "teasing", + "breasts_squeezed_together", + "areola_slip", + "undressing", + "leaning_forward", + "cleavage", + "hands_on_own_chest", + "collarbone", + "bare_shoulders", + "sexually_suggestive", "blush", - "holding clothes" + "one_eye_closed" ] } \ No newline at end of file diff --git a/data/actions/closeup_facial_illus.json b/data/actions/closeup_facial_illus.json index 1b176bc..8663a52 100644 --- a/data/actions/closeup_facial_illus.json +++ b/data/actions/closeup_facial_illus.json @@ -2,32 +2,30 @@ "action_id": "closeup_facial_illus", "action_name": "Closeup Facial Illus", "action": { - "full_body": "extreme close-up portrait shot framing the face and upper neck, macro focus", - "head": "facing directly forward, highly detailed facial micro-expressions, blush", - "eyes": "intense gaze, intricate iris details, looking at viewer, eyelashes focus", - "arms": "not visible", - "hands": "not visible", - "torso": "upper collarbone area only", - "pelvis": "not visible", - "legs": "not visible", - "feet": "not visible", - "additional": "illustrative style, shallow depth of field, soft lighting, detailed skin texture, vibrant colors" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "close-up, portrait", + "head": "facial, open_mouth, tongue, saliva, blush", + "eyes": "looking_at_viewer, eyes_open", + "arms": "out_of_frame", + "hands": "out_of_frame", + "torso": "out_of_frame", + "pelvis": "out_of_frame", + "legs": "out_of_frame", + "feet": "out_of_frame", + "additional": "nsfw, semen, cum" }, "lora": { "lora_name": "Illustrious/Poses/Closeup_Facial_iLLus.safetensors", "lora_weight": 1.0, - "lora_triggers": "Closeup_Facial_iLLus" + "lora_triggers": "Closeup Facial" }, "tags": [ + "facial", "close-up", "portrait", - "face focus", - "illustration", - "detailed eyes", - "macro" + "open_mouth", + "tongue", + "looking_at_viewer", + "saliva", + "blush" ] } \ No newline at end of file diff --git a/data/actions/cooperativepaizuri.json b/data/actions/cooperativepaizuri.json index 9939fd3..e4ba167 100644 --- a/data/actions/cooperativepaizuri.json +++ b/data/actions/cooperativepaizuri.json @@ -2,35 +2,32 @@ "action_id": "cooperativepaizuri", "action_name": "Cooperativepaizuri", "action": { - "full_body": "intimate sexual pose, two people interacting closely", - "head": "flushed face, drooling, tongue out, expression of pleasure or submission", - "eyes": "half-closed eyes, looking down, ahegao or heart-shaped pupils", - "arms": "arms supporting body weight or holding partner", - "hands": "recipient's hands grasping subject's breasts, squeezing breasts together towards center", - "torso": "exposed breasts, heavy cleavage, chest compressed by external hands", - "pelvis": "leaning forward, hips raised or straddling", - "legs": "kneeling, spread legs, or wrapping around partner", - "feet": "arched feet, toes curled", - "additional": "penis sliding between breasts, friction, lubrication, skin indentation" - }, - "participants": { - "solo_focus": "false", - "orientation": "MFF" + "full_body": "cooperative_paizuri, 2girls, 1boy, sexual_activity", + "head": "smile, open_mouth, facial", + "eyes": "looking_at_partner, half_closed_eyes", + "arms": "arms_around_neck, grabbing_penis", + "hands": "on_penis, guiding_penis", + "torso": "large_breasts, breasts_touching, nipples", + "pelvis": "penis, glans, erection", + "legs": "kneeling, straddling", + "feet": "barefoot", + "additional": "pov, cum_on_body, fluids" }, "lora": { "lora_name": "Illustrious/Poses/cooperativepaizuri.safetensors", "lora_weight": 1.0, - "lora_triggers": "cooperativepaizuri" + "lora_triggers": "cooperative paizuri" }, "tags": [ + "cooperative_paizuri", + "2girls", + "1boy", "paizuri", - "assisted paizuri", - "male hand", - "breast squeeze", - "titjob", - "penis between breasts", - "sexual act", - "cleavage", - "big breasts" + "breasts", + "penis", + "facial", + "pov", + "from_side", + "large_breasts" ] } \ No newline at end of file diff --git a/data/actions/covering_privates_illustrious_v1_0.json b/data/actions/covering_privates_illustrious_v1_0.json index c06a5a3..d49c022 100644 --- a/data/actions/covering_privates_illustrious_v1_0.json +++ b/data/actions/covering_privates_illustrious_v1_0.json @@ -2,34 +2,29 @@ "action_id": "covering_privates_illustrious_v1_0", "action_name": "Covering Privates Illustrious V1 0", "action": { - "full_body": "standing in a defensive, modest posture, body language expressing vulnerability", - "head": "tilted down or looking away in embarrassment", - "eyes": "averted gaze, shy or flustered expression", - "arms": "arms pulled in tight against the body", - "hands": "hands covering crotch, hand over breasts, covering self", - "torso": "slightly hunched forward or twisting away", - "pelvis": "hips slightly turned", - "legs": "legs pressed tightly together, thighs touching, knock-kneed", - "feet": "standing close together, possibly pigeon-toed", - "additional": "blush, steam or light rays (optional)" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "covering_privates", + "head": "embarrassed, blush", + "eyes": "looking_at_viewer", + "arms": "arm_across_chest", + "hands": "covering_breasts, covering_crotch", + "torso": "upper_body", + "pelvis": "hips", + "legs": "legs_together", + "feet": "standing", + "additional": "modesty" }, "lora": { "lora_name": "Illustrious/Poses/covering privates_illustrious_V1.0.safetensors", "lora_weight": 1.0, - "lora_triggers": "covering privates_illustrious_V1.0" + "lora_triggers": "covering privates, covering crotch, covering breasts" }, "tags": [ - "covering self", + "covering_privates", + "covering_breasts", + "covering_crotch", "embarrassed", "blush", - "hands on crotch", - "arm across chest", - "modesty", - "legs together", - "shy" + "arm_across_chest", + "legs_together" ] } \ No newline at end of file diff --git a/data/actions/coveringownmouth_ill_v1.json b/data/actions/coveringownmouth_ill_v1.json index aeb7afd..16049be 100644 --- a/data/actions/coveringownmouth_ill_v1.json +++ b/data/actions/coveringownmouth_ill_v1.json @@ -2,35 +2,23 @@ "action_id": "coveringownmouth_ill_v1", "action_name": "Coveringownmouth Ill V1", "action": { - "full_body": "character appearing sick or nauseous, posture slightly hunched forward", - "head": "pale complexion, sweatdrops on face, cheeks flushed or blue (if severe), grimacing", - "eyes": "tearing up, wincing, half-closed, or dilated pupils", - "arms": "one or both arms raised sharply towards the face", - "hands": "covering mouth, hand over mouth, fingers clutching face", - "torso": "leaning forward, tense shoulders usually associated with retching or coughing", - "pelvis": "neutral position or slightly bent forward", - "legs": "knees slightly bent or trembling", - "feet": "planted firmly or stumbling", - "additional": "motion lines indicating shaking, gloom lines, vomit (optional/extreme)" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "character covering their mouth with their hand", + "head": "lower face obscured by hand", + "eyes": "neutral or expressive (depending on context)", + "arms": "arm raised towards face", + "hands": "hand placed over mouth, palm inward", + "torso": "upper body visible", + "pelvis": "variable", + "legs": "variable", + "feet": "variable", + "additional": "often indicates surprise, embarrassment, or silence" }, "lora": { "lora_name": "Illustrious/Poses/CoveringOwnMouth_Ill_V1.safetensors", "lora_weight": 1.0, - "lora_triggers": "CoveringOwnMouth_Ill_V1" + "lora_triggers": "covering_own_mouth" }, "tags": [ - "covering mouth", - "hand over mouth", - "ill", - "sick", - "nausea", - "queasy", - "motion sickness", - "sweat", - "pale" + "covering_own_mouth" ] } \ No newline at end of file diff --git a/data/actions/cum_in_cleavage_illustrious.json b/data/actions/cum_in_cleavage_illustrious.json index f346d9d..ee64984 100644 --- a/data/actions/cum_in_cleavage_illustrious.json +++ b/data/actions/cum_in_cleavage_illustrious.json @@ -2,38 +2,32 @@ "action_id": "cum_in_cleavage_illustrious", "action_name": "Cum In Cleavage Illustrious", "action": { - "full_body": "close-up or cowboy shot focusing intensely on the upper body and chest area", - "head": "flushed cheeks, heavy breathing, mouth slightly open, expression of embarrassment or pleasure, saliva trail", - "eyes": "half-closed, heart-shaped pupils (optional), looking down at chest or shyly at viewer", - "arms": "arms bent brings hands to chest level", - "hands": "hands squeezing breasts together to deepen cleavage, or pulling clothing aside to reveal the mess", - "torso": "large breasts pressed together, deep cleavage filled with pooling white seminal fluid, cum dripping down skin, messy upper body", - "pelvis": "obscured or hips visible in background", - "legs": "obscured", - "feet": "out of frame", - "additional": "high viscosity liquid detail, shiny skin, wet texture, after sex atmosphere" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "passionate upper body focus, intimacy", + "head": "blush, mouth slightly open, expression of pleasure or service", + "eyes": "looking at viewer, potentially heavy lidded or heart-shaped pupils", + "arms": "arms bent, hands bringing breasts together", + "hands": "holding own breasts, squeezing or pressing breasts together", + "torso": "bare chest, medium to large breasts, pronounced cleavage, cum pooling in cleavage", + "pelvis": "not visible or seated", + "legs": "not visible", + "feet": "not visible", + "additional": "pool of liquid in cleavage, messy, erotic context" }, "lora": { "lora_name": "Illustrious/Poses/cum_in_cleavage_illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "cum_in_cleavage_illustrious" + "lora_triggers": "cum_in_cleavage, holding own breasts" }, "tags": [ - "cum", - "cum in cleavage", - "cum on breasts", - "semen", - "huge breasts", - "cleavage", - "messy", - "sticky", + "cum_on_breasts", "paizuri", - "sex act", - "illustration", - "nsfw" + "cleavage", + "breasts", + "breast_lift", + "plump", + "mature_female", + "short_hair", + "black_hair", + "indoors" ] } \ No newline at end of file diff --git a/data/actions/cum_shot.json b/data/actions/cum_shot.json index d41f3fa..84ad5ae 100644 --- a/data/actions/cum_shot.json +++ b/data/actions/cum_shot.json @@ -2,35 +2,42 @@ "action_id": "cum_shot", "action_name": "Cum Shot", "action": { - "full_body": "close-up, portrait, upper body focus, kneeling or sitting", - "head": "mouth open, tongue out, blushing, sweating, cum on face, cum in mouth, semen on hair, messy hair", - "eyes": "half-closed eyes, rolling eyes, heart-shaped pupils, looking at viewer, glazed eyes", - "arms": "arms relaxed or hands framing face", - "hands": "hands on cheeks, making peace sign, or wiping face", - "torso": "exposed upper body, wet skin, cleavage", - "pelvis": "obscured or out of frame", - "legs": "kneeling or out of frame", + "full_body": "portrait or upper body focus, capturing the moment of ejaculation or aftermath", + "head": "tilted back or facing forward, expression of pleasure or shock", + "eyes": "closed or rolling back, eyelashes detailed", + "arms": "out of frame or hands touching face", + "hands": "optional, touching face or wiping", + "torso": "chest visible, potentially with cum_on_body", + "pelvis": "usually out of frame in this context", + "legs": "out of frame", "feet": "out of frame", - "additional": "white liquid, splashing, sticky texture, aftermath, detailed fluids, high contrast" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "additional": "white fluids, messy, dripping, shiny skin" }, "lora": { "lora_name": "Illustrious/Poses/cum_shot.safetensors", - "lora_weight": 1.0, - "lora_triggers": "cum_shot" + "lora_weight": 0.8, + "lora_triggers": "cum, facial, ejaculation" }, "tags": [ - "cum_shot", - "facial", - "semen", "cum", + "facial", + "ejaculation", + "cum_on_body", + "cum_on_breasts", + "cum_in_eye", + "cum_in_mouth", "bukkake", - "aftermath", - "nsfw", - "liquid", - "messy" + "after_sex", + "messy_body", + "sticky", + "white_fluid", + "open_mouth", + "tongue", + "bukkake", + "tongue_out", + "saliva", + "sweat", + "blush", + "ahegao" ] } \ No newline at end of file diff --git a/data/actions/cumblastfacial.json b/data/actions/cumblastfacial.json new file mode 100644 index 0000000..454379e --- /dev/null +++ b/data/actions/cumblastfacial.json @@ -0,0 +1,32 @@ +{ + "action_id": "cumblastfacial", + "action_name": "Cumblastfacial", + "action": { + "full_body": "solo, bukkake", + "head": "facial, head_tilt, looking_up", + "eyes": "cum_in_eye", + "arms": "arms_down", + "hands": "hands_down", + "torso": "cum_on_upper_body", + "pelvis": "standing", + "legs": "standing", + "feet": "standing", + "additional": "projectile_cum, excessive_cum, ejaculation" + }, + "lora": { + "lora_name": "Illustrious/Poses/cumblastfacial.safetensors", + "lora_weight": 1.0, + "lora_triggers": "xcbfacialx" + }, + "tags": [ + "facial", + "projectile_cum", + "bukkake", + "excessive_cum", + "ejaculation", + "head_tilt", + "looking_up", + "cum_in_eye", + "cum_on_hair" + ] +} \ No newline at end of file diff --git a/data/actions/cuminhands.json b/data/actions/cuminhands.json index 730c6d2..4ac25e1 100644 --- a/data/actions/cuminhands.json +++ b/data/actions/cuminhands.json @@ -2,35 +2,30 @@ "action_id": "cuminhands", "action_name": "Cuminhands", "action": { - "full_body": "upper body focus, character presenting cupped hands towards the viewer", - "head": "looking down at hands or looking at viewer, expression of embarrassment or lewd satisfaction, blushing", - "eyes": "half-closed or wide open, focused on the hands", - "arms": "elbows bent, forearms brought together in front of the chest or stomach", - "hands": "cupped hands, palms facing up, fingers tight together, holding white liquid, messy hands", - "torso": "posture slightly hunched or leaning forward to show hands", - "pelvis": "stationary", - "legs": "kneeling or standing", - "feet": "planted", - "additional": "white liquid, seminal fluid, dripping between fingers, sticky texture, high contrast fluids" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "after_fellatio", + "head": "facial, cum_string, cum_in_mouth", + "eyes": "looking_at_hands", + "arms": "arms_bent", + "hands": "cupping_hands, cum_on_hands", + "torso": "upper_body", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "excessive_cum" }, "lora": { "lora_name": "Illustrious/Poses/cuminhands.safetensors", "lora_weight": 1.0, - "lora_triggers": "cuminhands" + "lora_triggers": "cum on hands, cupping hands, excessive cum, cum on face, cum in mouth, cum string" }, "tags": [ - "cum in hands", - "cupped hands", - "holding cum", - "cum", - "bodily fluids", - "messy", - "palms up", - "sticky", - "white liquid" + "cum_on_hands", + "cupping_hands", + "excessive_cum", + "facial", + "cum_in_mouth", + "cum_string", + "after_fellatio", + "looking_at_hands" ] } \ No newline at end of file diff --git a/data/actions/cunnilingus_on_back_illustriousxl_lora_nochekaiser.json b/data/actions/cunnilingus_on_back_illustriousxl_lora_nochekaiser.json index 0c2609d..d8ecea9 100644 --- a/data/actions/cunnilingus_on_back_illustriousxl_lora_nochekaiser.json +++ b/data/actions/cunnilingus_on_back_illustriousxl_lora_nochekaiser.json @@ -2,33 +2,36 @@ "action_id": "cunnilingus_on_back_illustriousxl_lora_nochekaiser", "action_name": "Cunnilingus On Back Illustriousxl Lora Nochekaiser", "action": { - "full_body": "lying on back, receiving oral sex, partner between legs", - "head": "head tilted back, expression of pleasure, blushing, heavy breathing, mouth open", - "eyes": "eyes closed, rolling eyes, or looking down at partner", - "arms": "arms resting on bed or reaching towards partner", - "hands": "gripping bedsheets, clutching pillow, or holding partner's head", - "torso": "arched back, chest heaving", - "pelvis": "hips lifted, crotch exposed to partner", - "legs": "spread legs, legs apart, knees bent, m-legs", - "feet": "toes curled, feet on bed", - "additional": "partner's face in crotch, tongue, saliva, sexual act, intimate focus" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lying, on_back, spread_legs, nude", + "head": "torogao, blush, sweat", + "eyes": "half-closed_eyes", + "arms": "bent_arms", + "hands": "hands_on_own_chest", + "torso": "navel, nipples, sweat", + "pelvis": "cunnilingus, pussy", + "legs": "spread_legs, thighs", + "feet": "", + "additional": "on_bed, pillow, from_side" }, "lora": { "lora_name": "Illustrious/Poses/cunnilingus-on-back-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "cunnilingus-on-back-illustriousxl-lora-nochekaiser" + "lora_triggers": "cunnilingus on back" }, "tags": [ "cunnilingus", - "oral sex", - "lying on back", - "spread legs", - "pleasure", - "sex", - "NSFW" + "lying", + "on_back", + "spread_legs", + "hands_on_own_chest", + "torogao", + "half-closed_eyes", + "sweat", + "blush", + "navel", + "nipples", + "hetero", + "on_bed", + "from_side" ] } \ No newline at end of file diff --git a/data/actions/danglinglegs.json b/data/actions/danglinglegs.json index f2c39ac..2cf1038 100644 --- a/data/actions/danglinglegs.json +++ b/data/actions/danglinglegs.json @@ -2,32 +2,30 @@ "action_id": "danglinglegs", "action_name": "Danglinglegs", "action": { - "full_body": "holding waist, dangling legs, size difference", - "head": "facing forward or looking down", - "eyes": "relaxed gaze", - "arms": "resting on lap or gripping the edge of the seat", - "hands": "placed on thighs or holding on", - "torso": "upright sitting posture", - "pelvis": "seated on edge", - "legs": "dangling in the air, knees bent at edge, feet not touching the floor", - "feet": "relaxed, hanging loose", - "additional": "sitting on ledge, sitting on desk, high stool" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "suspended_congress, lifting_person, standing_sex", + "head": "clenched_teeth, head_back", + "eyes": "eyes_closed", + "arms": "arms_around_neck", + "hands": "hands_on_shoulders", + "torso": "body_lifted", + "pelvis": "hips_held", + "legs": "legs_apart, feet_off_ground", + "feet": "toes_up, barefoot", + "additional": "size_difference, larger_male, sex_from_behind" }, "lora": { "lora_name": "Illustrious/Poses/danglinglegs.safetensors", "lora_weight": 1.0, - "lora_triggers": "danglinglegs" + "lora_triggers": "dangling legs, lifted by penis, suspended on penis" }, "tags": [ - "dangling legs", - "sitting", - "feet off ground", - "from below", - "ledge", - "high place" + "suspended_congress", + "lifting_person", + "standing_sex", + "sex_from_behind", + "size_difference", + "toes_up", + "barefoot", + "clenched_teeth" ] } \ No newline at end of file diff --git a/data/actions/deepthroat_ponytailhandle_anime_il_v1.json b/data/actions/deepthroat_ponytailhandle_anime_il_v1.json index 763d609..81e20b6 100644 --- a/data/actions/deepthroat_ponytailhandle_anime_il_v1.json +++ b/data/actions/deepthroat_ponytailhandle_anime_il_v1.json @@ -2,39 +2,32 @@ "action_id": "deepthroat_ponytailhandle_anime_il_v1", "action_name": "Deepthroat Ponytailhandle Anime Il V1", "action": { - "full_body": "kneeling, performing deepthroat fellatio, body angled towards partner", - "head": "tilted back forcedly, mouth stretched wide, gagging, face flushed, hair pulled taught", - "eyes": "tearing up, rolled back, looking up, streaming tears", - "arms": "reaching forward, holding onto partner's legs for support", - "hands": "grasping thighs, fingers digging in", - "torso": "leaning forward, back slightly arched", - "pelvis": "kneeling position", - "legs": "knees on ground, shins flat", - "feet": "toes curled tightly", - "additional": "saliva trails, heavy breathing, hand grabbing ponytail, penis in mouth, irrumatio" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "irrumatio, fellatio, 1boy, 1girl, duo", + "head": "forced_oral, head_back, mouth_open, saliva, drooling", + "eyes": "crying, tears, glare, wide_eyes", + "arms": "arms_at_sides", + "hands": "hands_down", + "torso": "upper_body", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "grabbing_another's_hair, penis, deepthroat, ponytail" }, "lora": { "lora_name": "Illustrious/Poses/Deepthroat_PonytailHandle_Anime_IL_V1.safetensors", "lora_weight": 1.0, - "lora_triggers": "Deepthroat_PonytailHandle_Anime_IL_V1" + "lora_triggers": "deepthroat_ponytailhandle, grabbing another's hair, ponytail" }, "tags": [ + "irrumatio", "deepthroat", "fellatio", - "oral sex", - "hair pull", - "grabbing hair", + "grabbing_another's_hair", "ponytail", - "kneeling", - "gagging", - "irrumatio", + "drooling", "tears", - "saliva", - "submissive", - "forced oral" + "crying", + "penis", + "forced" ] } \ No newline at end of file diff --git a/data/actions/doggydoublefingering.json b/data/actions/doggydoublefingering.json index f867c1e..9a4ff93 100644 --- a/data/actions/doggydoublefingering.json +++ b/data/actions/doggydoublefingering.json @@ -2,32 +2,32 @@ "action_id": "doggydoublefingering", "action_name": "Doggydoublefingering", "action": { - "full_body": "all fours, doggy style, kneeling, presenting rear, from behind", - "head": "looking back, looking at viewer, blushing face", - "eyes": "half-closed eyes, expressionless or aroused", - "arms": "reaching back between legs, reaching towards crotch", - "hands": "fingering, double fingering, both hands used, spreading vaginal lips, manipulating genitals", - "torso": "arched back, curvature of spine", - "pelvis": "hips raised, presenting pussy, exposed gluteal crease", - "legs": "knees bent on ground, thighs spread", - "feet": "toes curled, relaxing instep", - "additional": "pussy juice, focus on buttocks, focus on genitals" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "Three females arranged side-by-side in a row, all facing away from viewer or towards viewer depending on angle, engaged in group sexual activity", + "head": "various expressions, blushing, sweating, looking back or down", + "eyes": "open or closed in pleasure", + "arms": "varied, gripping sheets or supporting body", + "hands": "resting on surface or gripping", + "torso": "leaning forward, breasts visible if from front", + "pelvis": "hips raised, bent over", + "legs": "kneeling on all fours", + "feet": "resting on bed or ground", + "additional": "center female receiving vaginal penetration from behind (doggystyle), two distinct side females being fingered simultaneously, male figure or disembodied hands performing the fingering" }, "lora": { "lora_name": "Illustrious/Poses/DoggyDoubleFingering.safetensors", "lora_weight": 1.0, - "lora_triggers": "DoggyDoubleFingering" + "lora_triggers": "doggydoublefingerfront, from front, 3girls, multiple girls, fingering, sex from behind, doggystyle" }, "tags": [ - "masturbation", - "solo", - "ass focus", - "pussy", - "kneeling", - "NSFW" + "3girls", + "group_sex", + "doggystyle", + "fingering", + "all_fours", + "sex_from_behind", + "vaginal", + "hetero", + "harem", + "male_fingering" ] } \ No newline at end of file diff --git a/data/actions/dunking_face_in_a_bowl_of_cum_r1.json b/data/actions/dunking_face_in_a_bowl_of_cum_r1.json index 2ced770..1c3af6b 100644 --- a/data/actions/dunking_face_in_a_bowl_of_cum_r1.json +++ b/data/actions/dunking_face_in_a_bowl_of_cum_r1.json @@ -2,36 +2,35 @@ "action_id": "dunking_face_in_a_bowl_of_cum_r1", "action_name": "Dunking Face In A Bowl Of Cum R1", "action": { - "full_body": "leaning forward over a table or surface, bent at the waist", - "head": "face submerged in a bowl, head bent downward", - "eyes": "closed or obscured by liquid", - "arms": "resting on the surface to support weight or holding the bowl", - "hands": "palms flat on table or gripping the sides of the bowl", - "torso": "leaned forward, horizontal alignment", - "pelvis": "pushed back", - "legs": "standing or kneeling", - "feet": "resting on floor", - "additional": "cum pool, large bowl filled with viscous white liquid, semen, messy, splashing, dripping" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "leaning_forward, head_down, drowning", + "head": "face_down, air_bubble, crying, tears, embarrassed, disgust", + "eyes": "closed_eyes, tears", + "arms": "clutching_head, arms_up", + "hands": "clutching_head", + "torso": "leaning_forward", + "pelvis": "leaning_forward", + "legs": "standing", + "feet": "standing", + "additional": "bowl, cum" }, "lora": { "lora_name": "Illustrious/Poses/Dunking_face_in_a_bowl_of_cum_r1.safetensors", "lora_weight": 1.0, - "lora_triggers": "Dunking_face_in_a_bowl_of_cum_r1" + "lora_triggers": "face in cum bowl, cum in bowl, cum bubble, excessive cum" }, "tags": [ - "dunking face", - "face in bowl", - "bowl of cum", - "semen", - "messy", - "submerged", - "leaning forward", - "bent over", - "white liquid", + "1girl", + "solo", + "leaning_forward", + "head_down", + "clutching_head", + "drowning", + "air_bubble", + "crying", + "tears", + "embarrassed", + "disgust", + "bowl", "cum" ] } \ No newline at end of file diff --git a/data/actions/extreme_sex_v1_0_illustriousxl.json b/data/actions/extreme_sex_v1_0_illustriousxl.json index ec2c736..6641ff6 100644 --- a/data/actions/extreme_sex_v1_0_illustriousxl.json +++ b/data/actions/extreme_sex_v1_0_illustriousxl.json @@ -2,36 +2,33 @@ "action_id": "extreme_sex_v1_0_illustriousxl", "action_name": "Extreme Sex V1 0 Illustriousxl", "action": { - "full_body": "lying on back, mating press, legs lifted high, dynamic angle, foreshortening", - "head": "head leaning back, heavy blush, sweat, mouth open, tongue out, intense expression", - "eyes": "rolling eyes, heart-shaped pupils, eyelashes", - "arms": "arms reaching forward, grabbing sheets, or holding own legs", - "hands": "clenched hands, grabbing", - "torso": "arched back, chest exposed, sweat on skin", - "pelvis": "hips lifted, pelvis tilted upwards", - "legs": "legs spread, m-legs, legs folded towards torso, knees bent", - "feet": "feet in air, toes curled, plantar view", - "additional": "motion lines, shaking, bodily fluids, bed sheet, pillow" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sitting, engaging in sexual activity, intense body language", + "head": "tilted back, expression of ecstasy", + "eyes": "rolling_eyes, loss of focus, cross-eyed (ahegao)", + "arms": "clinging or holding partner", + "hands": "grasping details", + "torso": "heaving, covered in sweat", + "pelvis": "engaged in action", + "legs": "wrapped around or spread", + "feet": "toes curled", + "additional": "drooling, saliva_trail, flushing, messy_hair" }, "lora": { "lora_name": "Illustrious/Poses/extreme-sex-v1.0-illustriousxl.safetensors", "lora_weight": 1.0, - "lora_triggers": "extreme-sex-v1.0-illustriousxl" + "lora_triggers": "extreme sex" }, "tags": [ - "mating press", - "lying on back", - "legs up", - "open mouth", - "blush", - "sweat", - "m-legs", - "intense", + "rolling_eyes", "ahegao", - "explicit" + "drooling", + "sweat", + "open_mouth", + "tongue_out", + "messy_hair", + "heavy_breathing", + "blush", + "mind_break", + "sex" ] } \ No newline at end of file diff --git a/data/actions/face_grab_illustrious.json b/data/actions/face_grab_illustrious.json index 93b5fe2..52cd82d 100644 --- a/data/actions/face_grab_illustrious.json +++ b/data/actions/face_grab_illustrious.json @@ -2,35 +2,32 @@ "action_id": "face_grab_illustrious", "action_name": "Face Grab Illustrious", "action": { - "full_body": "medium shot or close up of a character having their face grabbed by a hand", - "head": "face obscured by hand, cheeks squeezed, skin indentation from fingers, annoyed or pained expression", - "eyes": "squinting or partially covered by fingers", - "arms": "raised upwards attempting to pry the hand away", - "hands": "holding the wrist or forearm of the grabbing hand", - "torso": "upper body slightly leaned back from the force of the grab", - "pelvis": "neutral alignment", - "legs": "standing still", - "feet": "planted firmly", - "additional": "the grabbing hand usually belongs to another person or is an off-screen entity, commonly referred to as the iron claw technique" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "POV close-up of a character having their face grabbed by the viewer", + "head": "forced expression, open mouth, tongue out, pout, grabbing cheeks or chin", + "eyes": "looking at viewer, crying, streaming tears", + "arms": "often not visible or passive", + "hands": "pov hands, hand grabbing face", + "torso": "upper body, often nude or partially visible", + "pelvis": "usually out of frame", + "legs": "out of frame", + "feet": "out of frame", + "additional": "context often after fellatio with fluids on face or tongue" }, "lora": { "lora_name": "Illustrious/Poses/face_grab_illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "face_grab_illustrious" + "lora_weight": 0.5, + "lora_triggers": "fcgrb, face grab, grabbing another's face, pov, pov hand, open mouth, tongue out" }, "tags": [ - "face grab", - "iron claw", - "hand on face", - "hand over face", - "skin indentation", - "squeezed face", - "fingers on face", - "forced", - "cheek pinch" + "grabbing_another's_face", + "pov", + "pov_hands", + "after_fellatio", + "cum_on_tongue", + "open_mouth", + "tongue_out", + "pout", + "streaming_tears", + "cheek_pinching" ] } \ No newline at end of file diff --git a/data/actions/facesit_08.json b/data/actions/facesit_08.json index 6f691f7..6481211 100644 --- a/data/actions/facesit_08.json +++ b/data/actions/facesit_08.json @@ -2,33 +2,36 @@ "action_id": "facesit_08", "action_name": "Facesit 08", "action": { - "full_body": "POV perspective from below, character straddling the camera/viewer in a squatting or kneeling position", - "head": "tilted downwards, looking directly at the viewer", - "eyes": "gazing down, maintaining eye contact", - "arms": "resting comfortably", - "hands": "placed on own thighs or knees for support", - "torso": "foreshortened from below, leaning slightly forward", - "pelvis": "positioned directly over the camera lens, dominating the frame", - "legs": "spread wide, knees bent deeply, thighs framing the view", - "feet": "resting on the surface on either side of the viewpoint", - "additional": "extreme low angle, forced perspective, intimate proximity" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sitting_on_face, cunnilingus, oral", + "head": "looking_at_viewer, looking_down", + "eyes": "looking_at_viewer", + "arms": "head_grab", + "hands": "on_head", + "torso": "nude, close-up", + "pelvis": "panties_aside, clitoris, pussy_juice", + "legs": "spread_legs", + "feet": "out_of_frame", + "additional": "yuri, female_pov, 2girls" }, "lora": { "lora_name": "Illustrious/Poses/facesit-08.safetensors", - "lora_weight": 1.0, - "lora_triggers": "facesit-08" + "lora_weight": 0.8, + "lora_triggers": "2girls, female pov, close-up, looking at viewer, sitting on face, oral, cunnilingus, spread legs, pussy juice, clitoris" }, "tags": [ - "facesitting", - "pov", - "femdom", - "squatting", - "looking down", - "low angle", - "thighs" + "2girls", + "female_pov", + "close-up", + "looking_at_viewer", + "sitting_on_face", + "oral", + "cunnilingus", + "spread_legs", + "pussy_juice", + "clitoris", + "yuri", + "panties_aside", + "head_grab", + "looking_down" ] } \ No newline at end of file diff --git a/data/actions/fellatio_from_below_illustriousxl_lora_nochekaiser.json b/data/actions/fellatio_from_below_illustriousxl_lora_nochekaiser.json new file mode 100644 index 0000000..7aeb70d --- /dev/null +++ b/data/actions/fellatio_from_below_illustriousxl_lora_nochekaiser.json @@ -0,0 +1,35 @@ +{ + "action_id": "fellatio_from_below_illustriousxl_lora_nochekaiser", + "action_name": "Fellatio From Below Illustriousxl Lora Nochekaiser", + "action": { + "full_body": "squatting, fellatio, from_below", + "head": "facing_viewer, open_mouth", + "eyes": "looking_down", + "arms": "arms_visible", + "hands": "hands_visible", + "torso": "nude, navel, nipples", + "pelvis": "nude, pussy, spread_legs", + "legs": "squatting, bent_legs", + "feet": "feet_visible", + "additional": "penis, testicles, oral, sweat, cum" + }, + "lora": { + "lora_name": "Illustrious/Poses/fellatio-from-below-illustriousxl-lora-nochekaiser.safetensors", + "lora_weight": 1.0, + "lora_triggers": "fellatio from below, fellatio, from below, squatting, hetero, penis, testicles, completely nude, oral" + }, + "tags": [ + "fellatio", + "from_below", + "squatting", + "penis", + "testicles", + "completely_nude", + "hetero", + "oral", + "navel", + "nipples", + "sweat", + "pussy" + ] +} \ No newline at end of file diff --git a/data/actions/fellatio_on_couch_illustriousxl_lora_nochekaiser.json b/data/actions/fellatio_on_couch_illustriousxl_lora_nochekaiser.json index 9a8aadc..4ef5dad 100644 --- a/data/actions/fellatio_on_couch_illustriousxl_lora_nochekaiser.json +++ b/data/actions/fellatio_on_couch_illustriousxl_lora_nochekaiser.json @@ -2,37 +2,36 @@ "action_id": "fellatio_on_couch_illustriousxl_lora_nochekaiser", "action_name": "Fellatio On Couch Illustriousxl Lora Nochekaiser", "action": { - "full_body": "kneeling on couch, leaning forward, performing fellatio, sexual act, duo focus", - "head": "face in crotch, mouth open, sucking, cheeks hollowed, saliva trail", - "eyes": "looking up, half-closed eyes, eye contact, ahegao", - "arms": "reaching forward, holding partner's thighs, resting on cushions", - "hands": "stroking penis, gripping legs, guiding head", - "torso": "leaning forward, bent over, arched back", - "pelvis": "kneeling, hips pushed back", - "legs": "kneeling on sofa, spread slightly, knees bent", - "feet": "toes curled, resting on upholstery, plantar flexion", - "additional": "indoor, living room, sofa, couch, fabric texture, motion lines" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "fellatio, sitting, on_couch, hetero, oral", + "head": "blush, sweat, head_down", + "eyes": "looking_down, eyes_closed", + "arms": "arms_at_side", + "hands": "hands_on_legs", + "torso": "breast_press, nipples, nude, leaning_forward", + "pelvis": "sitting, nude", + "legs": "sitting, legs_apart", + "feet": "feet_on_floor", + "additional": "couch, penis, testicles, uncensored" }, "lora": { "lora_name": "Illustrious/Poses/fellatio-on-couch-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "fellatio-on-couch-illustriousxl-lora-nochekaiser" + "lora_triggers": "fellatio on couch, hetero, penis, oral, sitting, fellatio, testicles, blush, couch, sweat, breast press, nipples, completely nude, uncensored" }, "tags": [ "fellatio", - "oral sex", - "on couch", - "kneeling", - "sofa", + "on_couch", + "hetero", "penis", - "cum", - "saliva", - "indoor", - "sex", - "blowjob" + "oral", + "sitting", + "testicles", + "blush", + "sweat", + "breast_press", + "nipples", + "nude", + "uncensored", + "couch" ] } \ No newline at end of file diff --git a/data/actions/femdom_held_down_illust.json b/data/actions/femdom_held_down_illust.json index b7201ae..d746612 100644 --- a/data/actions/femdom_held_down_illust.json +++ b/data/actions/femdom_held_down_illust.json @@ -2,36 +2,31 @@ "action_id": "femdom_held_down_illust", "action_name": "Femdom Held Down Illust", "action": { - "full_body": "dominant character straddling someone, pinning them to the surface, assertive posture, on top", - "head": "looking down at viewer (pov), dominance expression, chin tilted down", - "eyes": "narrowed, intense eye contact, looking down", - "arms": "extended downwards, locked elbows, exerting pressure", - "hands": "forcefully holding wrists against the surface, pinning hands, wrist grab", - "torso": "leaning forward slightly, arching back, looming over", - "pelvis": "straddling the subject's waist or chest, hips grounded", - "legs": "knees bent, kneeling on either side of the subject, thighs active", - "feet": "kneeling position, toes touching the ground or bed", - "additional": "pov, from below, power dynamic, submission, floor or bed background" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "girl_on_top, straddling, lying_on_back", + "head": "looking_down, looking_at_another", + "eyes": "forced_eye_contact", + "arms": "holding_another's_wrists, arms_above_head", + "hands": "grab, clenched_hands", + "torso": "on_back", + "pelvis": "straddled", + "legs": "spread_legs", + "feet": "barefoot", + "additional": "femdom, struggling, pinned, assertive_female" }, "lora": { "lora_name": "Illustrious/Poses/Femdom_Held_Down_Illust.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Femdom_Held_Down_Illust" + "lora_weight": 0.8, + "lora_triggers": "fdom_held" }, "tags": [ "femdom", - "held down", - "pinning", + "assertive_female", + "rough_sex", + "girl_on_top", "straddling", - "on top", - "looking down", - "pov", - "from below", - "wrist grab", - "dominance" + "holding_another's_wrists", + "lying_on_back", + "pinned", + "struggling" ] } \ No newline at end of file diff --git a/data/actions/fertilization_illustriousxl_lora_nochekaiser.json b/data/actions/fertilization_illustriousxl_lora_nochekaiser.json index c8c8224..ae16d3e 100644 --- a/data/actions/fertilization_illustriousxl_lora_nochekaiser.json +++ b/data/actions/fertilization_illustriousxl_lora_nochekaiser.json @@ -2,34 +2,34 @@ "action_id": "fertilization_illustriousxl_lora_nochekaiser", "action_name": "Fertilization Illustriousxl Lora Nochekaiser", "action": { - "full_body": "lying on back, legs spread, internal view, cross-section, x-ray view of abdomen", - "head": "head resting on pillow, heavy breathing, blushing", - "eyes": "half-closed eyes, rolled back eyes or heart-shaped pupils", - "arms": "arms resting at sides or holding bed sheets", - "hands": "hands clutching sheets or resting on stomach", - "torso": "exposed tummy, navel, transparent skin effect", - "pelvis": "focus on womb, uterus visible, internal female anatomy", - "legs": "legs spread wide, m-legs, knees up", - "feet": "toes curled", - "additional": "visualized fertilization process, sperm, egg, cum inside, glowing internal organs, detailed uterus, biology diagram style" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sex, vaginal, on_bed, nude, cowboy_shot", + "head": "ahegao, blush, open_mouth, head_back", + "eyes": "rolled_eyes, half_closed_eyes", + "arms": "arms_at_sides", + "hands": "clenched_hands", + "torso": "nude, nipples, navel", + "pelvis": "pussy, cum_in_pussy, internal_cumshot, penis, hetero", + "legs": "spread_legs, legs_up", + "feet": "bare_feet", + "additional": "cross-section, fertilization, impregnation, uterus, ovum, sperm_cell, ovaries, ejaculation" }, "lora": { "lora_name": "Illustrious/Poses/fertilization-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "fertilization-illustriousxl-lora-nochekaiser" + "lora_triggers": "fertilization, ovum, impregnation, sperm cell, cross-section, cum in pussy, internal cumshot, uterus, cum, sex, vaginal, ovaries, penis, hetero, ejaculation" }, "tags": [ "fertilization", - "internal view", "cross-section", - "x-ray", - "womb", - "cum inside", + "ovum", + "sperm_cell", + "impregnation", "uterus", - "impregnation" + "internal_cumshot", + "cum_in_pussy", + "vaginal", + "ovaries", + "ahegao", + "on_bed" ] } \ No newline at end of file diff --git a/data/actions/fff_imminent_masturbation.json b/data/actions/fff_imminent_masturbation.json index 3ed0220..98b8f57 100644 --- a/data/actions/fff_imminent_masturbation.json +++ b/data/actions/fff_imminent_masturbation.json @@ -2,38 +2,32 @@ "action_id": "fff_imminent_masturbation", "action_name": "Fff Imminent Masturbation", "action": { - "full_body": "lying on back, reclining mostly nude, body tense with anticipation", - "head": "tilted back slightly, chin up, face flushed", - "eyes": "half-closed, heavy-lidded, lustful gaze", - "arms": "reaching downwards along the body", - "hands": "hovering near genitals, fingers spreading, one hand grasping thigh, one hand reaching into panties or towards crotch", - "torso": "arched back, chest heaving", - "pelvis": "tilted upward, hips lifted slightly", - "legs": "spread wide, knees bent and falling outward (M-legs)", - "feet": "toes curled", - "additional": "sweaty skin, disheveled clothing, underwear pulled aside, messy sheets" - }, - "participants": { - "solo_focus": "false", - "orientation": "FFF" + "full_body": "hand_on_own_crotch, trembling, legs_together, knock-kneed", + "head": "heavy_breathing, sweating, looking_down", + "eyes": "narrowed_eyes, half-closed_eyes, dilated_pupils", + "arms": "arms_down, hand_between_legs", + "hands": "hand_on_own_crotch, squeezing, rubbing_crotch", + "torso": "arched_back, squirming", + "pelvis": "hips_forward", + "legs": "legs_together, knock-kneed", + "feet": "standing", + "additional": "clothed_masturbation, urgency, arousal, through_clothes" }, "lora": { "lora_name": "Illustrious/Poses/FFF_imminent_masturbation.safetensors", "lora_weight": 1.0, - "lora_triggers": "FFF_imminent_masturbation" + "lora_triggers": "FFF_grabbing_own_crotch, trembling, sweat, breath, imminent_masturbation" }, "tags": [ - "solo", - "female", - "imminent masturbation", - "hand near crotch", - "hand in panties", - "fingering", - "spread legs", - "lying", - "on bed", - "aroused", + "hand_on_own_crotch", + "heavy_breathing", + "trembling", + "sweat", "blush", - "nsfw" + "legs_together", + "clothed_masturbation", + "hand_between_legs", + "aroused", + "rubbing_crotch" ] } \ No newline at end of file diff --git a/data/actions/ffm_threesome___kiss_and_fellatio_illustrious.json b/data/actions/ffm_threesome___kiss_and_fellatio_illustrious.json index d8f4981..db45d92 100644 --- a/data/actions/ffm_threesome___kiss_and_fellatio_illustrious.json +++ b/data/actions/ffm_threesome___kiss_and_fellatio_illustrious.json @@ -2,37 +2,37 @@ "action_id": "ffm_threesome___kiss_and_fellatio_illustrious", "action_name": "Ffm Threesome Kiss And Fellatio Illustrious", "action": { - "full_body": "FFM threesome composition, 1boy between 2girls, simultaneous sexual activity", - "head": "one female kissing the male deep french kiss, second female bobbing head at crotch level", - "eyes": "eyes closed in pleasure, half-lidded, rolling back", - "arms": "wrapping around neck, holding head, bracing on thighs", - "hands": "fingers tangled in hair, holding penis, guiding head, groping", - "torso": "leaning forward, arched back, sitting upright", - "pelvis": "kneeling, sitting on lap, hips thrust forward", - "legs": "kneeling, spread legs, wrapped around waist", - "feet": "arched feet, curled toes", - "additional": "saliva trail, tongue, penis in mouth, cheek poking, blush, sweat, intimate lighting" - }, - "participants": { - "solo_focus": "false", - "orientation": "FFM" + "full_body": "ffm_threesome, 2girls, 1boy, group_sex, sandwich_position", + "head": "kissing, sucking, head_grab", + "eyes": "closed_eyes, looking_at_partner", + "arms": "arms_around_neck, holding_penis, hand_on_head", + "hands": "stroking", + "torso": "leaning_forward, physical_contact", + "pelvis": "sitting, straddling", + "legs": "kneeling, spread_legs", + "feet": "barefoot", + "additional": "indoor, couch, faceless_male, saliva, blush" }, "lora": { "lora_name": "Illustrious/Poses/FFM_threesome_-_Kiss_and_Fellatio_Illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "FFM_threesome_-_Kiss_and_Fellatio_Illustrious" + "lora_triggers": "ffm_threesome_kiss_and_fellatio" }, "tags": [ - "ffm", - "threesome", - "group sex", - "kissing", - "fellatio", - "blowjob", "2girls", "1boy", - "simultaneous oral", - "french kiss", - "penis in mouth" + "ffm_threesome", + "group_sex", + "hetero", + "kissing", + "fellatio", + "faceless_male", + "sitting", + "couch", + "indoor", + "nude", + "blush", + "saliva", + "sandwich_position" ] } \ No newline at end of file diff --git a/data/actions/ffm_threesome_girl_sandwichdouble_dip_illustrious.json b/data/actions/ffm_threesome_girl_sandwichdouble_dip_illustrious.json new file mode 100644 index 0000000..84d6e75 --- /dev/null +++ b/data/actions/ffm_threesome_girl_sandwichdouble_dip_illustrious.json @@ -0,0 +1,40 @@ +{ + "action_id": "ffm_threesome_girl_sandwichdouble_dip_illustrious", + "action_name": "Ffm Threesome Girl Sandwichdouble Dip Illustrious", + "action": { + "full_body": "Three-person stack on a bed: one girl lying flat on her back, the male (often faceless/obscured) positioned in the middle, and the second girl straddling on top of the pile.", + "head": "Girls' faces visible, often with flushed cheeks or ahegao expressions; male face usually out of frame or obscured.", + "eyes": "rolled_back, closed_eyes, or looking_at_viewer", + "arms": "Arms embracing the partner in the middle or holding bed sheets.", + "hands": "grabbing_sheet or touching_partner", + "torso": "Sandwiched torsos, breasts pressed against the middle partner.", + "pelvis": "Interconnected pelvises, implied penetration.", + "legs": "Bottom girl with legs_spread, top girl straddling.", + "feet": "barefoot", + "additional": "Scene typically set on a bed with messy sheets." + }, + "lora": { + "lora_name": "Illustrious/Poses/FFM_threesome_girl_sandwichdouble_dip_Illustrious.safetensors", + "lora_weight": 1.0, + "lora_triggers": "ffm_threesome_double_dip" + }, + "tags": [ + "ffm_threesome", + "group_sex", + "sandwiched", + "2girls", + "1boy", + "girl_on_top", + "on_back", + "lying", + "straddling", + "faceless_male", + "male_on_top", + "stack", + "sex", + "implied_penetration", + "ahegao", + "bed_sheet", + "messy_bed" + ] +} \ No newline at end of file diff --git a/data/actions/ffm_threesome_one_girl_on_top_and_bj.json b/data/actions/ffm_threesome_one_girl_on_top_and_bj.json index daa3f4f..c14b870 100644 --- a/data/actions/ffm_threesome_one_girl_on_top_and_bj.json +++ b/data/actions/ffm_threesome_one_girl_on_top_and_bj.json @@ -2,39 +2,37 @@ "action_id": "ffm_threesome_one_girl_on_top_and_bj", "action_name": "Ffm Threesome One Girl On Top And Bj", "action": { - "full_body": "FFM threesome scene consisting of a male lying on his back on a bed, one female straddling his hips in a cowgirl position, and a second female positioned near his head or upper body", - "head": "heads close together, expressions of pleasure, mouth open, blushing", - "eyes": "rolled back, heart-shaped pupils, closed eyes, looking down", - "arms": "reaching out, holding hips, caressing face, resting on bed", - "hands": "gripping waist, holding hair, touching chest", - "torso": "arching back, leaning forward, sweat on skin, bare skin", - "pelvis": "interlocking hips, straddling, grinding motion", - "legs": "kneeling, spread wide, bent at knees", - "feet": "toes curled, resting on mattress", - "additional": "bedroom setting, crumpled sheets, intimate atmosphere, soft lighting" - }, - "participants": { - "solo_focus": "false", - "orientation": "FFM" + "full_body": "ffm_threesome, cowgirl_position, straddling, lying, on_back", + "head": "blush, half-closed_eyes", + "eyes": "half-closed_eyes", + "arms": "arms_at_sides", + "hands": "hands_on_chest", + "torso": "nude, breasts", + "pelvis": "legs_apart, straddling", + "legs": "kneeling, bent_legs", + "feet": "barefoot", + "additional": "fellatio, licking, penis, testicles, size_difference, 2girls, 1boy" }, "lora": { "lora_name": "Illustrious/Poses/FFM_threesome_one_girl_on_top_and_BJ.safetensors", "lora_weight": 1.0, - "lora_triggers": "FFM_threesome_one_girl_on_top_and_BJ" + "lora_triggers": "ffm_threesome_straddling_fellatio" }, "tags": [ + "ffm_threesome", + "cowgirl_position", + "fellatio", + "straddling", "2girls", "1boy", - "ffm", - "threesome", - "cowgirl", - "fellatio", - "woman on top", + "reaction", + "lying", + "on_back", + "nude", "sex", - "vaginal", - "oral", - "group sex", - "lying on back", - "nude" + "penis", + "testicles", + "erotic", + "cum" ] } \ No newline at end of file diff --git a/data/actions/fixed_point_v2.json b/data/actions/fixed_point_v2.json index 4ced49d..daf07ea 100644 --- a/data/actions/fixed_point_v2.json +++ b/data/actions/fixed_point_v2.json @@ -2,33 +2,30 @@ "action_id": "fixed_point_v2", "action_name": "Fixed Point V2", "action": { - "full_body": "standing, assertive posture, foreshortening effect on the arm", - "head": "facing viewer, chin slightly tucked or tilted confidentially", - "eyes": "looking at viewer, focused gaze, winking or intense stare", - "arms": "arm extended forward towards the camera, elbow straight or slightly bent", - "hands": "finger gun, pointing, index finger extended, thumb raised, hand gesture", - "torso": "facing forward, slight rotation to align with the pointing arm", - "pelvis": "neutral standing position", - "legs": "standing, hip width apart", - "feet": "grounded", - "additional": "depth of field, focus on hand, perspective usually from front" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling on floor in bedroom", + "head": "looking at viewer", + "eyes": "open eyes", + "arms": "resting on bed", + "hands": "resting", + "torso": "facing viewer", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "barefoot", + "additional": "full room view, fxdpt" }, "lora": { "lora_name": "Illustrious/Poses/fixed_point_v2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "fixed_point_v2" + "lora_weight": 0.8, + "lora_triggers": "fxdpt, full room view" }, "tags": [ - "gesture", - "finger gun", - "pointing", - "aiming", - "looking at viewer", - "foreshortening", - "bang" + "kneeling", + "on_floor", + "indoors", + "bedroom", + "bed", + "wide_shot", + "from_above", + "perspective" ] } \ No newline at end of file diff --git a/data/actions/flaccid_after_cum_illustrious_000009.json b/data/actions/flaccid_after_cum_illustrious_000009.json index 79b6098..3846910 100644 --- a/data/actions/flaccid_after_cum_illustrious_000009.json +++ b/data/actions/flaccid_after_cum_illustrious_000009.json @@ -2,33 +2,31 @@ "action_id": "flaccid_after_cum_illustrious_000009", "action_name": "Flaccid After Cum Illustrious 000009", "action": { - "full_body": "lying on back, limp pose, completely spent, relaxed muscles, spread eagle", - "head": "head tilted back, mouth open, tongue hanging out, messy hair, heavy breathing", - "eyes": "half-closed eyes, eyes rolled back, glassy eyes, ahegao", - "arms": "arms spread wide, limp arms, resting on surface", - "hands": "loosely open hands, twitching fingers", - "torso": "heaving chest, sweating skin, relaxed abdomen", - "pelvis": "exposed, hips flat on surface", - "legs": "legs spread wide, m-legs, knees bent and falling outward", - "feet": "toes curled", - "additional": "covered in white liquid, messy body, bodily fluids, after sex, exhaustion, sweat drops" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "exhausted post-coital slump, relaxing", + "head": "flushed face, head tilted back, disheveled hair", + "eyes": "half-closed, ahegao or glazed expression", + "arms": "limp, resting at sides", + "hands": "relaxed, open", + "torso": "sweaty skin, heaving chest", + "pelvis": "flaccid penis exposed, soft, seminal fluid leaking", + "legs": "spread wide, relaxed", + "feet": "loose", + "additional": "messy bed sheets, heavy breathing, steamy atmosphere" }, "lora": { "lora_name": "Illustrious/Poses/Flaccid_After_Cum_Illustrious-000009.safetensors", "lora_weight": 1.0, - "lora_triggers": "Flaccid_After_Cum_Illustrious-000009" + "lora_triggers": "flaccid after cum" }, "tags": [ - "lying", + "after_sex", + "flaccid", + "cum_in_pussy", "sweat", - "blush", - "open mouth", - "bodily fluids", - "spread legs", - "ahegao" + "heavy_breathing", + "messy_hair", + "cum_on_body", + "cum_in_mouth", + "after_fellatio" ] } \ No newline at end of file diff --git a/data/actions/full_body_blowjob.json b/data/actions/full_body_blowjob.json new file mode 100644 index 0000000..223b885 --- /dev/null +++ b/data/actions/full_body_blowjob.json @@ -0,0 +1,35 @@ +{ + "action_id": "full_body_blowjob", + "action_name": "Full Body Blowjob", + "action": { + "full_body": "fellatio, full_body, from_side", + "head": "cheek_bulge", + "eyes": "half-closed_eyes", + "arms": "reaching", + "hands": "penis_grab", + "torso": "leaning_forward, nude", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "barefoot", + "additional": "saliva_trail, head_grab" + }, + "lora": { + "lora_name": "Illustrious/Poses/full_body_blowjob.safetensors", + "lora_weight": 0.9, + "lora_triggers": "full_body_blowjob" + }, + "tags": [ + "fellatio", + "full_body", + "from_side", + "kneeling", + "penis", + "nude", + "1girl", + "1boy", + "oral", + "cheek_bulge", + "head_grab", + "penis_grab" + ] +} \ No newline at end of file diff --git a/data/actions/futa_on_female_000051_1_.json b/data/actions/futa_on_female_000051_1_.json index 46159af..cc78070 100644 --- a/data/actions/futa_on_female_000051_1_.json +++ b/data/actions/futa_on_female_000051_1_.json @@ -2,40 +2,28 @@ "action_id": "futa_on_female_000051_1_", "action_name": "Futa On Female 000051 1 ", "action": { - "full_body": "intimate duo pose, futanari character positioning closely on top of female character, missionary or pressing variance", - "head": "flushed complexion, heavy breathing, looking at partner", - "eyes": "half-closed in pleasure, heart-shaped pupils, watery eyes", - "arms": "arms supporting weight on surface or embracing partner", - "hands": "grasping partner's shoulders or hips, fingers digging into skin", - "torso": "sweaty skin, leaning forward, chest contact", - "pelvis": "interlocked hips, penetrating action, engaged core", - "legs": "kneeling between partner's thighs, thighs touching", - "feet": "toes curled, arched feet", - "additional": "bodily fluids, motion lines, sweat, messy bed sheets" - }, - "participants": { - "solo_focus": "false", - "orientation": "FF" + "full_body": "2girls, futa_with_female, sex", + "head": "looking_at_viewer, blush", + "eyes": "open_eyes", + "arms": "braided_arms, grabbing_hips", + "hands": "on_hips", + "torso": "breasts, nipples", + "pelvis": "futanari, penis, vaginal, pussy", + "legs": "spread_legs, straddling", + "feet": "barefoot", + "additional": "duo, bodily_fluids" }, "lora": { "lora_name": "Illustrious/Poses/Futa_on_Female-000051(1).safetensors", "lora_weight": 1.0, - "lora_triggers": "Futa_on_Female-000051(1)" + "lora_triggers": "futa with female" }, "tags": [ + "futa_with_female", "futanari", - "futa_on_female", - "1girl", - "1futanari", + "2girls", "vaginal", "sex", - "penis", - "erection", - "pussy", - "cum", - "sweat", - "blush", - "duo", - "nsfw" + "breasts" ] } \ No newline at end of file diff --git a/data/actions/giantess_cunnilingus_illustrious.json b/data/actions/giantess_cunnilingus_illustrious.json index 5490d02..b8d78bd 100644 --- a/data/actions/giantess_cunnilingus_illustrious.json +++ b/data/actions/giantess_cunnilingus_illustrious.json @@ -2,36 +2,36 @@ "action_id": "giantess_cunnilingus_illustrious", "action_name": "Giantess Cunnilingus Illustrious", "action": { - "full_body": "giantess, size difference, recumbent, m-legs, lying on back, low angle view, from below", - "head": "pleasured expression, heavy blush, mouth open, head thrown back, panting", - "eyes": "half-closed eyes, rolling eyes, heart-shaped pupils, ahegao", - "arms": "arms spread, resting", - "hands": "hands grasping sheets, clenching", - "torso": "large breasts, heaving chest, arched back", - "pelvis": "legs spread wide, exposed pussy, wet", - "legs": "spread legs, bent knees, thick thighs", - "feet": "toes curled", - "additional": "cunnilingus, oral sex, licking, tongue, saliva, micro male, miniguy, shrunken partner, pov" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "A tall female giantess standing, often leaning back against a wall, while a much shorter male performs cunnilingus.", + "head": "Looking down, often laughing or with a happy/aroused expression.", + "eyes": "Looking down at partner.", + "arms": "Hands placed on the partner's head, pressing it into her crotch or grabbing their hair.", + "hands": "Hands upon another's head, holding head.", + "torso": "Leaning back slightly, often against a vertical surface.", + "pelvis": "Thrust forward or positioned for access.", + "legs": "Standing, legs apart or one leg lifted (leg lock).", + "feet": "Standing on ground.", + "additional": "Extreme size difference emphasized." }, "lora": { "lora_name": "Illustrious/Poses/Giantess_Cunnilingus_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Giantess_Cunnilingus_Illustrious" + "lora_weight": 0.8, + "lora_triggers": "giantess cunnilingus, tall_female, short_male" }, "tags": [ - "illustrious (azur lane)", "giantess", "cunnilingus", - "size difference", - "micro", - "low angle", - "m-legs", - "oral sex", + "standing_cunnilingus", "femdom", - "anime center" + "size_difference", + "tall_female", + "short_male", + "hands_on_another's_head", + "leaning_back", + "against_wall", + "laughing", + "looking_down", + "face_in_crotch", + "leg_lock" ] } \ No newline at end of file diff --git a/data/actions/giantess_missionary_000037.json b/data/actions/giantess_missionary_000037.json index 9c34e42..643296a 100644 --- a/data/actions/giantess_missionary_000037.json +++ b/data/actions/giantess_missionary_000037.json @@ -2,33 +2,32 @@ "action_id": "giantess_missionary_000037", "action_name": "Giantess Missionary 000037", "action": { - "full_body": "lying on back, missionary position, legs spread, engaging in sexual activity, large female figure dominating perspective", - "head": "head resting on pillow, looking down at partner or looking up in pleasure", - "eyes": "half-closed eyes, looking at viewer, or rolled back", - "arms": "reaching up, wrapping around partner, or resting on surface", - "hands": "grasping sheets, holding partner, or open palms", - "torso": "chest facing up, breasts pressed or swaying", - "pelvis": "hips centered, groin exposed, receiving", - "legs": "spread legs, knees bent, legs in variable m-shape or wrapping around partner", - "feet": "toes curled, feet in air or resting on bed", - "additional": "giantess, size difference, micro male (optional context), low angle view" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "missionary, lying, on_back, size_difference, giantess, larger_female", + "head": "face_between_breasts, burying_face", + "eyes": "closed_eyes, expressionless", + "arms": "hug, arms_around_back", + "hands": "hands_on_back", + "torso": "breasts, cleavage, large_breasts", + "pelvis": "hops", + "legs": "spread_legs, legs_up", + "feet": "barefoot", + "additional": "male_on_top, hetero, bearhug, femdom" }, "lora": { "lora_name": "Illustrious/Poses/Giantess_Missionary-000037.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Giantess_Missionary-000037" + "lora_weight": 0.9, + "lora_triggers": "M0t0rB0atM1ss10nary" }, "tags": [ "missionary", "giantess", - "lying on back", - "legs spread", - "size difference", - "sex", - "vaginal" + "size_difference", + "larger_female", + "face_between_breasts", + "hug", + "spread_legs", + "lying", + "on_back", + "cleavage" ] } \ No newline at end of file diff --git a/data/actions/girls_lineup_il_1144149.json b/data/actions/girls_lineup_il_1144149.json index d7de43e..4576b3c 100644 --- a/data/actions/girls_lineup_il_1144149.json +++ b/data/actions/girls_lineup_il_1144149.json @@ -2,35 +2,28 @@ "action_id": "girls_lineup_il_1144149", "action_name": "Girls Lineup Il 1144149", "action": { - "full_body": "standing, police lineup, mugshot, full body shot", - "head": "looking at viewer, neutral expression, facing forward", - "eyes": "open eyes, staring", - "arms": "arms at sides, arms behind back", - "hands": "hands behind back", - "torso": "facing forward, upright posture", - "pelvis": "facing forward", - "legs": "standing straight, feet shoulder width apart", - "feet": "flat on ground", - "additional": "height chart, wall markings, measurement lines, police station background, indoor, simple background" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "multiple girls standing in a row", + "head": "facing viewer", + "eyes": "looking at viewer", + "arms": "arms at sides", + "hands": "hands at sides", + "torso": "standing", + "pelvis": "facing viewer", + "legs": "standing", + "feet": "standing", + "additional": "simple background" }, "lora": { "lora_name": "Illustrious/Poses/girls_lineup_IL_1144149.safetensors", "lora_weight": 1.0, - "lora_triggers": "girls_lineup_IL_1144149" + "lora_triggers": "lineup" }, "tags": [ - "police lineup", - "mugshot", - "height chart", + "lineup", + "multiple_girls", "standing", - "criminal", - "arrest", - "prison", - "law enforcement", - "measurement" + "facing_viewer", + "looking_at_viewer", + "simple_background" ] } \ No newline at end of file diff --git a/data/actions/glory_wall_stuck_illustrious.json b/data/actions/glory_wall_stuck_illustrious.json index 11c0ff2..e742a95 100644 --- a/data/actions/glory_wall_stuck_illustrious.json +++ b/data/actions/glory_wall_stuck_illustrious.json @@ -2,34 +2,32 @@ "action_id": "glory_wall_stuck_illustrious", "action_name": "Glory Wall Stuck Illustrious", "action": { - "full_body": "character stuck in wall, bent over pose, viewed from behind, lower body exposed", - "head": "head through hole, hidden inside wall", - "eyes": "not visible", - "arms": "arms through hole, reaching forward or bracing against the other side", - "hands": "not visible", - "torso": "upper torso obscured by wall, bent forward 90 degrees", - "pelvis": "hips trapped in hole, stuck fast, protruding rear", - "legs": "standing, legs spread apart, knees slightly bent for stability", - "feet": "standing on ground, possibly on tiptoes", - "additional": "wooden or concrete wall, circular hole, sense of entrapment, struggling" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "stuck, bent_over, from_behind", + "head": "looking_back, looking_at_viewer", + "eyes": "looking_at_viewer", + "arms": "arms_behind_back", + "hands": "hands_on_wall", + "torso": "bent_over", + "pelvis": "ass, ass_focus, panties, underwear, pussy", + "legs": "legs_up, standing", + "feet": "barefoot, shoes", + "additional": "glory_hole, wall" }, "lora": { "lora_name": "Illustrious/Poses/Glory_Wall_Stuck_illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "Glory_Wall_Stuck_illustrious" + "lora_triggers": "glory_wall_stuck" }, "tags": [ - "stuck in wall", - "glory hole", - "bent over", - "from behind", - "trapped", - "lower body", - "legs apart", - "stuck" + "stuck", + "glory_hole", + "ass_focus", + "from_behind", + "looking_back", + "bent_over", + "ass", + "panties", + "legs_up", + "wall" ] } \ No newline at end of file diff --git a/data/actions/goblin_molestation_illustrious.json b/data/actions/goblin_molestation_illustrious.json new file mode 100644 index 0000000..34ec446 --- /dev/null +++ b/data/actions/goblin_molestation_illustrious.json @@ -0,0 +1,33 @@ +{ + "action_id": "goblin_molestation_illustrious", + "action_name": "Goblin Molestation Illustrious", + "action": { + "full_body": "1girl surrounded by multiple small goblins in a gangbang scenario", + "head": "flustered, ahegao, or distressed expression", + "eyes": "tearing, rolling back, or heart-shaped pupils", + "arms": "restrained, held back, or grabbing sheets", + "hands": "clenched or grasped by goblins", + "torso": "exposed, pinned down, size difference emphasized", + "pelvis": "engaged in sexual activity, hips lifted", + "legs": "m-legs, spread wide, or held up by goblins", + "feet": "toes curled in pleasure or pain", + "additional": "size difference, bodily fluids, messy environment, cave background" + }, + "lora": { + "lora_name": "Illustrious/Poses/Goblin_Molestation_Illustrious.safetensors", + "lora_weight": 0.8, + "lora_triggers": "Goblinestation, gangbang, many goblins, multiple boys, 1girl, sex" + }, + "tags": [ + "1girl", + "goblin", + "multiple_boys", + "gangbang", + "group_sex", + "sex", + "cum", + "size_difference", + "surrounded", + "rape" + ] +} \ No newline at end of file diff --git a/data/actions/goblin_sucking_boobs_illustrious.json b/data/actions/goblin_sucking_boobs_illustrious.json index 2cf0fab..5f76463 100644 --- a/data/actions/goblin_sucking_boobs_illustrious.json +++ b/data/actions/goblin_sucking_boobs_illustrious.json @@ -2,33 +2,30 @@ "action_id": "goblin_sucking_boobs_illustrious", "action_name": "Goblin Sucking Boobs Illustrious", "action": { - "full_body": "size difference, intimate interaction, a small goblin clinging to the torso of a larger female character", - "head": "looking down, expression of pleasure or surprise, heavy blush, saliva", - "eyes": "half-closed eyes, heart-shaped pupils, looking at goblin", - "arms": "cradling the goblin, holding the goblin's head, pressing breast to mouth", - "hands": "fingers spread, holding the creature, squeezing breast", - "torso": "exposed breasts, breast sucking, nipple stimulation, arching back", - "pelvis": "slightly pushed forward or seated pose", - "legs": "standing or sitting, relaxed stance", - "feet": "toes curled (if visible)", - "additional": "monster, goblin, green skin, pointy ears, height difference, nursing, lactation" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "1girl with a small goblin creature clinging to her chest", + "head": "goblin's head buried in cleavage or mouth attached to nipple", + "eyes": "girl looking down at the goblin or closed in sensation", + "arms": "goblin grabbing the breasts or clinging to the torso", + "hands": "goblin's hands kneading or holding the breasts", + "torso": "exposed breasts being suckled", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "size difference between the large female character and the small goblin" }, "lora": { "lora_name": "Illustrious/Poses/Goblin_sucking_boobs_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Goblin_sucking_boobs_Illustrious" + "lora_weight": 0.8, + "lora_triggers": "goblin breastfeeding, goblin, breast sucking" }, "tags": [ "goblin", - "breast sucking", - "size difference", + "breast_sucking", + "breastfeeding", "monster", - "duo", "lactation", - "nsfw" + "1girl", + "monster_boy", + "size_difference" ] } \ No newline at end of file diff --git a/data/actions/goblins_burrow_il_nai_py.json b/data/actions/goblins_burrow_il_nai_py.json index ba5305f..96d76c9 100644 --- a/data/actions/goblins_burrow_il_nai_py.json +++ b/data/actions/goblins_burrow_il_nai_py.json @@ -2,37 +2,37 @@ "action_id": "goblins_burrow_il_nai_py", "action_name": "Goblins Burrow Il Nai Py", "action": { - "full_body": "size difference, character crouching low to the ground in a deep, feral squat or crawling position", - "head": "tilted upward or hunched low, often with a mischievous or feral expression, tongue out", - "eyes": "wide open, dilated pupils, looking up at viewer", - "arms": "reaching towards the ground between legs or resting on knees, elbows bent", - "hands": "palms on the floor or clawing at the ground, fingers spread", - "torso": "leaning forward sharply, hunched back or arched depending on angle, compact posture", - "pelvis": "lowered close to the heels, anterior pelvic tilt", - "legs": "knees bent deeply and spread wide apart, thighs pressing against ribs or opened outward", - "feet": "resting on toes with heels raised or flat on ground, indicating readiness to pounce", - "additional": "dynamic angle, low perspective, emphasis on hips and flexibility" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing_sex, carrying, interspecies, size_difference", + "head": "blush, sweat, ahegao", + "eyes": "closed_eyes, half-closed_eyes", + "arms": "embracing, arms_around_neck", + "hands": "clinging", + "torso": "large_breasts, nipples, nude", + "pelvis": "sex, cum_in_pussy, vaginal_penetration", + "legs": "spread_legs, wrapped_around", + "feet": "barefoot", + "additional": "cave, outdoors, torn_clothes, peephole" }, "lora": { "lora_name": "Illustrious/Poses/Goblins burrow-IL_NAI_PY.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Goblins burrow-IL_NAI_PY" + "lora_weight": 0.6, + "lora_triggers": "goblin, burrow, frog embrace position" }, "tags": [ - "squatting", - "crouching", - "goblin mode", - "feral", - "spread legs", - "knees apart", - "on toes", - "all fours", - "looking up", - "shortstack", - "hunched over" + "goblin", + "standing_sex", + "size_difference", + "interspecies", + "spread_legs", + "carrying", + "cave", + "outdoors", + "sweat", + "blush", + "torn_clothes", + "cum", + "peephole", + "1girl", + "1boy" ] } \ No newline at end of file diff --git a/data/actions/guided_penetration_illustrious_v1_0.json b/data/actions/guided_penetration_illustrious_v1_0.json index d644d70..51e3ceb 100644 --- a/data/actions/guided_penetration_illustrious_v1_0.json +++ b/data/actions/guided_penetration_illustrious_v1_0.json @@ -2,31 +2,30 @@ "action_id": "guided_penetration_illustrious_v1_0", "action_name": "Guided Penetration Illustrious V1 0", "action": { - "full_body": "intimate sexual position, lying on back or missionary, lower body focus", - "head": "looking down, chin tucked, flushed face, heavy breathing", - "eyes": "focused on genitals, half-closed eyes, arousal", - "arms": "reaching down between legs", - "hands": "hand on penis, guiding penis, holding penis, fingers grasping shaft, touching tip", - "torso": "chest exposed, nipples visible, slight arch", - "pelvis": "exposed genitals, pussy, hips tilted up", - "legs": "spread legs, m legs, open legs, knees bent", - "feet": "relaxed or toes curled", - "additional": "penis, erection, insertion, just the tip, uncensored, sexual intercourse" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "guided_penetration", + "head": "looking_at_penis", + "eyes": "open_eyes", + "arms": "arms_extended", + "hands": "penis_grab", + "torso": "sex", + "pelvis": "vaginal", + "legs": "spread_legs", + "feet": "feet_out_of_frame", + "additional": "insertion" }, "lora": { "lora_name": "Illustrious/Poses/guided penetration_illustrious_V1.0.safetensors", - "lora_weight": 1.0, - "lora_triggers": "guided penetration_illustrious_V1.0" + "lora_weight": 1.1, + "lora_triggers": "guided penetration" }, "tags": [ - "guided penetration", - "hand on penis", + "guided_penetration", + "penis_grab", + "vaginal", "sex", - "insertion", - "guiding penis" + "1boy", + "1girl", + "penis", + "hands_on_penis" ] } \ No newline at end of file diff --git a/data/actions/gyaru_bitch_illustrious.json b/data/actions/gyaru_bitch_illustrious.json index 7ca0ff9..d8e00d2 100644 --- a/data/actions/gyaru_bitch_illustrious.json +++ b/data/actions/gyaru_bitch_illustrious.json @@ -2,32 +2,31 @@ "action_id": "gyaru_bitch_illustrious", "action_name": "Gyaru Bitch Illustrious", "action": { - "full_body": "standing pose, upper body leaning slightly forward to accentuate curves, confident and flashy posture", - "head": "tilted slightly to the side, chin down", - "eyes": "looking directly at viewer, heavy makeup, possibly winking", - "arms": "raised, elbows bent outwards", - "hands": "double peace sign, v-sign near face, aggressive finger splay", - "torso": "arched back significantly, emphasized chest", - "pelvis": "hips cocked to one side", - "legs": "standing with weight on one leg, other leg slightly bent at knee", - "feet": "planted firmly", - "additional": "exuding a haughty or teasing 'gal' atmosphere, flashy accessories" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "standing, energetic pose, looking_at_viewer", + "head": "blonde_hair, heavy_makeup, smiling, tanned_skin", + "eyes": "eyelashes, eyeshadow", + "arms": "hand_on_hip, arm_up", + "hands": "v_sign, long_fingernails", + "torso": "animal_print, revealing_clothes, cleavage, navel", + "pelvis": "short_skirt, hips", + "legs": "tanned_legs, standing", + "feet": "high_heels", + "additional": "jewelry, necklace, earrings" }, "lora": { "lora_name": "Illustrious/Poses/Gyaru_bitch_illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "Gyaru_bitch_illustrious" + "lora_triggers": "gyaru bitch, gyaru" }, "tags": [ - "double peace sign", "gyaru", - "smug", - "tongue out", - "leaning forward", - "tan" + "dark_skin", + "animal_print", + "long_fingernails", + "makeup", + "blonde_hair", + "jewelry", + "revealing_clothes", + "navel" ] } \ No newline at end of file diff --git a/data/actions/gyaru_v_illustriousxl_lora_nochekaiser.json b/data/actions/gyaru_v_illustriousxl_lora_nochekaiser.json index 6a6032a..b3d2949 100644 --- a/data/actions/gyaru_v_illustriousxl_lora_nochekaiser.json +++ b/data/actions/gyaru_v_illustriousxl_lora_nochekaiser.json @@ -2,34 +2,32 @@ "action_id": "gyaru_v_illustriousxl_lora_nochekaiser", "action_name": "Gyaru V Illustriousxl Lora Nochekaiser", "action": { - "full_body": "medium shot of a character performing the viral gyaru peace gesture, leaning slightly forward towards the viewer", - "head": "tilted slightly to the side with a confident or playful expression", - "eyes": "looking at viewer, winking or wide open", - "arms": "elbow bent, forearm raised and wrist rotated", - "hands": "inverted v-sign, peace sign fingers pointing down, palm facing inwards towards the body (gyaru peace)", - "torso": "upper body angled towards the camera", - "pelvis": "hips slightly cocked to the side", - "legs": "standing pose, weight on one leg", - "feet": "default standing position", - "additional": "focus on the specific inverted hand gesture characteristic of the 2020s gyaru trend" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "leaning_forward, standing or cowboy_shot", + "head": "tilted_head, smile, blush, open_mouth or grin", + "eyes": "one_eye_closed, glowing_eyes or winking, looking_at_viewer", + "arms": "arm_up, reaching_towards_viewer", + "hands": "v_over_eye, v_sign, fingers_near_face", + "torso": "leaning_forward, upper_body", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "selfie, gyaru, energetic atmosphere" }, "lora": { "lora_name": "Illustrious/Poses/gyaru-v-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "gyaru-v-illustriousxl-lora-nochekaiser" + "lora_triggers": "gyaruv" }, "tags": [ - "gyaru peace", - "inverted v-sign", - "peace sign", - "hand gesture", - "fingers pointing down", - "leaning forward", - "upper body", - "looking at viewer" + "gyaru", + "v_over_eye", + "leaning_forward", + "one_eye_closed", + "looking_at_viewer", + "blush", + "smile", + "selfie", + "open_mouth", + "grin" ] } \ No newline at end of file diff --git a/data/actions/hugging_doggystyle_illustriousxl_lora_nochekaiser.json b/data/actions/hugging_doggystyle_illustriousxl_lora_nochekaiser.json index 0e48ed6..a8c59ef 100644 --- a/data/actions/hugging_doggystyle_illustriousxl_lora_nochekaiser.json +++ b/data/actions/hugging_doggystyle_illustriousxl_lora_nochekaiser.json @@ -2,34 +2,34 @@ "action_id": "hugging_doggystyle_illustriousxl_lora_nochekaiser", "action_name": "Hugging Doggystyle Illustriousxl Lora Nochekaiser", "action": { - "full_body": "duo, 2 persons, doggystyle, from behind, all fours, intimate interaction", - "head": "looking back, head resting on shoulder, cheek to cheek, face buried in hair", - "eyes": "closed eyes, affectionate gaze, half-closed eyes", - "arms": "arms around waist, arms around neck, hugging, supporting body weight", - "hands": "hands on ground, hands clasping partner, grabbing sheets", - "torso": "arched back, bent over, chest pressed against back, leaning forward", - "pelvis": "kneeling, hips raised, bottom up", - "legs": "kneeling, bent knees, legs spread", - "feet": "barefoot, toes curled", - "additional": "sex from behind, affectionate, cuddling, romantic, indoor" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "doggystyle, all_fours, sex_from_behind", + "head": "blush, sweat, open_mouth", + "eyes": "rolled_eyes, closed_eyes", + "arms": "hug, hug_from_behind", + "hands": "hands_on_sheets", + "torso": "hanging_breasts, bent_over, trembling", + "pelvis": "hips", + "legs": "kneeling, spread_legs", + "feet": "toes", + "additional": "completely_nude, motion_lines, hetero, sex" }, "lora": { "lora_name": "Illustrious/Poses/hugging-doggystyle-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "hugging-doggystyle-illustriousxl-lora-nochekaiser" + "lora_triggers": "hugging doggystyle, hug, doggystyle, sex_from_behind" }, "tags": [ "hugging_doggystyle", + "hug", "doggystyle", - "hugging", - "from behind", - "all fours", - "duo", - "intimate", - "kneeling" + "sex_from_behind", + "all_fours", + "hug_from_behind", + "hanging_breasts", + "trembling", + "sweat", + "open_mouth", + "completely_nude", + "motion_lines" ] } \ No newline at end of file diff --git a/data/actions/hugkissingbreast_press_pov_illustrious_000005.json b/data/actions/hugkissingbreast_press_pov_illustrious_000005.json index 80c4311..28c6846 100644 --- a/data/actions/hugkissingbreast_press_pov_illustrious_000005.json +++ b/data/actions/hugkissingbreast_press_pov_illustrious_000005.json @@ -2,34 +2,36 @@ "action_id": "hugkissingbreast_press_pov_illustrious_000005", "action_name": "Hugkissingbreast Press Pov Illustrious 000005", "action": { - "full_body": "pov, close-up, leaning towards viewer, intimate interaction", - "head": "face close to camera, tilted head, kissing motion", - "eyes": "closed eyes, half-closed eyes, affectionate gaze", - "arms": "reaching forward, wrapping around viewer, arms visible on sides", - "hands": "hands on viewer's shoulders, hands behind viewer's neck, or out of frame", - "torso": "chest pressed against viewer, breasts squished, breast press", - "pelvis": "close proximity to viewer, angled forward", - "legs": "not visible or cropped", + "full_body": "POV close-up of a character hugging and kissing the viewer with breasts pressed against the 'camera'", + "head": "tilted forward, kissing expression, often with tongue or saliva trail, intense focus", + "eyes": "closed_eyes or looking_at_viewer, passionate gaze", + "arms": "arms_around_neck or reaching_towards_viewer, embracing the viewer", + "hands": "touching viewer's face or gripping shoulders (off-screen reference)", + "torso": "breast_press against the viewer, reduced distance", + "pelvis": "not visible (close-up)", + "legs": "not visible", "feet": "not visible", - "additional": "blush, saliva trail, deeply romantic atmosphere, soft lighting" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "additional": "intimate atmosphere, blushing, french_kiss, saliva_trail" }, "lora": { "lora_name": "Illustrious/Poses/Hugkissingbreast_press_pov_Illustrious-000005.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Hugkissingbreast_press_pov_Illustrious-000005" + "lora_weight": 0.7, + "lora_triggers": "pov kiss, breast press" }, "tags": [ "pov", + "kiss", + "breast_press", "hug", - "kissing", - "breast press", + "french_kiss", "close-up", - "intimate", - "squeezing", - "couple" + "reaching_towards_viewer", + "arms_around_neck", + "closed_eyes", + "blush", + "saliva_trail", + "tongue", + "head_tilt", + "1girl" ] } \ No newline at end of file diff --git a/data/actions/id_card_after_sex_illustriousxl_lora_nochekaiser.json b/data/actions/id_card_after_sex_illustriousxl_lora_nochekaiser.json index 09eae22..8f4ff0f 100644 --- a/data/actions/id_card_after_sex_illustriousxl_lora_nochekaiser.json +++ b/data/actions/id_card_after_sex_illustriousxl_lora_nochekaiser.json @@ -2,36 +2,38 @@ "action_id": "id_card_after_sex_illustriousxl_lora_nochekaiser", "action_name": "Id Card After Sex Illustriousxl Lora Nochekaiser", "action": { - "full_body": "upper body shot, solo, character presenting identification in a disheveled state", - "head": "messy hair, hair over eyes, heavy blush, sweaty face, panting, mouth slightly open, slobber", - "eyes": "half-closed eyes, glazed eyes, moisture, looking at viewer", - "arms": "arm raised to chest or face level", - "hands": "holding id card, holding object, showing card to viewer", - "torso": "disheveled clothing, unbuttoned shirt, collarbone, sweat on skin, breast focus (if applicable)", - "pelvis": "not visible", - "legs": "not visible", - "feet": "not visible", - "additional": "blurry background, indoor lighting, intimate atmosphere, mugshot style composition" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "lying, on_bed, cowboy_shot, after_sex", + "head": "messy_hair, blush, sweat, drooling, heavy_breathing, looking_at_viewer", + "eyes": "half-closed_eyes", + "arms": "sheet_grab", + "hands": "holding_id_card", + "torso": "navel, sweat, breasts", + "pelvis": "bed_sheet, wet_spot", + "legs": "lying", + "feet": "barefoot", + "additional": "id_card, pov, interior" }, "lora": { "lora_name": "Illustrious/Poses/id-card-after-sex-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "id-card-after-sex-illustriousxl-lora-nochekaiser" + "lora_triggers": "id card after sex, id card, aftersex, bed sheet, blush, drooling, lying, sheet grab, sweat, holding id card, pov, cowboy shot" }, "tags": [ - "holding id card", - "messy hair", - "disheveled", - "heavy breathing", + "holding_id_card", + "id_card", + "after_sex", + "lying", + "on_bed", + "bed_sheet", "sweat", "blush", - "upper body", - "after sex", - "glazed eyes", - "open mouth" + "messy_hair", + "sheet_grab", + "drooling", + "heavy_breathing", + "wet_spot", + "navel", + "cowboy_shot", + "pov" ] } \ No newline at end of file diff --git a/data/actions/il_cheekbj.json b/data/actions/il_cheekbj.json new file mode 100644 index 0000000..229752f --- /dev/null +++ b/data/actions/il_cheekbj.json @@ -0,0 +1,28 @@ +{ + "action_id": "il_cheekbj", + "action_name": "Il Cheekbj", + "action": { + "full_body": "kneeling", + "head": "fellatio, cheek_bulge, open_mouth", + "eyes": "looking_at_viewer", + "arms": "hands_on_legs", + "hands": "resting", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "toes_on_ground", + "additional": "penis" + }, + "lora": { + "lora_name": "Illustrious/Poses/IL_cheekbj.safetensors", + "lora_weight": 0.8, + "lora_triggers": "ch33k_bj, one_cheek_bulge, fellatio" + }, + "tags": [ + "fellatio", + "cheek_bulge", + "kneeling", + "looking_at_viewer", + "penis" + ] +} \ No newline at end of file diff --git a/data/actions/illustrious_standing_cunnilingus_000010.json b/data/actions/illustrious_standing_cunnilingus_000010.json index 338bf1d..00794bf 100644 --- a/data/actions/illustrious_standing_cunnilingus_000010.json +++ b/data/actions/illustrious_standing_cunnilingus_000010.json @@ -2,32 +2,31 @@ "action_id": "illustrious_standing_cunnilingus_000010", "action_name": "Illustrious Standing Cunnilingus 000010", "action": { - "full_body": "duo focus, standing position, one person lifting another, standing cunnilingus, carry", - "head": "face buried in crotch, head between legs, ecstatic expression, tongue out", - "eyes": "eyes closed, rolling eyes, heart-shaped pupils", - "arms": "arms under buttocks, holding legs, arms wrapped around neck", - "hands": "squeezing butt, hands on head, fingers in hair", - "torso": "back arched, chest pressed", - "pelvis": "pussy exposed, genital contact", - "legs": "legs wrapped around waist, spread legs, legs over shoulders", - "feet": "toes curled, feet dangling", - "additional": "saliva, motion lines, sexual act" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing cunnilingus, femdom, 1girl standing, 1boy kneeling", + "head": "looking down, evil smirk", + "eyes": "looking at partner", + "arms": "arms at sides or arms behind head", + "hands": "resting on partner's head", + "torso": "facing viewer or facing partner", + "pelvis": "legs apart", + "legs": "standing", + "feet": "standing", + "additional": "male between legs, oral sex, forced cunnilingus" }, "lora": { "lora_name": "Illustrious/Poses/Illustrious_Standing_Cunnilingus-000010.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Illustrious_Standing_Cunnilingus-000010" + "lora_weight": 0.65, + "lora_triggers": "PWF1, pussy worship, femdom, cunnilingus, licks pussy, standing" }, "tags": [ - "standing cunnilingus", - "lifting person", - "carry", - "legs around waist", - "oral sex", - "nsfw" + "standing_cunnilingus", + "cunnilingus", + "femdom", + "standing", + "kneeling", + "looking_down", + "legs_apart", + "between_legs", + "forced_cunnilingus" ] } \ No newline at end of file diff --git a/data/actions/illustriousxl_size_difference_large_female.json b/data/actions/illustriousxl_size_difference_large_female.json index 5d759c5..a46e5df 100644 --- a/data/actions/illustriousxl_size_difference_large_female.json +++ b/data/actions/illustriousxl_size_difference_large_female.json @@ -2,33 +2,32 @@ "action_id": "illustriousxl_size_difference_large_female", "action_name": "Illustriousxl Size Difference Large Female", "action": { - "full_body": "towering female figure standing over a tiny environment or person, emphasizing extreme scale difference", - "head": "tilted downwards, looking down with curiosity or affection", - "eyes": "gazing intently at the object in hand or on the ground", - "arms": "elbows bent, lifting one hand closer to the face for inspection", - "hands": "palm open and facing up, cupping a tiny person or object gently", - "torso": "leaning slightly forward to reduce the distance to the smaller subject", - "pelvis": "neutral standing posture, hips slightly shifted", - "legs": "standing firm and pillar-like to emphasize stability and size", - "feet": "planted firmly on the ground, perhaps next to tiny buildings or trees for scale comparison", - "additional": "low angle view, depth of field, giantess theme, macro perspective on hand" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing, size_difference, height_difference, giantess, mini_person, duo", + "head": "looking_down, looking_at_another", + "eyes": "open_eyes", + "arms": "arms_at_sides", + "hands": "hands_down", + "torso": "upper_body, leaning_forward", + "pelvis": "hips", + "legs": "standing, long_legs", + "feet": "standing", + "additional": "low_angle, man_looking_up" }, "lora": { "lora_name": "Illustrious/Poses/IllustriousXL_Size_difference_large_female.safetensors", "lora_weight": 1.0, - "lora_triggers": "IllustriousXL_Size_difference_large_female" + "lora_triggers": "size difference, larger female, smaller male, tall female" }, "tags": [ - "size difference", + "size_difference", "giantess", - "looking down", - "holding tiny person", - "perspective", - "interaction", - "scale comparison" + "height_difference", + "tall_female", + "larger_female", + "mini_person", + "looking_down", + "looking_up", + "looking_at_another", + "standing" ] } \ No newline at end of file diff --git a/data/actions/ilst.json b/data/actions/ilst.json index 9ebfafd..19187ad 100644 --- a/data/actions/ilst.json +++ b/data/actions/ilst.json @@ -1,34 +1,32 @@ { "action_id": "ilst", - "action_name": "Imminent Facesitting", + "action_name": "Ilst", "action": { - "full_body": "pov, facesitting", - "head": "", - "eyes": "", - "arms": "", - "hands": "", - "torso": "", - "pelvis": "pussy, pussy juice", - "legs": "", - "feet": "", - "additional": "" - }, - "participants": { - "solo_focus": "true", - "orientation": "F" + "full_body": "squatting or standing over the viewer, dominating the frame", + "head": "looking down at viewer", + "eyes": "looking at viewer", + "arms": "reaching towards viewer, one hand extending down", + "hands": "reaching or gesturing towards the camera", + "torso": "leaning forward slightly", + "pelvis": "centered in view, from below angle", + "legs": "straddling the viewer, wide stance", + "feet": "planted on ground", + "additional": "perspective from below, intimate proximity" }, "lora": { "lora_name": "Illustrious/Poses/ILST.safetensors", - "lora_weight": 1.0, - "lora_triggers": "ILST" + "lora_weight": 0.9, + "lora_triggers": "Facesitting_POV, from below" }, "tags": [ - "standing split", - "leg hold", - "high kick", - "gymnastics", - "yoga", - "stretching", - "balance" + "imminent_facesitting", + "pov", + "from_below", + "squatting", + "standing", + "looking_at_viewer", + "reaching_towards_viewer", + "legs_apart", + "solo" ] } \ No newline at end of file diff --git a/data/actions/imminent_penetration_illustriousxl_lora_nochekaiser.json b/data/actions/imminent_penetration_illustriousxl_lora_nochekaiser.json index e1c0a75..6a0ad6b 100644 --- a/data/actions/imminent_penetration_illustriousxl_lora_nochekaiser.json +++ b/data/actions/imminent_penetration_illustriousxl_lora_nochekaiser.json @@ -2,36 +2,31 @@ "action_id": "imminent_penetration_illustriousxl_lora_nochekaiser", "action_name": "Imminent Penetration Illustriousxl Lora Nochekaiser", "action": { - "full_body": "lying on back, intimate close-up, sexual activity, extreme proximity to viewer", - "head": "heavily blushing, panting, mouth open, sweat, expression of anticipation or arousal", - "eyes": "half-closed eyes, upturned eyes, looking at viewer", - "arms": "reaching out or clutching bedsheets", - "hands": "hands gripping, knuckles white", - "torso": "arched back, heaving chest", - "pelvis": "hips lifted, genitals exposed, genital contact", - "legs": "spread legs, m-legs, knees up, legs apart", - "feet": "toes curled", - "additional": "imminent penetration, penis tip, touching, just the tip, friction, pov, insertion validation" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "imminent_penetration, lying, on_back, spread_legs", + "head": "blush, closed_mouth", + "eyes": "looking_at_viewer", + "arms": "arms_at_sides", + "hands": "torso_grab", + "torso": "navel, open_shirt, open_clothes", + "pelvis": "bottomless, heterosexual, imminent_vaginal", + "legs": "spread_legs, panties_around_one_leg", + "feet": "feet_out_of_frame", + "additional": "sex, penis, erection, uncensored" }, "lora": { "lora_name": "Illustrious/Poses/imminent-penetration-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "imminent-penetration-illustriousxl-lora-nochekaiser" + "lora_triggers": "imminent penetration, torso grab, imminent vaginal, panties around one leg" }, "tags": [ - "imminent penetration", - "tip", - "touching", - "pov", - "sex", - "spread legs", + "imminent_penetration", + "torso_grab", + "lying", + "on_back", + "spread_legs", + "bottomless", + "open_shirt", "blush", - "sweat", - "genital close-up", - "nsfw" + "panties_around_one_leg" ] } \ No newline at end of file diff --git a/data/actions/impossiblefit.json b/data/actions/impossiblefit.json index 9ec6608..fb091f5 100644 --- a/data/actions/impossiblefit.json +++ b/data/actions/impossiblefit.json @@ -2,34 +2,32 @@ "action_id": "impossiblefit", "action_name": "Impossiblefit", "action": { - "full_body": "character standing, struggling to close or pull up extremely tight clothing that is too small for their body type", - "head": "tilted down looking at waist, face flushed or straining", - "eyes": "focused downwards on the clothing gap", - "arms": "bent at elbows, exerting force", - "hands": "gripping waistband, pulling zipper tab, or pinching fabric edges together", - "torso": "stomach sucked in, torso arched slightly backward or scrunched forward", - "pelvis": "hips emphasized, flesh compressed by tight fabric, potential muffin top", - "legs": "standing close together, knees sometimes bent for leverage", - "feet": "planted on ground, or hopping on one foot", - "additional": "clothing gap, open zipper, bursting buttons, skin indentation, clothes too small" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling on ground, facing partner", + "head": "looking down, looking at penis", + "eyes": "wide open, expression of awe or fear, blushing", + "arms": "reaching forward or hands protecting body", + "hands": "tentative touch or handjob", + "torso": "leaning slightly back or forward in anticipation", + "pelvis": "kneeling", + "legs": "kneeling, spread or together", + "feet": "tucked behind", + "additional": "extreme size difference, sweat drops, open mouth" }, "lora": { "lora_name": "Illustrious/Poses/impossiblefit.safetensors", "lora_weight": 1.0, - "lora_triggers": "impossiblefit" + "lora_triggers": "impossible fit" }, "tags": [ - "tight clothing", - "clothes too small", - "struggling", - "clothing gap", - "muffin top", - "zipper", - "embarrassed", - "curvy" + "size_difference", + "huge_penis", + "imminent_penetration", + "penis_awe", + "looking_at_penis", + "blush", + "sweat", + "scared", + "open_mouth", + "penis_on_stomach" ] } \ No newline at end of file diff --git a/data/actions/instant_loss_caught_il_nai_py.json b/data/actions/instant_loss_caught_il_nai_py.json index 5c610ca..d0c09c5 100644 --- a/data/actions/instant_loss_caught_il_nai_py.json +++ b/data/actions/instant_loss_caught_il_nai_py.json @@ -2,36 +2,35 @@ "action_id": "instant_loss_caught_il_nai_py", "action_name": "Instant Loss Caught Il Nai Py", "action": { - "full_body": "character exhibiting immediate total defeat, body going completely limp and incapacitated", - "head": "head thrown back or slumped forward in unconsciousness, mouth falling open", - "eyes": "eyes rolled back (ahoge), empty eyes, or spiral eyes, indicating loss of consciousness", - "arms": "arms dangling uselessly at sides or floating limply if suspended", - "hands": "fingers loose and uncurled, wrists limp", - "torso": "posture collapsed, arching back or slumped over, defenseless", - "pelvis": "hips neutral or pushed forward due to limpness", - "legs": "knees buckled, legs giving way or dangling if lifted", - "feet": "feet relaxed, toes pointing down", - "additional": "drooling, tongue out, heavy breathing, flushed skin, sweat, mind break visual cues" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lying, on_back, spread_legs, defeat", + "head": "blush, sweat, open_mouth, tongue_out, looking_at_viewer", + "eyes": "half_closed_eyes, tears", + "arms": "arms_at_sides, grabbing", + "hands": "clenched_hands", + "torso": "exposed_breasts, arching_back", + "pelvis": "legs_spread, pelvis_lift", + "legs": "spread_legs, knees_up", + "feet": "toes_curled", + "additional": "2koma, multiple_views, penis_shadow, comic" }, "lora": { "lora_name": "Illustrious/Poses/Instant loss caught-IL_NAI_PY.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Instant loss caught-IL_NAI_PY" + "lora_weight": 0.7, + "lora_triggers": "instant_loss, caught" }, "tags": [ "instant_loss", - "defeat", - "fainted", - "limp", - "unconscious", - "mind_break", - "eyes_rolled_back", + "caught", + "2koma", + "multiple_views", + "penis_shadow", + "lying", + "on_back", + "spread_legs", + "blush", + "open_mouth", + "sweat", "tongue_out", - "drooling", - "caught" + "defeat" ] } \ No newline at end of file diff --git a/data/actions/kiss_multiple_view_close_up_illustrious.json b/data/actions/kiss_multiple_view_close_up_illustrious.json index 8043de4..400803f 100644 --- a/data/actions/kiss_multiple_view_close_up_illustrious.json +++ b/data/actions/kiss_multiple_view_close_up_illustrious.json @@ -2,33 +2,32 @@ "action_id": "kiss_multiple_view_close_up_illustrious", "action_name": "Kiss Multiple View Close Up Illustrious", "action": { - "full_body": "close-up framing of two characters sharing an intimate kiss", - "head": "profiles facing each other, heads slightly tilted, lips pressed together, noses touching", - "eyes": "closed eyes, eyelashes visible, tender expression", - "arms": "arms embracing neck or shoulders (if visible within frame)", - "hands": "cupping the partner's cheek, holding the chin, or fingers running through hair", - "torso": "upper chests pressing against each other, leaning forward", - "pelvis": "not visible (cropped)", - "legs": "not visible (cropped)", - "feet": "not visible (cropped)", - "additional": "bokeh background, romantic atmosphere, mouth-to-mouth contact, blushing cheeks" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "multiple_views, kiss, french_kiss, affectionate_gesture", + "head": "close-up, profile, cheek_to_cheek", + "eyes": "closed_eyes", + "arms": "embrace, arms_around_neck", + "hands": "cupping_face, hand_on_cheek", + "torso": "upper_body, breast_press", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "tongue, saliva, saliva_trail, blush, sweat" }, "lora": { "lora_name": "Illustrious/Poses/Kiss_multiple_view_close_up_Illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "Kiss_multiple_view_close_up_Illustrious" + "lora_triggers": "kiss_multiple_views" }, "tags": [ - "romance", - "intimacy", - "couple", - "love", - "affection", - "lipstick", - "face-to-face" + "multiple_views", + "kiss", + "french_kiss", + "close-up", + "tongue", + "breast_press", + "saliva", + "upper_body", + "closed_eyes", + "profile" ] } \ No newline at end of file diff --git a/data/actions/kissing_penis_illustriousxl_lora_nochekaiser.json b/data/actions/kissing_penis_illustriousxl_lora_nochekaiser.json index 09cf897..57bd84e 100644 --- a/data/actions/kissing_penis_illustriousxl_lora_nochekaiser.json +++ b/data/actions/kissing_penis_illustriousxl_lora_nochekaiser.json @@ -2,33 +2,30 @@ "action_id": "kissing_penis_illustriousxl_lora_nochekaiser", "action_name": "Kissing Penis Illustriousxl Lora Nochekaiser", "action": { - "full_body": "kneeling or crouching, leaning forward towards partner's groin area", - "head": "face close to crotch, mouth touching or kissing the glans", - "eyes": "looking toward object, looking up (ahegao possible), or closed eyes", - "arms": "reaching forward, bent at elbows", - "hands": "holding the penis shaft, cupping testicles, or resting on partner's thighs", - "torso": "leaning forward, slight arch", - "pelvis": "kneeling on the ground or bed", - "legs": "kneeling, bent knees", - "feet": "toes curled or flat on surface", - "additional": "saliva, penis, erection, glans, sexual act, intimacy" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "fellatio, squatting, from_side", + "head": "profile, blush", + "eyes": "closed_eyes", + "arms": "arms_down", + "hands": "hands_on_legs", + "torso": "leaning_forward", + "pelvis": "squatting", + "legs": "squatting", + "feet": "barefoot", + "additional": "spoken_heart, heart" }, "lora": { "lora_name": "Illustrious/Poses/kissing-penis-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "kissing-penis-illustriousxl-lora-nochekaiser" + "lora_triggers": "kissing penis, fellatio" }, "tags": [ - "kissing penis", + "kissing_penis", "fellatio", - "oral sex", - "blowjob", - "penis", - "kneeling", - "nsfw" + "squatting", + "from_side", + "closed_eyes", + "blush", + "spoken_heart", + "heart" ] } \ No newline at end of file diff --git a/data/actions/kissstanding_on_one_leg_il_000014.json b/data/actions/kissstanding_on_one_leg_il_000014.json index d280d6f..59453b3 100644 --- a/data/actions/kissstanding_on_one_leg_il_000014.json +++ b/data/actions/kissstanding_on_one_leg_il_000014.json @@ -2,38 +2,32 @@ "action_id": "kissstanding_on_one_leg_il_000014", "action_name": "Kissstanding On One Leg Il 000014", "action": { - "full_body": "Two characters in a romantic standing embrace, usually seen clearly from the side", - "head": "Faces close together, lips locked in a kiss, heads tilted slightly in opposite directions", - "eyes": "Closed eyes signifying intimacy", - "arms": "One person's arms wrapped around the other's neck, the other person's arms holding the partner's waist or back", - "hands": "Hands clutching clothing or resting gently on the back/waist", - "torso": "Chests pressing against each other, leaning in", - "pelvis": "Hips close together, facing each other", - "legs": "One character stands on one leg while the other leg is bent backward at the knee (foot pop); the partner stands firmly on both legs", - "feet": "One foot lifted in the air behind the body, others planted on the ground", - "additional": "Romantic atmosphere, height difference, anime trope 'foot pop'" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "duo, standing, standing_on_one_leg, kiss, embrace", + "head": "closed_eyes, tilted_head, profile", + "eyes": "closed_eyes", + "arms": "arms_around_neck, arms_around_waist, hugging", + "hands": "placed_on_back, placed_on_shoulders", + "torso": "leaning_forward, chest_press", + "pelvis": "facing_viewer", + "legs": "leg_up, bent_knee, standing_on_one_leg", + "feet": "one_foot_raised", + "additional": "romantic_ambience, height_difference" }, "lora": { "lora_name": "Illustrious/Poses/KIssStanding-On-One-Leg-IL-000014.safetensors", "lora_weight": 1.0, - "lora_triggers": "KIssStanding-On-One-Leg-IL-000014" + "lora_triggers": "KSOOLIL-V1.0, standing on one leg, leg up, kiss" }, "tags": [ + "duo", "kiss", - "kissing", - "couple", - "standing on one leg", - "one leg up", - "foot pop", - "hugging", + "standing", + "standing_on_one_leg", + "leg_up", + "bent_knee", "embrace", - "romantic", - "closed eyes", - "side view", - "love" + "arms_around_neck", + "arms_around_waist", + "closed_eyes" ] } \ No newline at end of file diff --git a/data/actions/kneeling_upright_sex_from_behind_illustriousxl_lora_nochekaiser.json b/data/actions/kneeling_upright_sex_from_behind_illustriousxl_lora_nochekaiser.json index c10095e..51fefce 100644 --- a/data/actions/kneeling_upright_sex_from_behind_illustriousxl_lora_nochekaiser.json +++ b/data/actions/kneeling_upright_sex_from_behind_illustriousxl_lora_nochekaiser.json @@ -2,34 +2,35 @@ "action_id": "kneeling_upright_sex_from_behind_illustriousxl_lora_nochekaiser", "action_name": "Kneeling Upright Sex From Behind Illustriousxl Lora Nochekaiser", "action": { - "full_body": "kneeling, upright posture, viewing from behind", - "head": "head turned back, blushing, mouth slightly open", - "eyes": "half-closed eyes, looking back", - "arms": "arms behind back, hands placed on heels or holding partner", - "hands": "hands grasping", - "torso": "straight back, slight arch, accentuated curve", - "pelvis": "legs spread, presenting rear", - "legs": "kneeling, knees apart, thighs vertical", - "feet": "toes curling, barefoot", - "additional": "sex from behind, doggy style, penetration, intercourse" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, sex_from_behind, doggystyle", + "head": "blush, open_mouth, sweating", + "eyes": "open_eyes, looking_back", + "arms": "arms_behind_back, arms_held_back", + "hands": "bound_wrists (optional), clenched_hands", + "torso": "upright, arching_back, nipples", + "pelvis": "sex_from_behind, rear_entry", + "legs": "kneeling, spread_legs", + "feet": "barefoot, toes_curled", + "additional": "hetero, motion_lines, motion_blur, bedroom, sweat" }, "lora": { "lora_name": "Illustrious/Poses/kneeling-upright-sex-from-behind-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "kneeling-upright-sex-from-behind-illustriousxl-lora-nochekaiser" + "lora_triggers": "kneeling upright sex from behind, arm grab, sex from behind, kneeling, sex, hetero, sweat, blush, open mouth" }, "tags": [ "kneeling", - "upright", - "from behind", - "doggystyle", - "arched back", - "looking back", + "sex_from_behind", + "hetero", "sex", - "nsfw" + "sweat", + "nipples", + "completely_nude", + "blush", + "open_mouth", + "motion_lines", + "motion_blur", + "bedroom", + "doggystyle" ] } \ No newline at end of file diff --git a/data/actions/lap_pov_illustriousxl_lora_nochekaiser.json b/data/actions/lap_pov_illustriousxl_lora_nochekaiser.json index bf60814..9300312 100644 --- a/data/actions/lap_pov_illustriousxl_lora_nochekaiser.json +++ b/data/actions/lap_pov_illustriousxl_lora_nochekaiser.json @@ -2,33 +2,32 @@ "action_id": "lap_pov_illustriousxl_lora_nochekaiser", "action_name": "Lap Pov Illustriousxl Lora Nochekaiser", "action": { - "full_body": "pov, sitting on lap, straddling, shot from above, close-up, intimate distance", - "head": "looking up, chin tilted up, face close to camera", - "eyes": "eye contact, looking at viewer, intense gaze", - "arms": "arms around neck, embracing viewer, or hands resting on viewer's chest", - "hands": "touching viewer, resting on shoulders", - "torso": "upper body close to viewer, leaning slightly back", - "pelvis": "sitting on viewer's thighs, weight settled", - "legs": "knees bent, thighs visible, straddling viewer's legs, spread legs", - "feet": "out of frame or dangling", - "additional": "viewer's legs visible beneath, depth of field, own hands (pov)" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lap_pillow, pov", + "head": "looking_down, blush, smile", + "eyes": "eye_contact", + "arms": "arms_not_visible", + "hands": "hands_not_visible", + "torso": "from_below, navel", + "pelvis": "thighs", + "legs": "sitting", + "feet": "feet_out_of_frame", + "additional": "ceiling" }, "lora": { "lora_name": "Illustrious/Poses/lap-pov-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "lap-pov-illustriousxl-lora-nochekaiser" + "lora_triggers": "lap pov, lap pillow, from below, ceiling, looking down, pov" }, "tags": [ + "lap_pillow", "pov", - "sitting on lap", - "straddling", - "looking up", - "from above", - "intricate details", - "highly detailed" + "from_below", + "looking_down", + "lap_pov", + "eye_contact", + "ceiling", + "thighs", + "navel", + "lying_on_lap" ] } \ No newline at end of file diff --git a/data/actions/lickkkp.json b/data/actions/lickkkp.json index 73d421b..91f4541 100644 --- a/data/actions/lickkkp.json +++ b/data/actions/lickkkp.json @@ -2,32 +2,31 @@ "action_id": "lickkkp", "action_name": "Lickkkp", "action": { - "full_body": "A focus on the interaction between the character and an object near the mouth.", - "head": "Tilted slightly forward or sideways, mouth open.", - "eyes": "Focused intently on the object or gazing upwards at the viewer.", - "arms": "Elbows bent, bringing hands close to the face.", - "hands": "Holding a popsicle, lollipop, or finger positioned for checking.", - "torso": "Leaning slightly towards the object of interest.", - "pelvis": "Neutral alignment, stationary.", - "legs": "Standing or sitting in a relaxed posture.", - "feet": "Plant or crossed comfortably.", - "additional": "Tongue extended outward making contact, saliva trails, wet tongue texture." - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "threesome, 2girls, kneeling", + "head": "open_mouth, tongue_out, licking", + "eyes": "looking_at_viewer", + "arms": "arms_not_visible", + "hands": "hands_not_visible", + "torso": "upper_body", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "feet_out_of_frame", + "additional": "veiny_penis, saliva, glansjob" }, "lora": { "lora_name": "Illustrious/Poses/LicKKKP.safetensors", "lora_weight": 1.0, - "lora_triggers": "LicKKKP" + "lora_triggers": "lkkkp, glansjob" }, "tags": [ - "licking", - "tongue out", + "2girls", + "threesome", + "licking_penis", + "fellatio", + "veiny_penis", + "looking_at_viewer", + "tongue_out", "saliva", - "open mouth", - "oral fixation", - "close-up" + "glansjob" ] } \ No newline at end of file diff --git a/data/actions/lotusposition.json b/data/actions/lotusposition.json index a928dba..06e41c3 100644 --- a/data/actions/lotusposition.json +++ b/data/actions/lotusposition.json @@ -2,36 +2,30 @@ "action_id": "lotusposition", "action_name": "Lotusposition", "action": { - "full_body": "sitting in lotus position, padmasana, meditative posture, yoga pose, whole body visible", - "head": "facing forward, calm expression, chin slightly tucked", - "eyes": "closed eyes, relaxing, or soft gaze downwards", - "arms": "arms relaxed, wrists resting on knees, elbows slightly bent", - "hands": "gyan mudra, index fingers touching thumbs, palms facing up, open hands", - "torso": "posture erect, straight spine, chest open, upright", - "pelvis": "grounded, sitting on floor, hips externally rotated", - "legs": "crossed legs tightly, feet resting on opposite thighs, flexibility", - "feet": "soles facing upward, feet visible on thighs, barefoot", - "additional": "serene atmosphere, tranquility, zen, spiritual practice" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lotus_position, sitting", + "head": "facing_viewer", + "eyes": "closed_eyes", + "arms": "arms_at_sides", + "hands": "hands_on_lap, mudra", + "torso": "upper_body", + "pelvis": "hips", + "legs": "crossed_legs", + "feet": "soles, barefoot", + "additional": "meditation, yoga, floating_hair" }, "lora": { "lora_name": "Illustrious/Poses/lotusposition.safetensors", "lora_weight": 1.0, - "lora_triggers": "lotusposition" + "lora_triggers": "lotus position" }, "tags": [ - "lotus position", + "lotus_position", + "sitting", + "crossed_legs", "meditation", "yoga", - "sitting", - "padmasana", - "crossed legs", - "zen", - "peaceful", - "flexible", - "barefoot" + "soles", + "barefoot", + "hands_on_lap" ] } \ No newline at end of file diff --git a/data/actions/mask_pull_up.json b/data/actions/mask_pull_up.json index 6b25599..f0c7491 100644 --- a/data/actions/mask_pull_up.json +++ b/data/actions/mask_pull_up.json @@ -2,32 +2,28 @@ "action_id": "mask_pull_up", "action_name": "Mask Pull Up", "action": { - "full_body": "Upper body or portrait shot of a character interacting with their face covering", - "head": "Facing forward, chin slightly tucked or level", - "eyes": "focused gaze looking directly at the viewer", - "arms": "Elbows bent, raised towards the face", - "hands": "Fingers grasping the top edge of a mask or fabric, pulling it upwards", - "torso": "Shoulders squared", + "full_body": "upper_body", + "head": "head_tilt, looking_at_viewer", + "eyes": "open_eyes", + "arms": "arms_up, hand_to_face", + "hands": "hand_on_mask", + "torso": "upper_body", "pelvis": "n/a", "legs": "n/a", "feet": "n/a", - "additional": "The mask fabric is taut where pulled, potentially covering the mouth and nose or in the process of doing so" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "additional": "adjusting_mask" }, "lora": { "lora_name": "Illustrious/Poses/mask_pull_up.safetensors", "lora_weight": 1.0, - "lora_triggers": "mask_pull_up" + "lora_triggers": "surgical mask, mask pull" }, "tags": [ - "adjusting_mask", + "surgical_mask", "mask_pull", "hand_on_mask", - "covering_mouth", - "upper_body", - "mask" + "adjusting_mask", + "head_tilt", + "upper_body" ] } \ No newline at end of file diff --git a/data/actions/masturbation_h.json b/data/actions/masturbation_h.json index 8907f20..3285386 100644 --- a/data/actions/masturbation_h.json +++ b/data/actions/masturbation_h.json @@ -2,36 +2,34 @@ "action_id": "masturbation_h", "action_name": "Masturbation H", "action": { - "full_body": "lying on back, body arched in pleasure, intimate perspective", - "head": "tilted back, flushed face, mouth open, heavy breathing, tongue out, salivating", - "eyes": "half-closed eyes, rolled back, heart pupils, tearing up", - "arms": "one arm across chest, other reaching down between legs", - "hands": "fondling breasts, rubbing clitoris, fingering, fingers inserted", - "torso": "sweaty skin, heaving chest, arched back", - "pelvis": "lifted hips, exposed crotch", - "legs": "spread legs, m-legs, knees bent, thighs open", - "feet": "toes curled, plantar flexion", - "additional": "pussy juice, messy sheets, unbuttoned clothes, intense pleasure" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "Lying on back or stomach, masturbating", + "head": "Heavy breathing, open mouth, blushing, head tilted back", + "eyes": "Eyes closed or rolling back", + "arms": "Grabbing own breasts or reaching downwards", + "hands": "Fingering pussy or squeezing breasts", + "torso": "Nude, arched back, shiny skin", + "pelvis": "Exposed pussy, pussy juice", + "legs": "Spread legs, open wide, knees bent", + "feet": "Toes curled", + "additional": "Top-down view, intense pleasure, sweat" }, "lora": { "lora_name": "Illustrious/Poses/masturbation_h.safetensors", - "lora_weight": 1.0, - "lora_triggers": "masturbation_h" + "lora_weight": 0.8, + "lora_triggers": "female masturbation, top down bottom up" }, "tags": [ - "masturbation", - "fingering", + "female_masturbation", + "top-down_bottom-up", + "lying", + "on_back", "spread_legs", + "nude", + "pussy", + "pussy_juice", + "heavy_breathing", "arched_back", - "ahegao", - "sweat", - "blush", - "lying_on_bed", - "nipple_tweak", - "sex_act" + "open_mouth", + "blush" ] } \ No newline at end of file diff --git a/data/actions/mating_press___size_diff_000010_1726954.json b/data/actions/mating_press___size_diff_000010_1726954.json index 3ed804e..cf3fffe 100644 --- a/data/actions/mating_press___size_diff_000010_1726954.json +++ b/data/actions/mating_press___size_diff_000010_1726954.json @@ -2,35 +2,27 @@ "action_id": "mating_press___size_diff_000010_1726954", "action_name": "Mating Press Size Diff 000010 1726954", "action": { - "full_body": "mating press, lying on back, partner on top, size difference, height difference, close bodies", - "head": "head tilted back, heavy breathing, blushing, mouth open, sweat", - "eyes": "half-closed eyes, rolled back eyes, ahegao", - "arms": "arms resting on bed, arms above head, clutching sheets", - "hands": "fists, gripping bedsheets, holding onto partner", - "torso": "arched back, chest pressed", - "pelvis": "hips raised, pelvis lifted, groins touching", - "legs": "legs up, legs folded, knees to chest, spread legs, legs held by partner, feet past shoulders", - "feet": "toes curled, suspended in air", - "additional": "sex, vaginal penetration, duo, male on top, bed, pillows, intimate, deeply inserted" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "mating_press, lying, on_back, missionary", + "head": "looking_at_viewer, blush", + "eyes": "open_eyes", + "arms": "arms_spread, arms_up", + "hands": "leg_grab", + "torso": "navel, medium_breasts", + "pelvis": "pussy", + "legs": "legs_up, spread_legs, legs_lifted", + "feet": "barefoot, toes", + "additional": "size_difference, giant, giant_male, sex, vaginal, 1boy, 1girl" }, "lora": { "lora_name": "Illustrious/Poses/Mating_Press_-_Size_Diff-000010_1726954.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Mating_Press_-_Size_Diff-000010_1726954" + "lora_weight": 0.8, + "lora_triggers": "MPSDV1.0, mating_press, size_difference" }, "tags": [ - "mating press", - "size difference", - "legs up", - "lying on back", - "partner on top", - "knees to chest", - "sex", - "vaginal", - "legs folded" + "best_quality", + "masterpiece", + "absurdres", + "highres", + "newest" ] } \ No newline at end of file diff --git a/data/actions/mating_press_from_above_illustriousxl_lora_nochekaiser.json b/data/actions/mating_press_from_above_illustriousxl_lora_nochekaiser.json index 2c68f8e..5780e40 100644 --- a/data/actions/mating_press_from_above_illustriousxl_lora_nochekaiser.json +++ b/data/actions/mating_press_from_above_illustriousxl_lora_nochekaiser.json @@ -2,35 +2,36 @@ "action_id": "mating_press_from_above_illustriousxl_lora_nochekaiser", "action_name": "Mating Press From Above Illustriousxl Lora Nochekaiser", "action": { - "full_body": "lying on back, mating press pose, supine", - "head": "resting on surface, looking up at viewer", - "eyes": "half-closed eyes, rolling eyes, ahegao", - "arms": "arms at sides or reaching up", - "hands": "grabbing sheets or holding legs", - "torso": "back flat against surface, chest heaving", - "pelvis": "hips exposed, legs spread wide", - "legs": "legs up, knees bent towards shoulders, thighs pressed back", - "feet": "feet in air, toes curled", - "additional": "from above, high angle, pov, bed sheet, sweat, intimate" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "mating_press, missionary, lying, sex", + "head": "blush, sweat, looking_at_viewer, open_mouth", + "eyes": "looking_at_viewer", + "arms": "arms_around_back, hug", + "hands": "hands_on_back", + "torso": "on_back, breasts_squished", + "pelvis": "hips_lifted", + "legs": "leg_lock, legs_up", + "feet": "barefoot", + "additional": "from_above, faceless_male, hetero" }, "lora": { "lora_name": "Illustrious/Poses/mating-press-from-above-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "mating-press-from-above-illustriousxl-lora-nochekaiser" + "lora_triggers": "mating press from above, mating press, missionary, leg lock, on back, hug" }, "tags": [ - "mating press", - "from above", - "lying on back", - "legs up", - "spread legs", - "knees to chest", - "pov", - "high angle", - "sex" + "mating_press", + "missionary", + "from_above", + "leg_lock", + "lying", + "on_back", + "sweat", + "blush", + "open_mouth", + "looking_at_viewer", + "hug", + "arms_around_back", + "faceless_male", + "hetero" ] } \ No newline at end of file diff --git a/data/actions/mating_press_from_side_illustriousxl_lora_nochekaiser.json b/data/actions/mating_press_from_side_illustriousxl_lora_nochekaiser.json index ec9241e..b1490ea 100644 --- a/data/actions/mating_press_from_side_illustriousxl_lora_nochekaiser.json +++ b/data/actions/mating_press_from_side_illustriousxl_lora_nochekaiser.json @@ -2,35 +2,36 @@ "action_id": "mating_press_from_side_illustriousxl_lora_nochekaiser", "action_name": "Mating Press From Side Illustriousxl Lora Nochekaiser", "action": { - "full_body": "lying on back, legs lifted high toward chest, profile view, receiving forceful thrusts", - "head": "head pressed against pillow, chin tilted up, neck exposed", - "eyes": "rolled back or squeezed shut, ahegao or heavy breathing", - "arms": "reaching out to hold partner or gripping bedsheets tightly", - "hands": "clenched fists or grabbing partner's back", - "torso": "back arched slightly, chest heaving", - "pelvis": "lifted off the mattress, hips tilted upwards", - "legs": "legs up, thighs pressed against torso, knees bent, ankles crossed behind partner's back or resting on partner's shoulders", - "feet": "toes curled or pointing upwards", - "additional": "sex, profile, side view, sweat, bed, crumpled sheets" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "missionary, mating_press, lying, on_back, from_side", + "head": "blush, open_mouth", + "eyes": "eyes_open", + "arms": "arms_at_sides", + "hands": "hands_on_bed", + "torso": "nude, breasts, nipples", + "pelvis": "sex, vaginal", + "legs": "leg_lock, legs_up", + "feet": "barefoot", + "additional": "on_bed, bedroom, motion_blur" }, "lora": { "lora_name": "Illustrious/Poses/mating-press-from-side-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "mating-press-from-side-illustriousxl-lora-nochekaiser" + "lora_triggers": "mating press from side, leg lock, missionary" }, "tags": [ - "mating press", - "from side", - "legs up", - "lying on back", + "mating_press", + "from_side", + "leg_lock", + "missionary", + "lying", + "on_back", + "on_bed", + "bedroom", "sex", - "vaginal", - "side view", - "profile", - "legs over head" + "nude", + "blush", + "open_mouth", + "motion_blur", + "nipples" ] } \ No newline at end of file diff --git a/data/actions/midis_cumshower_lr_v1_naixl_vpred_.json b/data/actions/midis_cumshower_lr_v1_naixl_vpred_.json index c825ab2..2aa26b5 100644 --- a/data/actions/midis_cumshower_lr_v1_naixl_vpred_.json +++ b/data/actions/midis_cumshower_lr_v1_naixl_vpred_.json @@ -2,35 +2,33 @@ "action_id": "midis_cumshower_lr_v1_naixl_vpred_", "action_name": "Midis Cumshower Lr V1 Naixl Vpred ", "action": { - "full_body": "kneeling or standing pose, body seemingly under a waterfall of viscous liquid", - "head": "tilted back, looking up, facial, face covered in white liquid, dripping heavily", - "eyes": "eyes closed or squinting, eyelashes wet and clumped, messy face", - "arms": "arms relaxed or hands touching face, skin slick with liquid", - "hands": "messy hands, covered in cum, spread palms", - "torso": "chest covered in liquid, streams running down the body, wet skin shine", - "pelvis": "kneeling or stationary", - "legs": "thighs wet, liquid pooling", - "feet": "bare feet", - "additional": "heavy cum, excessive cum, bukkake, splashing liquid, messy" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing, showering", + "head": "wet_hair, cum_on_hair", + "eyes": "closed_eyes", + "arms": "washing_hair, arms_behind_head", + "hands": "hands_on_head", + "torso": "wet, cum_on_body", + "pelvis": "wet", + "legs": "standing", + "feet": "barefoot", + "additional": "steam, bathroom, shower_head, excessive_cum" }, "lora": { "lora_name": "Illustrious/Poses/midis_CumShower_LR-V1[NAIXL-vPred].safetensors", "lora_weight": 1.0, - "lora_triggers": "midis_CumShower_LR-V1[NAIXL-vPred]" + "lora_triggers": "showering, cumshower" }, "tags": [ - "cum_shower", - "bukkake", - "heavy_cum", - "facial", - "covered_in_cum", - "excessive_cum", - "dripping_cum", - "messy", - "body_bukkake" + "showering", + "washing_hair", + "wet", + "wet_hair", + "steam", + "bathroom", + "cum", + "cum_on_body", + "cum_on_hair", + "arms_behind_head", + "closed_eyes" ] } \ No newline at end of file diff --git a/data/actions/midis_cunnilingus_v0_6_naixl_vpred_.json b/data/actions/midis_cunnilingus_v0_6_naixl_vpred_.json index a7fae26..42ce4b1 100644 --- a/data/actions/midis_cunnilingus_v0_6_naixl_vpred_.json +++ b/data/actions/midis_cunnilingus_v0_6_naixl_vpred_.json @@ -2,32 +2,30 @@ "action_id": "midis_cunnilingus_v0_6_naixl_vpred_", "action_name": "Midis Cunnilingus V0 6 Naixl Vpred ", "action": { - "full_body": "duo focus, cunnilingus, oral sex, sexual act, female receiving oral sex, partner positioning between legs", - "head": "face buried in crotch, face between legs, tongue out, licking", - "eyes": "eyes closed, rolling eyes, expression of pleasure", - "arms": "holding thighs, gripping hips, supporting body weight", - "hands": "spreading labia, touching clitoris, fingering", - "torso": "leaning forward, prone", - "pelvis": "hips raised, exposed vulva, pelvic tilt", - "legs": "spread legs, open legs, legs over shoulders, m-legs, knees bent", - "feet": "toes curled, plantar flexion", - "additional": "pussy juice, saliva trail, wet pussy, intimacy" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sitting_on_face, straddling, leaning_forward", + "head": "looking_down", + "eyes": "looking_at_viewer", + "arms": "arms_support, hands_on_own_legs", + "hands": "resting", + "torso": "leaning_forward", + "pelvis": "straddling, hips_spread", + "legs": "spread_legs, kneeling, thighs", + "feet": "out_of_frame", + "additional": "pov, from_below, intimate_perspective, aggressive_angle" }, "lora": { "lora_name": "Illustrious/Poses/midis_Cunnilingus_V0.6[NAIXL-vPred].safetensors", "lora_weight": 1.0, - "lora_triggers": "midis_Cunnilingus_V0.6[NAIXL-vPred]" + "lora_triggers": "cunnilingus pov, looking down" }, "tags": [ "cunnilingus", - "oral sex", - "pussy licking", - "nsfw", - "sexual act", - "duo" + "pov", + "sitting_on_face", + "looking_down", + "from_below", + "straddling", + "spread_legs", + "thighs" ] } \ No newline at end of file diff --git a/data/actions/midis_expressivelanguagelovingit_v0_5_il_.json b/data/actions/midis_expressivelanguagelovingit_v0_5_il_.json index 704572a..ce96a5c 100644 --- a/data/actions/midis_expressivelanguagelovingit_v0_5_il_.json +++ b/data/actions/midis_expressivelanguagelovingit_v0_5_il_.json @@ -2,34 +2,32 @@ "action_id": "midis_expressivelanguagelovingit_v0_5_il_", "action_name": "Midis Expressivelanguagelovingit V0 5 Il ", "action": { - "full_body": "character displaying intense affection, leaning forward enthusiastically", - "head": "tilted slightly to the side, huge smile, blushing cheeks", - "eyes": "closed happy eyes (><) or heart-shaped pupils", - "arms": "brought together in front of the chest or face", - "hands": "fingers curved to form a heart shape (heart hands)", - "torso": "facing viewer, upper body focus", - "pelvis": "neutral", - "legs": "standing or obscured", - "feet": "obscured", - "additional": "floating pink hearts, sparkles, radiating happiness" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "doggystyle", + "head": "facing_away, moaning, heavy_breathing, sweat", + "eyes": "half-closed_eyes", + "arms": "leaning_forward", + "hands": "on_surface", + "torso": "bent_over, arched_back", + "pelvis": "lifted", + "legs": "kneeling, spread_legs", + "feet": "toes_curled", + "additional": "speech_bubble, english_text, sound_effects, motion_lines" }, "lora": { "lora_name": "Illustrious/Poses/midis_ExpressiveLanguageLovingit_V0.5[IL].safetensors", "lora_weight": 1.0, - "lora_triggers": "midis_ExpressiveLanguageLovingit_V0.5[IL]" + "lora_triggers": "lovingit" }, "tags": [ - "heart hands", - "hands forming heart", - "love", - "smile", - "blush", - "closed eyes", - "happy", - "adoration" + "lovingit", + "speech_bubble", + "moaning", + "english_text", + "doggystyle", + "bent_over", + "facing_away", + "sex", + "motion_lines", + "sound_effects" ] } \ No newline at end of file diff --git a/data/actions/midis_onbackoral_v0_4_il_.json b/data/actions/midis_onbackoral_v0_4_il_.json index 35f5929..e41ffa4 100644 --- a/data/actions/midis_onbackoral_v0_4_il_.json +++ b/data/actions/midis_onbackoral_v0_4_il_.json @@ -2,33 +2,31 @@ "action_id": "midis_onbackoral_v0_4_il_", "action_name": "Midis Onbackoral V0 4 Il ", "action": { - "full_body": "lying on back, supine position, sensual pose", - "head": "head resting on surface, head tilted back, blush", - "eyes": "rolling eyes, eyes closed, or looking down", - "arms": "arms at sides, grabbing bedsheets, or arms above head", - "hands": "clenched hands, fingers curling", - "torso": "arched back, chest upward", - "pelvis": "hips lifted, pelvis exposed", - "legs": "spread legs, legs apart, knees bent, m-legs, open legs", - "feet": "toes curled, feet in air", - "additional": "pov, view from above, between legs, bed, messy sheets" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lying, on_back, sitting_on_person", + "head": "open_mouth, head_back, looking_up", + "eyes": "closed_eyes, half_closed_eyes", + "arms": "arms_at_sides, arms_above_head", + "hands": "clenched_hands", + "torso": "chest, breasts, lying_on_back", + "pelvis": "lying", + "legs": "legs_straight, legs_apart", + "feet": "toes_curled", + "additional": "irrumatio, fellatio, sitting_on_breasts, sitting_on_chest, struggling" }, "lora": { "lora_name": "Illustrious/Poses/midis_OnBackOral_V0.4[IL].safetensors", "lora_weight": 1.0, - "lora_triggers": "midis_OnBackOral_V0.4[IL]" + "lora_triggers": "oral, lying" }, "tags": [ - "lying on back", - "spread legs", - "pov", - "legs apart", - "supine", - "m-legs", - "sensual" + "lying", + "on_back", + "oral", + "irrumatio", + "fellatio", + "sitting_on_person", + "sitting_on_breasts", + "sitting_on_chest", + "struggling" ] } \ No newline at end of file diff --git a/data/actions/multiple_asses_r1.json b/data/actions/multiple_asses_r1.json index 6872768..9902d60 100644 --- a/data/actions/multiple_asses_r1.json +++ b/data/actions/multiple_asses_r1.json @@ -2,35 +2,29 @@ "action_id": "multiple_asses_r1", "action_name": "Multiple Asses R1", "action": { - "full_body": "multiple subjects standing in a row or group turned away from the camera, full rear view", - "head": "facing forward away from camera or turned slightly to look back", - "eyes": "looking at viewer over shoulder or not visible", - "arms": "relaxed at sides or hands resting on hips", - "hands": "resting on waist or touching thighs", - "torso": "visible back, slightly arched lower back", - "pelvis": "hips wide, buttocks emphasized and focused in composition", - "legs": "standing straight or slightly bent at knees, shoulder-width apart", - "feet": "planted on ground, heels slightly raised or flat", - "additional": "focus on varying shapes and sizes of buttocks, depth of field focused on rear" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "multiple_girls, lineup, from_behind, ass_focus", + "head": "looking_back", + "eyes": "detailed_eyes", + "arms": "arms_at_sides", + "hands": "hands_on_hips", + "torso": "bent_over, arched_back", + "pelvis": "ass, hips", + "legs": "standing, legs_apart", + "feet": "feet_out_of_frame", + "additional": "group_picture, depth_of_field" }, "lora": { "lora_name": "Illustrious/Poses/Multiple_Asses_r1.safetensors", "lora_weight": 1.0, - "lora_triggers": "Multiple_Asses_r1" + "lora_triggers": "Multiple_Asses_V1" }, "tags": [ - "from behind", - "ass", - "butt", - "multiple girls", - "group", - "back view", - "looking back", - "medium shot", - "lower body focus" + "multiple_girls", + "lineup", + "from_behind", + "ass_focus", + "3girls", + "bent_over", + "looking_back" ] } \ No newline at end of file diff --git a/data/actions/multiple_fellatio_illustrious_v1_0.json b/data/actions/multiple_fellatio_illustrious_v1_0.json index f288de8..8b3ddf4 100644 --- a/data/actions/multiple_fellatio_illustrious_v1_0.json +++ b/data/actions/multiple_fellatio_illustrious_v1_0.json @@ -2,33 +2,32 @@ "action_id": "multiple_fellatio_illustrious_v1_0", "action_name": "Multiple Fellatio Illustrious V1 0", "action": { - "full_body": "multiple views, kneeling or sitting position, flanked by two partners, maintaining balance while engaging multiple subjects", - "head": "mouth wide open, jaw stretched, head tilted back or neutral, heavily blushing face, messy hair", - "eyes": "rolled back (ahegao), heart-shaped pupils, or crossed eyes, streaming tears", - "arms": "raised to hold partners or resting on their legs", - "hands": "stroking shafts, guiding penises towards mouth, or resting on partners' thighs", - "torso": "chest pushed forward, leaning in towards the action", - "pelvis": "hips settled on heels or slightly raised in a kneeling stance", - "legs": "kneeling, shins flat against the surface, knees spread apart", - "feet": "toes curled or resting flat", - "additional": "saliva trails, double fellatio, penis in mouth, penis on face, cum on face, high motion lines, explicit sexual activity" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "cooperative_fellatio, group_sex, multiple_girls", + "head": "open_mouth, tongue_out, licking", + "eyes": "upward_gaze, looking_at_penis", + "arms": "holding_penis", + "hands": "on_penis", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "toes_curled", + "additional": "pov, saliva, penile_stimulation" }, "lora": { "lora_name": "Illustrious/Poses/multiple fellatio_illustrious_V1.0.safetensors", - "lora_weight": 1.0, - "lora_triggers": "multiple fellatio_illustrious_V1.0" + "lora_weight": 0.7, + "lora_triggers": "multiple fellatio, cooperative fellatio, fellatio, oral, group sex, licking, pov" }, "tags": [ - "multiple fellatio", - "double fellatio", - "oral sex", - "kneeling", - "group sex", - "ahegao", - "saliva" + "cooperative_fellatio", + "fellatio", + "group_sex", + "oral", + "licking", + "pov", + "multiple_girls", + "penis", + "1boy", + "kneeling" ] } \ No newline at end of file diff --git a/data/actions/multiple_views_sex.json b/data/actions/multiple_views_sex.json index d2a7c8d..0a247c0 100644 --- a/data/actions/multiple_views_sex.json +++ b/data/actions/multiple_views_sex.json @@ -2,34 +2,28 @@ "action_id": "multiple_views_sex", "action_name": "Multiple Views Sex", "action": { - "full_body": "multiple views, split view, character sheet, three-view drawing, front view, side view, back view", - "head": "neutral expression, looking forward, head visible from multiple angles", - "eyes": "open, direct gaze (in front view)", - "arms": "arms at sides, A-pose or T-pose, relaxed", - "hands": "open hands, relaxed", - "torso": "standing straight, visible from front, side, and back", - "pelvis": "facing forward (front view), facing side (side view)", - "legs": "standing straight, legs slightly apart", - "feet": "flat on floor", - "additional": "simple background, white background, concept art style, anatomy reference" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "multiple_views, sex, doggystyle, all_fours", + "head": "looking_back", + "eyes": "open_eyes", + "arms": "on_ground", + "hands": "on_ground", + "torso": "arched_back, bent_over", + "pelvis": "lifted", + "legs": "kneeling", + "feet": "toes_pointing", + "additional": "split_screen" }, "lora": { "lora_name": "Illustrious/Poses/Multiple_views_sex.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Multiple_views_sex" + "lora_weight": 0.8, + "lora_triggers": "multiple_views" }, "tags": [ - "multiple views", - "character turnaround", - "reference sheet", - "split view", - "from front", - "from side", - "from back", - "model sheet" + "multiple_views", + "sex", + "doggystyle", + "from_side", + "from_behind", + "split_screen" ] } \ No newline at end of file diff --git a/data/actions/multipleviews.json b/data/actions/multipleviews.json index e2101ad..126a2cc 100644 --- a/data/actions/multipleviews.json +++ b/data/actions/multipleviews.json @@ -2,34 +2,33 @@ "action_id": "multipleviews", "action_name": "Multipleviews", "action": { - "full_body": "character sheet layout displaying the same character from multiple angles (front, side, back), standing pose", - "head": "neutral expression, face forward (front view), profile (side view)", - "eyes": "looking straight ahead", - "arms": "arms at sides, slight A-pose to show details", - "hands": "relaxed at sides", - "torso": "upright, various angles", - "pelvis": "facing front, side, and back", - "legs": "standing straight, shoulder width apart", - "feet": "standing flat", - "additional": "simple background, concept art style, turnaround, split view" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "multiple_views, on_stomach, doggystyle", + "head": "naughty_face, blush, open_mouth", + "eyes": "rolling_eyes, heart-shaped_pupils", + "arms": "arms_tied, grabbing_sheets", + "hands": "on_bed", + "torso": "cum_on_body, sweaty, arched_back", + "pelvis": "sex_from_behind, vaginal", + "legs": "kneeling, spread_legs", + "feet": "toes_curled", + "additional": "collage, after_sex, cumdrip, orgasm, deepthroat" }, "lora": { "lora_name": "Illustrious/Poses/multipleviews.safetensors", "lora_weight": 1.0, - "lora_triggers": "multipleviews" + "lora_triggers": "multiple_views" }, "tags": [ - "multiple views", - "character sheet", - "reference sheet", - "turnaround", - "front view", - "side view", - "back view", - "concept art" + "multiple_views", + "1girl", + "1boy", + "sex_from_behind", + "on_stomach", + "naughty_face", + "cumdrip", + "after_sex", + "orgasm", + "deepthroat", + "vaginal" ] } \ No newline at end of file diff --git a/data/actions/multiview_oralsex.json b/data/actions/multiview_oralsex.json index 7a5b318..bee17a2 100644 --- a/data/actions/multiview_oralsex.json +++ b/data/actions/multiview_oralsex.json @@ -2,33 +2,33 @@ "action_id": "multiview_oralsex", "action_name": "Multiview Oralsex", "action": { - "full_body": "multiple views of a character displayed in a grid or sequence, showing different angles of a kneeling pose", - "head": "tilted slightly upward or forward, varying by angle, mouth slightly open or neutral", - "eyes": "focused upward or closed, depending on the specific view", - "arms": "reaching forward or resting on a surface", - "hands": "gesturing or holding onto a support", - "torso": "leaning forward, back slightly arched", - "pelvis": "positioned low, kneeling grounded stance", - "legs": "knees bent on the ground, shins flat against the surface", - "feet": "toes supporting or flat, visible in rear views", - "additional": "character sheet style, white or simple background to emphasize the pose analysis" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, multiple_views", + "head": "licking, saliva, open_mouth, tongue_out", + "eyes": "looking_at_penis", + "arms": "arms_down", + "hands": "on_legs", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "toes", + "additional": "fellatio, penis, testicles, close-up" }, "lora": { "lora_name": "Illustrious/Poses/multiview_oralsex.safetensors", - "lora_weight": 1.0, - "lora_triggers": "multiview_oralsex" + "lora_weight": 0.9, + "lora_triggers": "multi_oralsex, oral, multiple_views, kneeling, testicles, saliva, licking, penis" }, "tags": [ - "multiview", - "character sheet", - "reference sheet", + "multiple_views", + "fellatio", "kneeling", - "leaning forward", - "multiple angles", - "pose check" + "saliva", + "licking", + "penis", + "testicles", + "close-up", + "open_mouth", + "tongue_out", + "leaning_forward" ] } \ No newline at end of file diff --git a/data/actions/neba.json b/data/actions/neba.json index 26d1345..0896879 100644 --- a/data/actions/neba.json +++ b/data/actions/neba.json @@ -2,31 +2,29 @@ "action_id": "neba", "action_name": "Neba", "action": { - "full_body": "character posing while stretching a viscous, sticky substance between body parts", - "head": "tilted slightly forward or back, focused on the substance", - "eyes": "focused gaze, watching the strands stretch", - "arms": "extended outwards or pulled apart to create tension in the liquid", - "hands": "fingers spread, pulling sticky material apart with visible strands connecting them", - "torso": "posture adjusts to accommodate the stretching motion", - "pelvis": "neutral or slightly shifted weight", - "legs": "standing or sitting planted firmly", - "feet": "neutral placement", - "additional": "thick, stringy strands (neba neba) connecting hands to other surfaces or body parts, implies viscosity" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "character covered in viscous slime substance, wet and shiny skin", + "head": "slime dripping from face, flushed expression", + "eyes": "wide open eyes", + "arms": "arms coated in sticky liquid", + "hands": "slimy hands", + "torso": "slime running down body", + "pelvis": "wet with slime", + "legs": "legs covered in slippery slime", + "feet": "standing in slime puddle", + "additional": "sticky strands, messy texture, high viscosity" }, "lora": { "lora_name": "Illustrious/Poses/neba.safetensors", "lora_weight": 1.0, - "lora_triggers": "neba" + "lora_triggers": "black slime, pink slime, white slime, green slime, yellow slime, transparent slime, mud slime, slime (substance)" }, "tags": [ - "neba neba", + "slime_(substance)", "sticky", - "stretching", - "viscous", - "slime" + "wet", + "shiny_skin", + "dripping", + "blush", + "open_mouth" ] } \ No newline at end of file diff --git a/data/actions/nm_fullmouthcum_ill.json b/data/actions/nm_fullmouthcum_ill.json index f6fc59e..a491b45 100644 --- a/data/actions/nm_fullmouthcum_ill.json +++ b/data/actions/nm_fullmouthcum_ill.json @@ -2,34 +2,36 @@ "action_id": "nm_fullmouthcum_ill", "action_name": "Nm Fullmouthcum Ill", "action": { - "full_body": "portrait or upper body shot focusing on facial distortion", - "head": "face flushed, cheeks bulging significantly, puffy cheeks, stuffed cheeks, lips pursed or slightly leaking liquid", - "eyes": "tearing up, watery eyes, squashed or wide open depending on intensity", - "arms": "optional, hands often near face", - "hands": "wiping mouth or framing face, messy with liquid", - "torso": "visible upper chest", - "pelvis": "not visible or kneeling", - "legs": "not visible", - "feet": "not visible", - "additional": "mouth full, holding breath, white liquid dripping, semen in mouth, cum drip, excess saliva, struggling to swallow" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "focus on face", + "head": "tilted back, open_mouth, visible uvula", + "eyes": "half-closed_eyes, rolled_up_eyes", + "arms": "", + "hands": "", + "torso": "", + "pelvis": "", + "legs": "", + "feet": "", + "additional": "cum_in_mouth, cum_on_tongue, excessive_cum, saliva, facial, full_mouth" }, "lora": { "lora_name": "Illustrious/Poses/NM_FullMouthCum_ill.safetensors", "lora_weight": 1.0, - "lora_triggers": "NM_FullMouthCum_ill" + "lora_triggers": "nm_fullmouthcum" }, "tags": [ - "stuffed cheeks", - "puffy cheeks", - "mouth full", - "cum in mouth", - "bulging cheeks", - "semen in mouth", - "holding breath", - "cheeks" + "cum_in_mouth", + "cum_on_tongue", + "full_mouth", + "excessive_cum", + "facial", + "bukkake", + "after_fellatio", + "open_mouth", + "tongue_out", + "saliva", + "lips", + "uvula", + "half-closed_eyes", + "close-up" ] } \ No newline at end of file diff --git a/data/actions/paionlap_illu_dwnsty.json b/data/actions/paionlap_illu_dwnsty.json new file mode 100644 index 0000000..5521232 --- /dev/null +++ b/data/actions/paionlap_illu_dwnsty.json @@ -0,0 +1,32 @@ +{ + "action_id": "paionlap_illu_dwnsty", + "action_name": "Paionlap Illu Dwnsty", + "action": { + "full_body": "sitting_on_lap, straddling, full_body", + "head": "looking_up", + "eyes": "detailed_eyes", + "arms": "elbows_out", + "hands": "grabbing_own_breast", + "torso": "breasts_out, large_breasts", + "pelvis": "straddling", + "legs": "wariza, kneeling", + "feet": "", + "additional": "paizuri, pov, from_below, solo_focus, indoors" + }, + "lora": { + "lora_name": "Illustrious/Poses/PaiOnLap_Illu_Dwnsty.safetensors", + "lora_weight": 1.0, + "lora_triggers": "paionlap" + }, + "tags": [ + "paizuri", + "pov", + "wariza", + "sitting_on_lap", + "from_below", + "grabbing_own_breast", + "looking_up", + "solo_focus", + "breasts_out" + ] +} \ No newline at end of file diff --git a/data/actions/panty_aside_illustrious_v1_0.json b/data/actions/panty_aside_illustrious_v1_0.json index 9d5dc7a..0c3753c 100644 --- a/data/actions/panty_aside_illustrious_v1_0.json +++ b/data/actions/panty_aside_illustrious_v1_0.json @@ -2,31 +2,28 @@ "action_id": "panty_aside_illustrious_v1_0", "action_name": "Panty Aside Illustrious V1 0", "action": { - "full_body": "pulling panties aside, revealing pose, front view, standing or lying on back", - "head": "looking at viewer, blush, embarrassed or seductive expression", - "eyes": "eye contact, alluring gaze", - "arms": "arms reaching down, arm at side", - "hands": "hand on hip, fingers hooking panties, pulling fabric, thumb inside waistband", - "torso": "bare midriff, navel, exposed slightly", - "pelvis": "panties, underwear, hip bone, side tie, exposed hip, gap", - "legs": "thighs, bare legs, slightly parted", - "feet": "standing or feet out of frame", - "additional": "lingerie, teasing, skin indentation, exposure" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "panties_aside", + "head": "looking_at_viewer", + "eyes": "ultra-detailed-eyes", + "arms": "arms_at_sides", + "hands": "adjusting_panties", + "torso": "cute_girl", + "pelvis": "panties_aside, panties, pussy", + "legs": "legs_apart", + "feet": "standing", + "additional": "censored" }, "lora": { "lora_name": "Illustrious/Poses/panty aside_illustrious_V1.0.safetensors", - "lora_weight": 1.0, - "lora_triggers": "panty aside_illustrious_V1.0" + "lora_weight": 0.7, + "lora_triggers": "panties aside, panties, pussy" }, "tags": [ - "panty aside", - "pulling panties aside", - "underwear", - "lingerie", - "teasing" + "panties_aside", + "panties", + "pussy", + "adjusting_panties", + "legs_apart", + "censored" ] } \ No newline at end of file diff --git a/data/actions/panty_pull_one_leg_up_illustrious_v1_0.json b/data/actions/panty_pull_one_leg_up_illustrious_v1_0.json index acbe628..636208f 100644 --- a/data/actions/panty_pull_one_leg_up_illustrious_v1_0.json +++ b/data/actions/panty_pull_one_leg_up_illustrious_v1_0.json @@ -2,35 +2,31 @@ "action_id": "panty_pull_one_leg_up_illustrious_v1_0", "action_name": "Panty Pull One Leg Up Illustrious V1 0", "action": { - "full_body": "standing on one leg, balancing while lifting the other leg high, body slightly bent or twisting to reach the hip", - "head": "looking down at hips or looking at viewer with an embarrassed expression", - "eyes": "focused on the action or shy glance", - "arms": "reaching down towards the pelvis, hands positioned at the hips", - "hands": "holding panties, pulling panties to the side, adjusting underwear, fingers hooking the waistband", - "torso": "leaning forward slightly, stretching", - "pelvis": "hips tilted, crotch area prominent due to leg lift", - "legs": "one leg up, lifting leg, standing on one leg, high leg lift, thighs apart", - "feet": "barefoot or wearing socks, toes pointed on the lifted leg", - "additional": "panties, underwear, changing clothes, adjusting clothes, side indent" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing_on_one_leg", + "head": "looking_down", + "eyes": "open_eyes", + "arms": "arms_down", + "hands": "holding_panties", + "torso": "leaning_forward", + "pelvis": "panties", + "legs": "panties_around_one_leg", + "feet": "barefoot", + "additional": "undressing, panty_pull, balance" }, "lora": { "lora_name": "Illustrious/Poses/panty pull one leg up_illustrious_V1.0.safetensors", - "lora_weight": 1.0, - "lora_triggers": "panty pull one leg up_illustrious_V1.0" + "lora_weight": 0.8, + "lora_triggers": "panty pull, holding panties, standing on one leg, panties around one leg, undressing" }, "tags": [ - "panty pull", - "one leg up", - "standing on one leg", + "standing_on_one_leg", + "panty_pull", + "undressing", + "holding_panties", + "panties_around_one_leg", + "lifted_leg", "panties", - "underwear", - "clothed female nude", - "adjusting panties", - "balance", - "leg lift" + "balancing", + "bare_legs" ] } \ No newline at end of file diff --git a/data/actions/pantygag.json b/data/actions/pantygag.json index e0420da..dd001ed 100644 --- a/data/actions/pantygag.json +++ b/data/actions/pantygag.json @@ -2,36 +2,35 @@ "action_id": "pantygag", "action_name": "Pantygag", "action": { - "full_body": "kneeling or sitting in a restrained posture", - "head": "panties stuffed into open mouth, fabric wrapped around lower face, cheeks bulging", - "eyes": "wide open, slightly tearing or looking up in embarrassment", - "arms": "positioned behind the back", - "hands": "wrists bound together", - "torso": "slightly arched, chest forward", - "pelvis": "hips stationary, taking weight if sitting", - "legs": "knees bent, shins touching the ground", - "feet": "toes pointing backward or feet crossed", - "additional": "detailed fabric texture of the underwear used as a gag" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "upper_body", + "head": "panty_gag, panties_in_mouth, open_mouth, saliva, drooling, spit, tongue_out", + "eyes": "hypnosis, @_@", + "arms": "hands_on_own_cheeks, cheek_pinching", + "hands": "fingers_on_face", + "torso": "string", + "pelvis": "string", + "legs": "string", + "feet": "string", + "additional": "panty_gag, panties_in_mouth" }, "lora": { "lora_name": "Illustrious/Poses/pantygag.safetensors", "lora_weight": 1.0, - "lora_triggers": "pantygag" + "lora_triggers": "panty gag" }, "tags": [ - "pantygag", - "panties in mouth", - "gagged", - "open mouth", - "bulging cheeks", - "kneeling", - "bound wrists", - "restrained", - "flushed face", - "drool" + "panty_gag", + "panties_in_mouth", + "saliva", + "drooling", + "spit", + "hypnosis", + "@_@", + "cheek_pinching", + "hands_on_own_cheeks", + "tongue_out", + "open_mouth", + "bdsm", + "gag" ] } \ No newline at end of file diff --git a/data/actions/penis_over_one_eye_illustriousxl_lora_nochekaiser.json b/data/actions/penis_over_one_eye_illustriousxl_lora_nochekaiser.json index 6b8835e..c88c0d8 100644 --- a/data/actions/penis_over_one_eye_illustriousxl_lora_nochekaiser.json +++ b/data/actions/penis_over_one_eye_illustriousxl_lora_nochekaiser.json @@ -2,32 +2,37 @@ "action_id": "penis_over_one_eye_illustriousxl_lora_nochekaiser", "action_name": "Penis Over One Eye Illustriousxl Lora Nochekaiser", "action": { - "full_body": "close-up, bust shot, portrait, sexual act", - "head": "penis draped over one eye, penis on face, slight head tilt", - "eyes": "one eye covered, one eye visible, looking at viewer", - "arms": "arms lowered or holding partner", - "hands": "hands on penis or resting on partner's hips", - "torso": "upper body, chest", - "pelvis": "obscured or out of frame", - "legs": "out of frame", - "feet": "out of frame", - "additional": "explicit, penis covering eye, facial obstruction, messy" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lying_on_back, from_above, pov", + "head": "penis_over_one_eye, penis_on_face, blush, head_back", + "eyes": "one_eye_covered", + "arms": "arms_at_sides", + "hands": "open_hands", + "torso": "completely_nude, breasts, nipples", + "pelvis": "legs_apart", + "legs": "lying_down", + "feet": "barefoot", + "additional": "hetero, huge_penis, penis, testicles, saliva" }, "lora": { "lora_name": "Illustrious/Poses/penis-over-one-eye-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "penis-over-one-eye-illustriousxl-lora-nochekaiser" + "lora_triggers": "penis over one eye" }, "tags": [ - "penis over one eye", - "penis on face", - "one eye covered", - "covering eye", - "face fuck", - "explicit" + "penis_over_one_eye", + "penis_on_face", + "hetero", + "pov", + "from_above", + "one_eye_covered", + "huge_penis", + "penis", + "testicles", + "blush", + "open_mouth", + "tongue", + "saliva", + "completely_nude", + "lying_on_back" ] } \ No newline at end of file diff --git a/data/actions/penis_under_mask_naixl_v1.json b/data/actions/penis_under_mask_naixl_v1.json index 90b472b..ff574c6 100644 --- a/data/actions/penis_under_mask_naixl_v1.json +++ b/data/actions/penis_under_mask_naixl_v1.json @@ -2,35 +2,37 @@ "action_id": "penis_under_mask_naixl_v1", "action_name": "Penis Under Mask Naixl V1", "action": { - "full_body": "close-up, sexual activity, fellatio, or 1boy 1girl", - "head": "wearing face mask, surgical mask, penis in mouth, penis under mask, mask bulging, cheeks bulging, saliva trail", - "eyes": "half-closed eyes, upturned eyes, teary eyes, or ahegao", - "arms": "arms resting or holding partner", - "hands": "hands guiding head or pulling down mask strap", - "torso": "upper body, collarbone, exposed chest", - "pelvis": "crotch shot, focus on insertion", - "legs": "kneeling or out of frame", - "feet": "out of frame", - "additional": "interior mouth view obscured, fabric stretching, distortion" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, squatting, or sitting", + "head": "wearing surgical_mask or mouth_veil, penis positioned under the mask material", + "eyes": "open_eyes, looking_at_viewer, penis_awe", + "arms": "reaching towards face, or resting", + "hands": "mask_pull (pulling mask away from face), penis_grab", + "torso": "facing viewer or from_side, leaning forward", + "pelvis": "hips steady", + "legs": "kneeling or bent", + "feet": "resting", + "additional": "saliva, precume, tongue_out, licking_penis" }, "lora": { "lora_name": "Illustrious/Poses/Penis_under_Mask_NAIXL_v1.safetensors", "lora_weight": 1.0, - "lora_triggers": "Penis_under_Mask_NAIXL_v1" + "lora_triggers": "penis_under_mask" }, "tags": [ - "penis under mask", - "face mask", - "surgical mask", - "fellatio", - "oral sex", - "bulge in mask", - "mask pull", - "obscured face", - "nsfw" + "penis_under_mask", + "surgical_mask", + "penis_on_face", + "imminent_fellatio", + "mask_pull", + "licking_penis", + "penis_grab", + "open_mouth", + "tongue_out", + "saliva", + "mouth_veil", + "squatting", + "kneeling", + "pov", + "looking_at_viewer" ] } \ No newline at end of file diff --git a/data/actions/penis_worship_il.json b/data/actions/penis_worship_il.json index cb6eb84..938274f 100644 --- a/data/actions/penis_worship_il.json +++ b/data/actions/penis_worship_il.json @@ -2,34 +2,35 @@ "action_id": "penis_worship_il", "action_name": "Penis Worship Il", "action": { - "full_body": "kneeling on the floor, slight forward lean, submissive posture", - "head": "tilted back, face looking upward, chin up", - "eyes": "looking up, crossed eyes, rolling eyes, or intense eye contact", - "arms": "reaching forward or resting on thighs", - "hands": "holding object, touching shaft, or hands clasped in prayer gesture", - "torso": "arched back, chest pressed forward", - "pelvis": "kneeling, hips pushed back or resting on heels", - "legs": "knees on ground, shins flat", - "feet": "toes curled or resting flat", - "additional": "pov, penis in foreground, saliva trail, reverence, anticipation" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, leaning_forward", + "head": "tilted_back, looking_up, blushing", + "eyes": "heart-shaped_pupils, cross-eyed, looking_at_penis", + "arms": "arms_up, bent_arms", + "hands": "praying, interlaced_fingers", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "kneeling", + "additional": "open_mouth, tongue_out, saliva, intense_gaze, penis_awe" }, "lora": { "lora_name": "Illustrious/Poses/Penis_Worship_IL.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Penis_Worship_IL" + "lora_weight": 0.85, + "lora_triggers": "penis worship, penis awe" }, "tags": [ - "penis worship", + "penis_awe", + "looking_at_penis", "kneeling", - "submissive", - "looking up", - "open mouth", - "tongue", - "pov", - "fellatio" + "praying", + "looking_up", + "heart-shaped_pupils", + "ahegao", + "blush", + "open_mouth", + "saliva", + "facial", + "cum", + "worship" ] } \ No newline at end of file diff --git a/data/actions/ponyplay_illustrious.json b/data/actions/ponyplay_illustrious.json index 1470c59..69185cc 100644 --- a/data/actions/ponyplay_illustrious.json +++ b/data/actions/ponyplay_illustrious.json @@ -2,36 +2,34 @@ "action_id": "ponyplay_illustrious", "action_name": "Ponyplay Illustrious", "action": { - "full_body": "on all fours, quadrupedal pose, mimicking a horse", - "head": "wearing bridle, bit gag in mouth, looking forward", - "eyes": "wide, submissive, focused", - "arms": "straightened, supporting weight, vertical", - "hands": "wearing hoof gloves or resting on fists", - "torso": "arched back, wearing leather harness", - "pelvis": "hips raised, faxt tail attached to rear", - "legs": "knees on ground, thighs perpendicular to floor", - "feet": "wearing hoof boots or pointing backwards", - "additional": "reins attached to bridle, fetish gear, animalistic posture" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "on_all_fours, crawling", + "head": "bit_gag, horse_ears", + "eyes": "looking_at_viewer", + "arms": "arms_behind_back, bound_arms", + "hands": "restricted", + "torso": "rope_harness, bondage_gear", + "pelvis": "horse_tail", + "legs": "kneeling", + "feet": "barefoot", + "additional": "acting like an animal, pet play scenario" }, "lora": { "lora_name": "Illustrious/Poses/Ponyplay_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Ponyplay_Illustrious" + "lora_weight": 0.7, + "lora_triggers": "ponyplay, pet play, slave" }, "tags": [ - "ponyplay", - "human pony", - "on all fours", + "pony_play", + "pet_play", + "bit_gag", + "horse_ears", + "horse_tail", + "harness", + "bondage", "bdsm", - "leather harness", - "bridle", - "bit gag", - "hooves", - "animal play", - "fetish" + "on_all_fours", + "fake_ears", + "animal_ears", + "leather" ] } \ No newline at end of file diff --git a/data/actions/pose_nipple_licking_handjob_3.json b/data/actions/pose_nipple_licking_handjob_3.json index 8163d0a..7d7f89a 100644 --- a/data/actions/pose_nipple_licking_handjob_3.json +++ b/data/actions/pose_nipple_licking_handjob_3.json @@ -2,20 +2,16 @@ "action_id": "pose_nipple_licking_handjob_3", "action_name": "Pose Nipple Licking Handjob 3", "action": { - "full_body": "duo, intimate pose, character leaning forward over partner, sexual activity, close proximity", - "head": "face near chest, licking, tongue out, sucking nipple, mouth open", - "eyes": "half-closed eyes, focused expression, lustful gaze", - "arms": "reaching down towards crotch, engaging contact", - "hands": "handjob, gripping penis, stroking, manual stimulation, skin tight", - "torso": "leaning forward, chest pressed or close, exposed nipples", - "pelvis": "erection, penis, genital exposure", - "legs": "kneeling, straddling, sitting", - "feet": "out of frame or curled", - "additional": "saliva, arousal, sweat" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "duo, sexual_activity", + "head": "tongue_out", + "eyes": "looking_at_partner", + "arms": "reaching", + "hands": "handjob, holding_penis", + "torso": "licking_nipple", + "pelvis": "penis, testicles, erection", + "legs": "standing", + "feet": "standing", + "additional": "1boy, 1girl, hetero" }, "lora": { "lora_name": "Illustrious/Poses/pose_nipple_licking_handjob_3.safetensors", @@ -23,13 +19,16 @@ "lora_triggers": "pose_nipple_licking_handjob_3" }, "tags": [ - "nipple_licking", + "1boy", + "1girl", + "hetero", + "sexual_activity", "handjob", - "duo", - "sexual_act", + "licking_nipple", + "tongue_out", "penis", - "licking", - "sucking", - "tongue" + "testicles", + "erection", + "duo" ] } \ No newline at end of file diff --git a/data/actions/pov_blowjob__titjob__handjob_illustrious_000005.json b/data/actions/pov_blowjob__titjob__handjob_illustrious_000005.json new file mode 100644 index 0000000..780d46b --- /dev/null +++ b/data/actions/pov_blowjob__titjob__handjob_illustrious_000005.json @@ -0,0 +1,37 @@ +{ + "action_id": "pov_blowjob__titjob__handjob_illustrious_000005", + "action_name": "Pov Blowjob Titjob Handjob Illustrious 000005", + "action": { + "full_body": "pov, kneeling, fellatio, paizuri, handjob", + "head": "looking_at_viewer, deepthroat", + "eyes": "looking_at_viewer", + "arms": "head_grab", + "hands": "handjob", + "torso": "breasts, cleavage, underboob", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "barefoot", + "additional": "pov B+T+H, one handed, two handed, cum_in_mouth" + }, + "lora": { + "lora_name": "Illustrious/Poses/Pov_Blowjob__Titjob__Handjob_Illustrious-000005.safetensors", + "lora_weight": 1.0, + "lora_triggers": "pov, 1girl, 1boy, fellatio, paizuri, handjob, pov B+T+H" + }, + "tags": [ + "pov", + "looking_at_viewer", + "fellatio", + "paizuri", + "handjob", + "deepthroat", + "head_grab", + "cum_in_mouth", + "cleavage", + "underboob", + "kneeling", + "from_above", + "from_below", + "dutch_angle" + ] +} \ No newline at end of file diff --git a/data/actions/pov_cellphone_screen_stevechopz.json b/data/actions/pov_cellphone_screen_stevechopz.json index 3d74e22..ffa948d 100644 --- a/data/actions/pov_cellphone_screen_stevechopz.json +++ b/data/actions/pov_cellphone_screen_stevechopz.json @@ -2,36 +2,30 @@ "action_id": "pov_cellphone_screen_stevechopz", "action_name": "Pov Cellphone Screen Stevechopz", "action": { - "full_body": "first-person perspective view of a hand holding a smartphone in the foreground, framing a subject on the screen", - "head": "subject's face visible on the digital display, looking into the lens", - "eyes": "direct eye contact from the subject on the screen", - "arms": "viewer's arm extending into frame holding the device", - "hands": "viewer's hand gripping a black smartphone, one hand holding phone", - "torso": "subject on screen cropped from chest up or full body depending on zoom", + "full_body": "pov, first-person_view", + "head": "looking_at_phone", + "eyes": "looking_at_viewer", + "arms": "pov_hands, holding_phone", + "hands": "holding_phone", + "torso": "upper_body", "pelvis": "n/a", "legs": "n/a", "feet": "n/a", - "additional": "phone layout, camera ui, recording stats, blurred background behind the phone, depth of field" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "additional": "smartphone, viewfinder, taking_picture, recording" }, "lora": { "lora_name": "Illustrious/Poses/POV_Cellphone_Screen_SteveChopz.safetensors", "lora_weight": 1.0, - "lora_triggers": "POV_Cellphone_Screen_SteveChopz" + "lora_triggers": "ChoPS, pov hands, cellphone, holding cellphone, phone screen, cellphone picture, 5 fingers" }, "tags": [ "pov", - "holding phone", + "pov_hands", + "holding_phone", "smartphone", - "phone screen", - "display", - "recording", - "camera interface", - "depth of field", - "technology", - "social media" + "viewfinder", + "taking_picture", + "looking_at_phone", + "1girl" ] } \ No newline at end of file diff --git a/data/actions/pov_cowgirl_looking_down_illustrious_000005.json b/data/actions/pov_cowgirl_looking_down_illustrious_000005.json index 7733855..6794938 100644 --- a/data/actions/pov_cowgirl_looking_down_illustrious_000005.json +++ b/data/actions/pov_cowgirl_looking_down_illustrious_000005.json @@ -2,34 +2,31 @@ "action_id": "pov_cowgirl_looking_down_illustrious_000005", "action_name": "Pov Cowgirl Looking Down Illustrious 000005", "action": { - "full_body": "cowgirl position, straddling, sitting on viewer, female on top", - "head": "looking down, face mostly visible", - "eyes": "looking at viewer, eye contact", - "arms": "arms resting on thighs or reaching down", - "hands": "hands on knees or hands on viewer", - "torso": "leaning forward, viewed from below", - "pelvis": "hips wide, straddling camera, intimate proximity", - "legs": "kneeling, knees apart, bent knees, thighs framing view", - "feet": "tucked behind or out of frame", - "additional": "pov, from below, foreshortening, depth of field" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "cowgirl_position, straddling, girl_on_top", + "head": "looking_down", + "eyes": "looking_at_viewer", + "arms": "reaching_towards_viewer", + "hands": "open_hands", + "torso": "leaning_forward, breasts_hanging", + "pelvis": "straddling", + "legs": "kneeling, spread_legs", + "feet": "toes_curled", + "additional": "pov, from_below, intense_glare, blushing" }, "lora": { "lora_name": "Illustrious/Poses/Pov_Cowgirl_Looking_Down_Illustrious-000005.safetensors", "lora_weight": 1.0, - "lora_triggers": "Pov_Cowgirl_Looking_Down_Illustrious-000005" + "lora_triggers": "CG_LD, pov, girl_on_top, straddling, leaning_forward, looking_down" }, "tags": [ - "pov", - "cowgirl position", + "cowgirl_position", "straddling", - "looking down", - "from below", - "female on top", + "girl_on_top", + "pov", + "looking_down", + "from_below", + "leaning_forward", "kneeling", - "intimate" + "reaching_towards_viewer" ] } \ No newline at end of file diff --git a/data/actions/pov_mirror_fellatio_illustrious.json b/data/actions/pov_mirror_fellatio_illustrious.json index cc7f874..ef096f0 100644 --- a/data/actions/pov_mirror_fellatio_illustrious.json +++ b/data/actions/pov_mirror_fellatio_illustrious.json @@ -2,35 +2,35 @@ "action_id": "pov_mirror_fellatio_illustrious", "action_name": "Pov Mirror Fellatio Illustrious", "action": { - "full_body": "POV shot, looking into a large mirror, reflection shows a character kneeling in front of the viewer performing oral sex", - "head": "head angled slightly up towards the reflection, facing the mirror", - "eyes": "eye contact with the viewer via the mirror reflection", - "arms": "reaching forward to hold the viewer's hips or thighs", - "hands": "hands grasping the viewer or guiding the action", - "torso": "leaning forward, back slightly arched", - "pelvis": "kneeling position, hips lower than head", - "legs": "kneeling on the floor, knees bent", - "feet": "tucked under or resting on the floor", - "additional": "bathroom setting, mirror frame visible, viewer's body partially visible in reflection" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling or squatting in front of a mirror", + "head": "facing mirror, looking at viewer in reflection", + "eyes": "looking at viewer", + "arms": "reaching forward or resting on partner", + "hands": "hand on another's head", + "torso": "facing mirror", + "pelvis": "ass visible, facing away from viewer (towards mirror)", + "legs": "kneeling or squatting", + "feet": "toes touching ground", + "additional": "viewed from behind with action visible in mirror reflection" }, "lora": { "lora_name": "Illustrious/Poses/POV_mirror_fellatio_Illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "POV_mirror_fellatio_Illustrious" + "lora_triggers": "pov, mirror, fellatio, kneeling, looking_at_viewer" }, "tags": [ "pov", "mirror", - "reflection", "fellatio", - "oral sex", "kneeling", - "looking at viewer", - "bathroom", - "nsfw" + "looking_at_viewer", + "ass", + "faceless_male", + "reflection", + "thong", + "underwear", + "hand_on_another's_head", + "nude", + "from_behind" ] } \ No newline at end of file diff --git a/data/actions/pov_sex.json b/data/actions/pov_sex.json index 67ef417..338b2c3 100644 --- a/data/actions/pov_sex.json +++ b/data/actions/pov_sex.json @@ -2,38 +2,33 @@ "action_id": "pov_sex", "action_name": "Pov Sex", "action": { - "full_body": "pov, first-person view, partner lying on back, intimate proximity, from above", - "head": "head resting on pillow, chin tilted up, flushed face, messy hair, heavy breathing expression", - "eyes": "looking at viewer, intense eye contact, half-closed eyes, bedroom eyes, pupils dilated", - "arms": "reaching up towards camera, embracing viewer or gripping bed sheets", - "hands": "fingers curled, holding viewer's shoulders or clutching sheets", - "torso": "supine, lying on bed, chest exposed, slightly arched back", - "pelvis": "legs spread wide, hips elevated, engaging with viewer", - "legs": "wrapped around viewer's waist or knees bent and spread, legs up", - "feet": "toes curled, typically out of focus or frame", - "additional": "sweat drop, disheveled bed sheets, viewer's hands visible on partner's body, cinematic lighting" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "missionary, lying, on_back", + "head": "looking_at_viewer, blush", + "eyes": "open_eyes, looking_at_viewer", + "arms": "holding_legs, arms_up", + "hands": "grabbing_own_thighs", + "torso": "breasts, nipples", + "pelvis": "vaginal, penis, insertion", + "legs": "legs_together, legs_up", + "feet": "toes_curled", + "additional": "pov, sex, hetero, 1boy, 1girl" }, "lora": { "lora_name": "Illustrious/Poses/POV_SEX.safetensors", "lora_weight": 1.0, - "lora_triggers": "POV_SEX" + "lora_triggers": "POV_SEX_V1" }, "tags": [ "pov", - "looking at viewer", - "missionary", - "lying on back", - "legs wrapped", "sex", - "intimate", - "sweat", - "blush", - "bed", - "messy sheets", - "from above" + "missionary", + "vaginal", + "lying", + "on_back", + "legs_together", + "holding_legs", + "penis", + "hetero", + "rating:explicit" ] } \ No newline at end of file diff --git a/data/actions/pov_sitting_on_lap_illustrious_000005.json b/data/actions/pov_sitting_on_lap_illustrious_000005.json index d039852..a4d1475 100644 --- a/data/actions/pov_sitting_on_lap_illustrious_000005.json +++ b/data/actions/pov_sitting_on_lap_illustrious_000005.json @@ -2,34 +2,33 @@ "action_id": "pov_sitting_on_lap_illustrious_000005", "action_name": "Pov Sitting On Lap Illustrious 000005", "action": { - "full_body": "pov, sitting on lap, straddling, close physical proximity", - "head": "facing viewer, slightly looking down", - "eyes": "intense eye contact, looking at viewer", - "arms": "shoulders raise, arms wrapped around viewer's neck or resting on viewer's chest", - "hands": "interlocked behind viewer's head or touching viewer's shoulders", - "torso": "leaning forward, upper body close to camera", - "pelvis": "seated directly on viewer", - "legs": "legs apart, straddling, knees bent outward, thighs visible at bottom of frame", - "feet": "out of frame or dangling", - "additional": "intimate atmosphere, foreshortening, first-person perspective" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "pov, sitting_on_lap, straddling", + "head": "looking_at_viewer, from_above", + "eyes": "looking_at_viewer", + "arms": "reaching_towards_viewer, arms_around_neck", + "hands": "reaching_towards_viewer", + "torso": "leaning_forward", + "pelvis": "sitting, squatting, straddling", + "legs": "legs_apart, straddling, kneeling", + "feet": "kneeling", + "additional": "1girl, 1boy, sexual_innuendo" }, "lora": { "lora_name": "Illustrious/Poses/Pov_Sitting_on_Lap_Illustrious-000005.safetensors", "lora_weight": 1.0, - "lora_triggers": "Pov_Sitting_on_Lap_Illustrious-000005" + "lora_triggers": "pov sitting on lap" }, "tags": [ "pov", - "sitting on lap", + "sitting_on_lap", "straddling", - "arms around neck", - "looking at viewer", - "intimate", - "legs apart", - "close-up" + "looking_at_viewer", + "reaching_towards_viewer", + "squatting", + "1girl", + "1boy", + "from_above", + "from_below", + "facing_away" ] } \ No newline at end of file diff --git a/data/actions/princess_carry_fellatio_r1.json b/data/actions/princess_carry_fellatio_r1.json index face246..13008fb 100644 --- a/data/actions/princess_carry_fellatio_r1.json +++ b/data/actions/princess_carry_fellatio_r1.json @@ -2,36 +2,29 @@ "action_id": "princess_carry_fellatio_r1", "action_name": "Princess Carry Fellatio R1", "action": { - "full_body": "duo, 1boy, 1girl, standing, lift, the male character is standing and holding the female character in his arms off the ground, the female character is performing oral sex while being carried", - "head": "female head positioned at male crotch level, face touching penis, cheek bulging, eyes looking up or closed", - "eyes": "upturned eyes, half-closed eyes, or heart-shaped pupils", - "arms": "male arms wrapping around female back and under knees (cradle hold/princess carry), female hands holding male hips or guiding penis", - "hands": "hands on hips, gripping clothing", - "torso": "female body curled inward towards male, male torso upright and leaning slightly back to support weight", - "pelvis": "male hips thrust forward, female pelvis suspended in air adjacent to male waist", - "legs": "male legs standing apart for balance, female legs bent at knees and supported by male arm, feet dangling", - "feet": "toes pointing down or curled", - "additional": "height difference, suspended in air, gravity defiance, fluid motion" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "Female character standing upright, holding a male character horizontally across her chest in a bridal carry (princess carry) position.", + "head": "Looking down towards the male's groin area, mouth open or engaged in fellatio.", + "eyes": "Focused downwards on the male.", + "arms": "Curved under the male's back and knees, supporting his full weight.", + "hands": "Firmly gripping the male's body or legs for support.", + "torso": "Strong posture, leaning slightly back to counterbalance the weight.", + "pelvis": "Squared forward, stable base.", + "legs": "Standing with a wide, stable stance to support the weight.", + "feet": "Planted firmly on the ground.", + "additional": "The female is typically depicted as larger/taller/stronger than the male (size difference); male is often nude while female is clothed." }, "lora": { "lora_name": "Illustrious/Poses/Princess_Carry_Fellatio_r1.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Princess_Carry_Fellatio_r1" + "lora_weight": 0.85, + "lora_triggers": "Princess Carry Fellatio, Female carrying male, hetero, clothed female, nude male, size difference, larger female, from side" }, "tags": [ - "princess carry", + "princess_carry", + "carrying", "fellatio", "standing", - "lifted by other", - "carrying", - "standing fellatio", - "oral", - "duo", - "holding up", - "nsfw" + "size_difference", + "tall_female", + "hetero" ] } \ No newline at end of file diff --git a/data/actions/prison_guard_size_diff_000011_1658658.json b/data/actions/prison_guard_size_diff_000011_1658658.json index 4199636..5143494 100644 --- a/data/actions/prison_guard_size_diff_000011_1658658.json +++ b/data/actions/prison_guard_size_diff_000011_1658658.json @@ -2,33 +2,32 @@ "action_id": "prison_guard_size_diff_000011_1658658", "action_name": "Prison Guard Size Diff 000011 1658658", "action": { - "full_body": "standing tall and imposing, looming over the viewer to emphasize extreme size difference, dominant posture", - "head": "looking down with a stern, authoritative expression, chin tucked", - "eyes": "intimidating gaze, narrowed eyes directed downwards", - "arms": "crossed firmly over chest or hands resting heavily on hips", - "hands": "gripping waist or resting on utility belt", - "torso": "broad, upright, uniformed chest", - "pelvis": "squared hips facing forward", - "legs": "wide stance, legs straight and solid", - "feet": "heavy boots planted firmly", - "additional": "low angle perspective, perspective distortion, prison corridor background" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "mating press, size difference, male on top, female lying on back", + "head": "looking up, expression of overwhelming sensation", + "eyes": "open or rolling back", + "arms": "male hands holding female legs, female arms reaching or pinned", + "hands": "grip on legs", + "torso": "male torso dominates frame, female torso flat on surface", + "pelvis": "connected, hips elevated", + "legs": "legs up, spread, held by partner, feet in air", + "feet": "toes curled", + "additional": "extreme size difference, giant male, small female" }, "lora": { "lora_name": "Illustrious/Poses/Prison_Guard_Size_Diff-000011_1658658.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Prison_Guard_Size_Diff-000011_1658658" + "lora_weight": 0.8, + "lora_triggers": "MPSDV1.0, mating press, size difference" }, "tags": [ - "height gap", - "giantess", - "intimidation", - "corrections officer", - "low angle", - "dominance", - "perspective" + "mating_press", + "size_difference", + "giant", + "giant_male", + "legs_up", + "holding_legs", + "leg_grab", + "on_back", + "spread_legs", + "sex" ] } \ No newline at end of file diff --git a/data/actions/pussy_sandwich_illustrious.json b/data/actions/pussy_sandwich_illustrious.json new file mode 100644 index 0000000..2fcfcf9 --- /dev/null +++ b/data/actions/pussy_sandwich_illustrious.json @@ -0,0 +1,30 @@ +{ + "action_id": "pussy_sandwich_illustrious", + "action_name": "Pussy Sandwich Illustrious", + "action": { + "full_body": "Two girls in a yuri embrace or interaction, one character positioning their legs to sandwich the other's face or body part", + "head": "Expressions of arousal or exertion, looking at partner or viewer", + "eyes": "Half-closed or detailed eyes", + "arms": "Holding legs or grabbing sheets", + "hands": "Touching thighs or partner's body", + "torso": "Twisted or leaning forward to engage in the leg lock", + "pelvis": "Hips positioned to squeeze or rub", + "legs": "Thighs squeezing tightly, engaging the pussy sandwich mechanics", + "feet": "Toes curled or flat depending on leverage", + "additional": "Intimate atmosphere, skin friction" + }, + "lora": { + "lora_name": "Illustrious/Poses/pussy_sandwich_illustrious.safetensors", + "lora_weight": 1.0, + "lora_triggers": "pussy_sandwich" + }, + "tags": [ + "pussy_sandwich", + "yuri", + "2girls", + "between_legs", + "thighs", + "sandwiched", + "lesbian" + ] +} \ No newline at end of file diff --git a/data/actions/pussy_sandwich_v0_8_illu_done.json b/data/actions/pussy_sandwich_v0_8_illu_done.json new file mode 100644 index 0000000..df0210b --- /dev/null +++ b/data/actions/pussy_sandwich_v0_8_illu_done.json @@ -0,0 +1,36 @@ +{ + "action_id": "pussy_sandwich_v0_8_illu_done", + "action_name": "Pussy Sandwich V0 8 Illu Done", + "action": { + "full_body": "2girls, lying, cooperative_grinding, girl_on_top", + "head": "looking_back, looking_at_viewer", + "eyes": "detailed_eyes", + "arms": "arm_around_waist, grab", + "hands": "touching_partner", + "torso": "twisted_torso, nude, facing_away", + "pelvis": "ass_focus, presenting_hindquarters, tribadism", + "legs": "spread_legs, kneeling", + "feet": "barefoot", + "additional": "pussy_sandwich, sidelighting, deep_skin, shiny_skin" + }, + "lora": { + "lora_name": "Illustrious/Poses/pussy_sandwich_v0.8-illu_done.safetensors", + "lora_weight": 1.0, + "lora_triggers": "pussy_sandwich, cooperative_grinding, tribadism, ass, pussy" + }, + "tags": [ + "pussy_sandwich", + "cooperative_grinding", + "tribadism", + "2girls", + "lying", + "girl_on_top", + "from_behind", + "looking_back", + "ass_focus", + "spread_legs", + "nude", + "masterpiece", + "best_quality" + ] +} \ No newline at end of file diff --git a/data/actions/reclining_cowgirl_position.json b/data/actions/reclining_cowgirl_position.json index 0c1d485..789ec68 100644 --- a/data/actions/reclining_cowgirl_position.json +++ b/data/actions/reclining_cowgirl_position.json @@ -2,34 +2,32 @@ "action_id": "reclining_cowgirl_position", "action_name": "Reclining Cowgirl Position", "action": { - "full_body": "reclining cowgirl pose, female on top, straddling partner, leaning backwards", - "head": "tilted back, neck exposed, chin up", - "eyes": "half-closed, rolling back, or closed in pleasure", - "arms": "arms extended backward, supporting upper body weight behind the torso", - "hands": "hands resting on partner's shins or on the bed for stability", - "torso": "arched back, spine curved, chest thrust forward, leaning back", - "pelvis": "seated on partner's hips, straddling, crotch contact", - "legs": "knees bent, thighs spread wide, straddling partner's torso", - "feet": "toes pointed, tucked under or resting on the mattress", - "additional": "partner lying on back underneath, intimate setting, bed sheets" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "cowgirl_position, straddling, girl_on_top, leaning_back", + "head": "head_back, facing_another", + "eyes": "half-closed_eyes", + "arms": "arms_extended, holding_hands, interlocked_fingers", + "hands": "clald_hands, interlocked_fingers", + "torso": "arched_back, leaning_back, bouncing_breasts", + "pelvis": "straddling, on_top", + "legs": "kneeling, spread_legs, straddling", + "feet": "toes_pointed", + "additional": "from_side, motion_lines, motion_blur" }, "lora": { "lora_name": "Illustrious/Poses/Reclining_Cowgirl_Position.safetensors", - "lora_weight": 1.0, + "lora_weight": 0.5, "lora_triggers": "Reclining_Cowgirl_Position" }, "tags": [ - "cowgirl position", - "sex", - "woman on top", - "leaning back", + "cowgirl_position", "straddling", - "arched back", - "erotic", - "vaginal sex" + "girl_on_top", + "leaning_back", + "holding_hands", + "interlocked_fingers", + "from_side", + "arched_back", + "half-closed_eyes", + "bouncing_breasts" ] } \ No newline at end of file diff --git a/data/actions/regression_illustrious.json b/data/actions/regression_illustrious.json index cc74004..ab970ce 100644 --- a/data/actions/regression_illustrious.json +++ b/data/actions/regression_illustrious.json @@ -2,31 +2,27 @@ "action_id": "regression_illustrious", "action_name": "Regression Illustrious", "action": { - "full_body": "sitting on floor, curled up, huddled, hugging knees, making body appear smaller", - "head": "resting on knees or looking up from low angle, shy expression", - "eyes": "wide innocent eyes, looking up", - "arms": "wrapping around shins, hugging legs tight", - "hands": "clasped together in front of shins or hiding inside sleeves", - "torso": "hunched forward slightly, compacted", - "pelvis": "sitting flat on the ground", - "legs": "knees pulled up tight to chest, deep flexion", - "feet": "heels close to body, toes pointing inward", - "additional": "oversized clothing, vulnerable posture, perspective from above looking down" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "standing, full_body, small_stature", + "head": "looking_at_viewer, blush", + "eyes": "open_eyes", + "arms": "arms_at_sides, sleeves_past_fingers", + "hands": "hands_hidden", + "torso": "oversized_clothes", + "pelvis": "hips", + "legs": "legs_together", + "feet": "barefoot", + "additional": "age_regression, child, cute" }, "lora": { "lora_name": "Illustrious/Poses/Regression_Illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "Regression_Illustrious" + "lora_triggers": "AgeRegression" }, "tags": [ - "sitting", - "hugging knees", - "curled up", - "floor", - "vulnerable" + "age_regression", + "oversized_clothes", + "sleeves_past_fingers", + "child", + "cute" ] } \ No newline at end of file diff --git a/data/actions/res_facial.json b/data/actions/res_facial.json index e698874..45d1c3b 100644 --- a/data/actions/res_facial.json +++ b/data/actions/res_facial.json @@ -2,32 +2,32 @@ "action_id": "res_facial", "action_name": "Res Facial", "action": { - "full_body": "upper body portrait shot, character is leaning slightly forward toward the camera", - "head": "facing directly at the viewer, chin slightly tucked", - "eyes": "intense gaze, looking directly into the camera", - "arms": "bent upwards at the elbows", - "hands": "palms resting gently against cheeks or framing the face to emphasize the expression", - "torso": "upper torso visible, facing forward", - "pelvis": "not visible", - "legs": "not visible", - "feet": "not visible", - "additional": "soft lighting highlighting facial contours" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "1girl, 2boys, restrained, forced", + "head": "head_grab, hand_on_another's_face, head_back", + "eyes": "eyes_closed", + "arms": "arms_behind_back", + "hands": "bound_wrists", + "torso": "upper_body", + "pelvis": "standing", + "legs": "standing", + "feet": "standing", + "additional": "facial, bukkake, cum, cum_on_hair, penis" }, "lora": { "lora_name": "Illustrious/Poses/res_facial.safetensors", - "lora_weight": 1.0, - "lora_triggers": "res_facial" + "lora_weight": 0.8, + "lora_triggers": "restrained_facial" }, "tags": [ - "close-up", - "portrait", - "looking_at_viewer", - "face_focus", - "touching_face", - "detailed_eyes" + "restrained", + "forced", + "head_grab", + "hand_on_another's_face", + "grabbing_from_behind", + "facial", + "bukkake", + "cum_on_hair", + "eyes_closed", + "2boys" ] } \ No newline at end of file diff --git a/data/actions/reversefellatio.json b/data/actions/reversefellatio.json index 8545954..5be40cf 100644 --- a/data/actions/reversefellatio.json +++ b/data/actions/reversefellatio.json @@ -2,34 +2,33 @@ "action_id": "reversefellatio", "action_name": "Reversefellatio", "action": { - "full_body": "lying supine on a surface (bed/couch), body flat, head positioned over the edge", - "head": "inverted, hanging upside down, neck hyper-extended and exposed, hair hanging down due to gravity", - "eyes": "looking up (inverted) or rolled back, expressive", - "arms": "resting alongside the head or reaching back to hold the edge", - "hands": "gripping sheets or relaxed", - "torso": "lying flat on back, chest facing up, slightly arched", - "pelvis": "resting flat on the surface", - "legs": "extended straight or knees bent with feet on the surface", - "feet": "resting on the surface", - "additional": "gravity effects on hair and clothing, inverted perspective, often implies receiving oral sex from above/behind" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "1girl and 1boy in sexual position, one partner upside-down", + "head": "head_back, mouth connection", + "eyes": "eyes_closed", + "arms": "arms_supporting_body or grabbing_hips", + "hands": "on_thighs", + "torso": "inverted torso alignment", + "pelvis": "hips aligned for oral interaction", + "legs": "legs_up or straddling", + "feet": "bare_feet or shoes", + "additional": "deepthroat, throat_bulge, sexual_act" }, "lora": { "lora_name": "Illustrious/Poses/reversefellatio.safetensors", "lora_weight": 1.0, - "lora_triggers": "reversefellatio" + "lora_triggers": "reverse fellatio, upside-down, upside-down fellatio" }, "tags": [ - "reverse fellatio", + "reverse_fellatio", "upside-down", - "head hanging off bed", - "lying on back", - "supine", - "neck exposed", - "inverted face", - "from above" + "fellatio", + "irrumatio", + "deepthroat", + "throat_bulge", + "head_back", + "from_side", + "penis", + "1girl", + "1boy" ] } \ No newline at end of file diff --git a/data/actions/reversemilking_illu_dwnsty.json b/data/actions/reversemilking_illu_dwnsty.json index bf3a6bf..46b29b2 100644 --- a/data/actions/reversemilking_illu_dwnsty.json +++ b/data/actions/reversemilking_illu_dwnsty.json @@ -2,33 +2,34 @@ "action_id": "reversemilking_illu_dwnsty", "action_name": "Reversemilking Illu Dwnsty", "action": { - "full_body": "character straddling partner or object while facing away, reverse cowgirl stance, kneeling position", - "head": "turned back looking over shoulder or facing forward away from view", - "eyes": "looking back at viewer or closed in pleasure", - "arms": "arms supporting weight on the surface or reaching back to hold partner", - "hands": "hands pressing down on bed or holding own thighs", - "torso": "back arched, leaning forward slightly to accentuate buttocks", - "pelvis": "hips lowered, buttocks spread, engaging in straddling motion", - "legs": "knees bent, legs spread wide, straddling", - "feet": "toes dragging or feet flat on bed", - "additional": "emphasis on dorsal view and buttocks, motion lines often implied" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, between_legs", + "head": "head_tilt, looking_at_viewer", + "eyes": "detailed_eyes", + "arms": "arms_reaching", + "hands": "handjob, reverse_grip, penis_grab", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "feet_tucked", + "additional": "motion_lines, hand_up, sweat" }, "lora": { "lora_name": "Illustrious/Poses/ReverseMilking_Illu_Dwnsty.safetensors", "lora_weight": 1.0, - "lora_triggers": "ReverseMilking_Illu_Dwnsty" + "lora_triggers": "reverse-grip milking, testicles, penis, 1boy, between legs" }, "tags": [ - "reverse cowgirl", - "straddling", - "from behind", - "ass focus", - "looking back", - "back arched", - "kneeling" + "handjob", + "reverse_grip", + "kneeling", + "penis", + "testicles", + "between_legs", + "clothed_female_nude_male", + "from_behind", + "penis_grab", + "motion_lines", + "looking_at_viewer", + "solo_focus" ] } \ No newline at end of file diff --git a/data/actions/saliva_swap_illustrious.json b/data/actions/saliva_swap_illustrious.json index 99a488a..40c5654 100644 --- a/data/actions/saliva_swap_illustrious.json +++ b/data/actions/saliva_swap_illustrious.json @@ -2,36 +2,34 @@ "action_id": "saliva_swap_illustrious", "action_name": "Saliva Swap Illustrious", "action": { - "full_body": "close-up or medium shot of two characters engaged in a passionate french kiss", - "head": "heads tilted, faces pressing together, cheeks flushed with heavy blush", - "eyes": "eyes closed, shut tight, or half-closed with hearts in eyes indicating pleasure", - "arms": "wrapping around the partner's neck or waist, embracing tightly", - "hands": "cupping cheeks, holding the back of the head, or grabbing shoulders", - "torso": "chests pressed intimately against one another", - "pelvis": "hips close together", - "legs": "standing close or intertwined if sitting", - "feet": "neutral or tip-toes", - "additional": "thick saliva trail connecting mouths, tongues touching, open mouths, exchange of fluids, messy kiss" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "close-up, upper_body", + "head": "profile, open_mouth, tongue_out, touching_tongues", + "eyes": "closed_eyes, blush", + "arms": "embracing, around_neck", + "hands": "cupping_face, gripping", + "torso": "upper_body", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "saliva, saliva_trail, drooling, spitting, heavy_breathing" }, "lora": { "lora_name": "Illustrious/Poses/saliva_swap_illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "saliva_swap_illustrious" + "lora_weight": 0.8, + "lora_triggers": "slvswp, saliva_swap" }, "tags": [ - "kissing", - "french kiss", + "saliva_swap", + "drooling", "saliva", - "saliva trail", + "french_kiss", + "open_mouth", "tongue", - "open mouth", - "duo", - "romantic", - "intimate", - "blush" + "tongue_out", + "saliva_trail", + "spitting", + "from_side", + "profile", + "after_kiss" ] } \ No newline at end of file diff --git a/data/actions/sandwich_v3_frontback_il_1164907.json b/data/actions/sandwich_v3_frontback_il_1164907.json new file mode 100644 index 0000000..e063bc4 --- /dev/null +++ b/data/actions/sandwich_v3_frontback_il_1164907.json @@ -0,0 +1,32 @@ +{ + "action_id": "sandwich_v3_frontback_il_1164907", + "action_name": "Sandwich V3 Frontback Il 1164907", + "action": { + "full_body": "sandwiched between two people, standing or lying, one partner in front and one behind", + "head": "forced backward or looking up, blushing, scared or grinning expression", + "eyes": "open", + "arms": "restrained, held back, or being grabbed by partners", + "hands": "restricted movement", + "torso": "compressed between two bodies", + "pelvis": "engaged in sexual activity from front and back simultaneously", + "legs": "standing or spread if lying", + "feet": "planted or passive", + "additional": "pincer maneuver, asymmetrical positioning" + }, + "lora": { + "lora_name": "Illustrious/Poses/Sandwich_v3_frontback IL_1164907.safetensors", + "lora_weight": 0.8, + "lora_triggers": "fdom_sw" + }, + "tags": [ + "sandwiched", + "threesome", + "group_sex", + "ffm_threesome", + "femdom", + "1boy", + "2girls", + "restrained", + "grabbing_another's_arm" + ] +} \ No newline at end of file diff --git a/data/actions/sex_machine.json b/data/actions/sex_machine.json index 39de57f..f3297bb 100644 --- a/data/actions/sex_machine.json +++ b/data/actions/sex_machine.json @@ -2,33 +2,40 @@ "action_id": "sex_machine", "action_name": "Sex Machine", "action": { - "full_body": "lying on back, mating press, legs lifted high and spread wide, body compacted, hips elevated", - "head": "head thrown back into pillow, mouth wide open, tongue out, expression of intense pleasure", - "eyes": "eyes rolled back, heart-shaped pupils, eyelids heavy", - "arms": "reaching forward or gripping bedsheets tightly above head, strained muscles", - "hands": "clenched fists, fingers digging into fabric", - "torso": "arched back, chest heaving, glistening with sweat", - "pelvis": "tilted upward, exposed, engaged in action", - "legs": "legs up, knees bent heavily towards shoulders, m-legs, wide stance", - "feet": "toes curled, pointing upward or resting on partner's shoulders", - "additional": "messy bed sheets, motion lines, steam, liquid details, high contrast" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sitting, spread_legs, restrained", + "head": "gagged, screaming, wince, head_back", + "eyes": "tears, forced_orgasm", + "arms": "bound_wrists, shackles, mechanical_arms", + "hands": "bound", + "torso": "arched_back, trembling", + "pelvis": "object_insertion, sex_machine, dildo", + "legs": "spread_legs, bound_ankles", + "feet": "shackles", + "additional": "stationary_restraints, motion_lines" }, "lora": { "lora_name": "Illustrious/Poses/Sex_Machine.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Sex_Machine" + "lora_weight": 0.7, + "lora_triggers": "Sex Machine, stationary restraints" }, "tags": [ - "mating press", - "legs up", - "ahegao", - "sweaty", - "messy bed", - "intense", - "nsfw" + "sex_machine", + "stationary_restraints", + "sitting", + "spread_legs", + "bound_wrists", + "bound_ankles", + "shackles", + "gagged", + "arched_back", + "forced_orgasm", + "screaming", + "wince", + "tears", + "trembling", + "object_insertion", + "dildo", + "mechanical_arms", + "motion_lines" ] } \ No newline at end of file diff --git a/data/actions/sgb_ilxl_v1.json b/data/actions/sgb_ilxl_v1.json index 6ee31c8..f1f4a16 100644 --- a/data/actions/sgb_ilxl_v1.json +++ b/data/actions/sgb_ilxl_v1.json @@ -2,34 +2,30 @@ "action_id": "sgb_ilxl_v1", "action_name": "Sgb Ilxl V1", "action": { - "full_body": "character performing a vertical standing split (I-balance), standing on one leg with the other extended straight up", - "head": "upright, facing forward", - "eyes": "looking at viewer", - "arms": "reaching upwards to support the lifted leg", - "hands": "grasping the ankle, foot, or calf of the vertical leg", - "torso": "erect, maintaining balance", - "pelvis": "tilted upward to allow the leg to reach vertical extension", - "legs": "one leg planted firmly on the ground, the other lifted 180 degrees vertically alongside the head", - "feet": "raised foot pointed towards the sky", - "additional": "demonstrating extreme flexibility and gymnastics ability" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "upper_body", + "head": "blush, smile, open_mouth", + "eyes": "looking_at_viewer", + "arms": "arms_on_breasts", + "hands": "grabbing_own_breast", + "torso": "medium_breasts, breast_squeeze", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "fingers, skin_indentation" }, "lora": { "lora_name": "Illustrious/Poses/sgb_ilxl_v1.safetensors", "lora_weight": 1.0, - "lora_triggers": "sgb_ilxl_v1" + "lora_triggers": "grabbing another's breast, grabbing own breast" }, "tags": [ - "standing split", - "i-balance", - "holding leg", - "leg up", - "high kick", - "stretching", - "gymnastics", - "flexible" + "grabbing_own_breast", + "grabbing_another's_breast", + "groping", + "squeezing", + "medium_breasts", + "large_breasts", + "rubbing_breasts", + "close-up" ] } \ No newline at end of file diff --git a/data/actions/sitting_on_mouth_000012_illustrious.json b/data/actions/sitting_on_mouth_000012_illustrious.json index 7808fb6..47fd947 100644 --- a/data/actions/sitting_on_mouth_000012_illustrious.json +++ b/data/actions/sitting_on_mouth_000012_illustrious.json @@ -2,34 +2,31 @@ "action_id": "sitting_on_mouth_000012_illustrious", "action_name": "Sitting On Mouth 000012 Illustrious", "action": { - "full_body": "sitting directly on top of camera, straddling position, pov from below, squatting or kneeling", - "head": "tilted down, looking down at viewer", - "eyes": "looking at viewer, eye contact", - "arms": "resting on knees or supporting weight on bed/floor", - "hands": "hands on knees, grabbing thighs, or caressing own legs", - "torso": "foward leaning, foreshortened perspective", - "pelvis": "centered in view, pressing down", - "legs": "spread legs, knees bent, thighs framing the image", - "feet": "planted on surface on either side of viewer or out of frame", - "additional": "intimate proximity, focus on thighs and hips, view from bottom" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "sitting_on_face, sitting_on_person, femdom", + "head": "looking_down, dominant_expression", + "eyes": "looking_at_viewer, narrowing_eyes", + "arms": "arms_at_sides", + "hands": "resting_on_legs", + "torso": "leaning_forward", + "pelvis": "sitting", + "legs": "outstretched_legs, spread_legs, legs_apart", + "feet": "barefoot", + "additional": "1boy, lying_on_back, choking" }, "lora": { "lora_name": "Illustrious/Poses/Sitting_On_Mouth-000012 Illustrious.safetensors", "lora_weight": 1.0, - "lora_triggers": "Sitting_On_Mouth-000012 Illustrious" + "lora_triggers": "FSOMILV1, facesitting, femdom" }, "tags": [ - "facesitting", - "sitting on face", - "pov", - "from below", - "straddling", - "looking down", - "thighs", - "crotch focus" + "sitting_on_face", + "sitting_on_person", + "outstretched_legs", + "spread_legs", + "looking_down", + "femdom", + "full_body", + "dominant_female", + "legs_apart" ] } \ No newline at end of file diff --git a/data/actions/small_dom_big_sub.json b/data/actions/small_dom_big_sub.json index 2781254..97dfb6c 100644 --- a/data/actions/small_dom_big_sub.json +++ b/data/actions/small_dom_big_sub.json @@ -2,36 +2,30 @@ "action_id": "small_dom_big_sub", "action_name": "Small Dom Big Sub", "action": { - "full_body": "two characters, extreme size difference, height difference, small character standing confidently, large character kneeling submissively, giantess trope aesthetic", - "head": "tilted down, looking down, tilted up, looking up, eye contact", - "eyes": "condescending gaze, adoring gaze, locking eyes", - "arms": "arms crossed, hands on hips, arms resting on thighs", - "hands": "hands on hips, hands on knees", - "torso": "straight posture, leaning forward, hulking frame vs petite frame", - "pelvis": "facing forward, angled slightly", - "legs": "standing straight, kneeling, bent knees", - "feet": "flat on ground, toes on ground", - "additional": "low angle, perspective exaggeration, comparison" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "Small male clinging to the back of a standing large female in a piggyback position", + "head": "Male head resting near female's neck or shoulder", + "eyes": "Closed or looking at partner", + "arms": "Male arms wrapped tightly around female's neck or shoulders", + "hands": "Clasped or holding on to shoulders", + "torso": "Male torso pressed against female's back", + "pelvis": "Engaged in sex from behind", + "legs": "Male legs locked around female's waist in a leg lock", + "feet": "Dangling or hooked behind female", + "additional": "Significant size difference creates a stark contrast between partners" }, "lora": { "lora_name": "Illustrious/Poses/Small_Dom_Big_Sub.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Small_Dom_Big_Sub" + "lora_weight": 0.8, + "lora_triggers": "SDBS_V1, piggyback, small male, huge female, size difference" }, "tags": [ - "size difference", - "height difference", - "kneeling", - "standing", - "looking up", - "looking down", - "female domination", - "duo", - "minigirl", - "giantess" + "piggyback", + "standing_sex", + "sex_from_behind", + "miniboy", + "giantess", + "size_difference", + "leg_lock", + "carrying" ] } \ No newline at end of file diff --git a/data/actions/spread_pussy_one_hand_pony_v1_0.json b/data/actions/spread_pussy_one_hand_pony_v1_0.json index ba51861..51fdeee 100644 --- a/data/actions/spread_pussy_one_hand_pony_v1_0.json +++ b/data/actions/spread_pussy_one_hand_pony_v1_0.json @@ -2,36 +2,30 @@ "action_id": "spread_pussy_one_hand_pony_v1_0", "action_name": "Spread Pussy One Hand Pony V1 0", "action": { - "full_body": "lying on back, legs spread wide, lower body focus", - "head": "tilted forward, looking at viewer", - "eyes": "aroused, half-closed eyes, heart-shaped pupils", - "arms": "one arm reaching down between legs, other arm resting at side", - "hands": "one hand on crotch, fingers spreading pussy, spreading labia", - "torso": "arched back, navel exposed", - "pelvis": "hips wide, genitals exposed, vulva visible", - "legs": "legs apart, m-legs, knees bent", - "feet": "toes curled", - "additional": "pussy juice, wet, detailed, uncensored" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "spread_legs, m_legs, legs_up", + "head": "looking_at_viewer, blush", + "eyes": "open_eyes", + "arms": "arms_apart", + "hands": "fingering", + "torso": "exposed_breasts, navel", + "pelvis": "spread_pussy, kupaa, cameltoe", + "legs": "spread_legs, m_legs, legs_apart", + "feet": "barefoot", + "additional": "pussy_juice" }, "lora": { "lora_name": "Illustrious/Poses/spread pussy one hand_pony_V1.0.safetensors", "lora_weight": 1.0, - "lora_triggers": "spread pussy one hand_pony_V1.0" + "lora_triggers": "spread pussy, one hand" }, "tags": [ - "spread pussy", - "one hand", - "spreading", - "pussy", - "open legs", - "vaginal", + "spread_pussy", + "kupaa", + "spread_legs", + "m_legs", + "legs_apart", + "legs_up", "fingering", - "genitals", - "uncensored", - "lower body" + "looking_at_viewer" ] } \ No newline at end of file diff --git a/data/actions/srjxia.json b/data/actions/srjxia.json index c8565d8..4ccbbd7 100644 --- a/data/actions/srjxia.json +++ b/data/actions/srjxia.json @@ -2,31 +2,31 @@ "action_id": "srjxia", "action_name": "Srjxia", "action": { - "full_body": "standing, leaning on object, leaning on sword, confident pose, solo", - "head": "looking at viewer, arrogant expression, slight head tilt", - "eyes": "purple eyes, narrow gaze", - "arms": "one hand on hip, one hand holding sword handle", - "hands": "resting on sword hilt, hand on hip", - "torso": "straight posture, slight twist", - "pelvis": "weight shifted to one leg", - "legs": "crossed legs or standing relaxedly", - "feet": "standing on ground", - "additional": "giant sword, claymore, weapon, embers, magma, fire particles" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "minigirl sitting inside a glass jar", + "head": "looking at viewer", + "eyes": "open eyes", + "arms": "arms close to body, cramped space", + "hands": "hands on legs or pressing against glass", + "torso": "leaning forward or upright", + "pelvis": "sitting on bottom of jar", + "legs": "knees directly up, knees to chest", + "feet": "bare feet or shoeless", + "additional": "transparent glass, reflection, confined space" }, "lora": { "lora_name": "Illustrious/Poses/srjxia.safetensors", "lora_weight": 1.0, - "lora_triggers": "srjxia" + "lora_triggers": "GirlInGlassJar" }, "tags": [ - "arknights", - "character focus", - "demon girl", - "weapon focus", - "anime style" + "minigirl", + "jar", + "glass", + "in_container", + "sitting", + "knees_to_chest", + "stuck", + "cramped", + "trapped" ] } \ No newline at end of file diff --git a/data/actions/stealthfellatio.json b/data/actions/stealthfellatio.json index ac1027a..7adc723 100644 --- a/data/actions/stealthfellatio.json +++ b/data/actions/stealthfellatio.json @@ -2,36 +2,33 @@ "action_id": "stealthfellatio", "action_name": "Stealthfellatio", "action": { - "full_body": "duo, one person sitting at a table or desk, the other person hiding underneath performing oral sex, split composition showing above and below surface", - "head": "receiver looking ahead trying to maintain composure, giver's head positioned at crotch level", - "eyes": "nervous glance, looking away, or rolled back in pleasure", - "arms": "resting casually on the table top or gripping the edge of the desk tightly", - "hands": "hands folded on table or clutching thighs", - "torso": "receiver sitting upright, giver crouched or bent over", - "pelvis": "sexual contact, fellatio, penis in mouth", - "legs": "receiver legs spread, giver kneeling between legs", - "feet": "flat on floor", - "additional": "under the table, secret sex, public setting, tablecloth, cutaway view, risk of getting caught" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, sitting, under_table, from_side", + "head": "fellatio, irrumatio, deepthroat", + "eyes": "looking_up", + "arms": "penis_hold, hands_on_lap", + "hands": "holding_penis", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "tucked", + "additional": "desk, stealth_sex, floor, office" }, "lora": { "lora_name": "Illustrious/Poses/stealthfellatio.safetensors", "lora_weight": 1.0, - "lora_triggers": "stealthfellatio" + "lora_triggers": "stealth fellatio, under table" }, "tags": [ - "stealth", + "stealth_fellatio", "under_table", + "desk", + "stealth_sex", "fellatio", - "blowjob", - "public_sex", - "secret_sex", - "under_desk", - "flustered", - "duo", - "table_hiding" + "irrumatio", + "kneeling", + "from_side", + "penis_hold", + "floor", + "deepthroat" ] } \ No newline at end of file diff --git a/data/actions/straddling_kiss_illustriousxl_lora_nochekaiser.json b/data/actions/straddling_kiss_illustriousxl_lora_nochekaiser.json index 6485bee..b353034 100644 --- a/data/actions/straddling_kiss_illustriousxl_lora_nochekaiser.json +++ b/data/actions/straddling_kiss_illustriousxl_lora_nochekaiser.json @@ -2,34 +2,32 @@ "action_id": "straddling_kiss_illustriousxl_lora_nochekaiser", "action_name": "Straddling Kiss Illustriousxl Lora Nochekaiser", "action": { - "full_body": "two subjects, intimate couple pose, one subject sitting on the other's lap facing them, straddling position", - "head": "faces close together, kissing, lips joined, side profile view, tilted heads", - "eyes": "closed eyes, affectionate expression", - "arms": "arms wrapping around neck, arms embracing waist, holding each other close", - "hands": "cupping face, hands on waist, hands grasping shoulders, fingers in hair", - "torso": "chests pressed together, bodies leaning into each other", - "pelvis": "sitting on lap, pelvis close contact, weight supported by partner", - "legs": "legs wrapped around partner's waist, knees bent, thighs straddling hips", - "feet": "feet dangling or hooked behind partner's back", - "additional": "romantic atmosphere, blushing, floating hearts, intimate interaction" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "girl on top, upright straddle, straddling partner while sitting on them", + "head": "kissing, tilted head, blushing", + "eyes": "closed eyes", + "arms": "arms around partner's neck, embracing", + "hands": "resting on shoulders or holding face", + "torso": "upright posture, chest pressing against partner", + "pelvis": "sitting on partner's waist/hips", + "legs": "straddling partner's torso, knees bent", + "feet": "tucked or resting on the surface", + "additional": "intimate atmosphere, on bed" }, "lora": { "lora_name": "Illustrious/Poses/straddling-kiss-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "straddling-kiss-illustriousxl-lora-nochekaiser" + "lora_triggers": "straddling kiss" }, "tags": [ "straddling", "kiss", - "lap sitting", + "girl_on_top", + "upright_straddle", + "sitting_on_person", "couple", - "intimate", - "legs wrapped around", - "romance", - "embrace" + "on_bed", + "closed_eyes", + "blush", + "arms_around_neck" ] } \ No newline at end of file diff --git a/data/actions/superstyle_illustrious.json b/data/actions/superstyle_illustrious.json index 7b35713..417a156 100644 --- a/data/actions/superstyle_illustrious.json +++ b/data/actions/superstyle_illustrious.json @@ -2,31 +2,34 @@ "action_id": "superstyle_illustrious", "action_name": "Superstyle Illustrious", "action": { - "full_body": "dynamic full body shot, exaggerated perspective, dutch angle, floating pose or action stance", - "head": "confident expression, facing viewer, hair flowing dynamically", - "eyes": "sharp focus, detailed eyes, intense gaze", - "arms": "reaching towards camera or spread wide", - "hands": "fingers splayed, dramatic gesture", - "torso": "slightly twisted, leaning forward or backward", - "pelvis": "tilted hips", - "legs": "foreshortened, one leg extended towards viewer", - "feet": "dynamic positioning", - "additional": "wind effects, cinematic lighting, high contrast, vibrant colors, sharp outlines" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "doggystyle, all_fours, kneeling, sex_from_behind", + "head": "blush, clenched_teeth", + "eyes": "half_closed_eyes", + "arms": "arms_extended_forward", + "hands": "hands_on_ground", + "torso": "bent_over, arched_back, hanging_breasts", + "pelvis": "raised_hips, ass, presenting_hindquarters", + "legs": "kneeling, spread_legs", + "feet": "toes", + "additional": "size_difference, interspecies, from_side, sex" }, "lora": { "lora_name": "Illustrious/Poses/Superstyle_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Superstyle_Illustrious" + "lora_weight": 0.7, + "lora_triggers": "superstyle" }, "tags": [ - "dynamic pose", - "intricate details", - "stylized", - "masterpiece", - "vibrant" + "doggystyle", + "all_fours", + "sex_from_behind", + "from_side", + "arched_back", + "raised_hips", + "bent_over", + "hands_on_ground", + "hanging_breasts", + "interspecies", + "size_difference", + "blush" ] } \ No newline at end of file diff --git a/data/actions/testiclesucking.json b/data/actions/testiclesucking.json index c5f35c5..c5d97ca 100644 --- a/data/actions/testiclesucking.json +++ b/data/actions/testiclesucking.json @@ -2,34 +2,31 @@ "action_id": "testiclesucking", "action_name": "Testiclesucking", "action": { - "full_body": "kneeling pose, head positioned between partner's legs", - "head": "face nestled against scrotum, mouth engaged with testicles, neck crane upwards", - "eyes": "looking up or closed in concentration, eye contact with partner", - "arms": "reaching forward to stabilize", - "hands": "cupping the scrotum gently or holding partner's thighs", - "torso": "leaning forward, slight arch in back", - "pelvis": "kneeling, hips resting on heels or raised slightly", - "legs": "kneels on floor or bed", - "feet": "relaxed", - "additional": "saliva strings, tongue extended, cheek bulge, sucking action" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "kneeling, testicle_sucking", + "head": "naughty_face, blushing, tongue_out", + "eyes": "looking_at_viewer", + "arms": "arms_up", + "hands": "holding_penis", + "torso": "leaning_forward", + "pelvis": "kneeling", + "legs": "kneeling", + "feet": "barefoot", + "additional": "penis, testicles, penis_on_face, saliva_trail, huge_penis" }, "lora": { "lora_name": "Illustrious/Poses/testiclesucking.safetensors", "lora_weight": 1.0, - "lora_triggers": "testiclesucking" + "lora_triggers": "testicle sucking, balls sucking" }, "tags": [ - "testicle sucking", - "ball worship", - "oral sex", - "fellatio", - "kneeling", - "saliva", - "balls", - "scrotum" + "testicle_sucking", + "penis_on_face", + "penis", + "testicles", + "saliva_trail", + "naughty_face", + "blushing", + "tongue", + "kneeling" ] } \ No newline at end of file diff --git a/data/actions/threesome_sex_and_rimminganilingus.json b/data/actions/threesome_sex_and_rimminganilingus.json index c090885..548daa1 100644 --- a/data/actions/threesome_sex_and_rimminganilingus.json +++ b/data/actions/threesome_sex_and_rimminganilingus.json @@ -2,35 +2,33 @@ "action_id": "threesome_sex_and_rimminganilingus", "action_name": "Threesome Sex And Rimminganilingus", "action": { - "full_body": "threesome, group sex, three characters interacting, one character receiving anilingus while interacting with a third", - "head": "face buried in buttocks, tongue extended, expressions of pleasure, looking back", - "eyes": "eyes closed, rolled back, ahegao, intense focus", - "arms": "holding hips, grabbing sheets, supporting body weight, reaching between legs", - "hands": "spreading buttocks, gripping waist, fingering, touching", - "torso": "bent over, arched back, leaning forward", - "pelvis": "lifted hips, presenting anus, gluteal cleft exposed", - "legs": "kneeling, all fours, legs spread wide, straddling", - "feet": "barefoot, toes curled, plantar flexion", - "additional": "rimming, anilingus, saliva, Ass focus, explicit, wet" - }, - "participants": { - "solo_focus": "false", - "orientation": "MFF" + "full_body": "ffm_threesome, group_sex, standing_sex, sex_from_behind, from_side", + "head": "open_mouth, tongue, blush, ahegao, heavy_breathing", + "eyes": "heart-shaped_pupils", + "arms": "hands_on_another's_hips", + "hands": "grabbing_hips", + "torso": "large_breasts, nipples, wet_skin", + "pelvis": "nude, pubic_hair", + "legs": "standing", + "feet": "barefoot", + "additional": "anilingus, implied_anilingus, motion_lines, twitching" }, "lora": { "lora_name": "Illustrious/Poses/Threesome_sex_and_rimminganilingus.safetensors", "lora_weight": 1.0, - "lora_triggers": "Threesome_sex_and_rimminganilingus" + "lora_triggers": "ffm_sex_and_anilingus" }, "tags": [ - "threesome", - "group sex", - "rimming", + "ffm_threesome", + "group_sex", + "standing_sex", + "sex_from_behind", "anilingus", - "ass licking", - "spreading", - "all fours", - "doggystyle", - "explicit" + "nude", + "open_mouth", + "tongue", + "blush", + "motion_lines", + "from_side" ] } \ No newline at end of file diff --git a/data/actions/tinygirl___illustrious_000016.json b/data/actions/tinygirl___illustrious_000016.json index 3575bc9..d7584fe 100644 --- a/data/actions/tinygirl___illustrious_000016.json +++ b/data/actions/tinygirl___illustrious_000016.json @@ -2,34 +2,27 @@ "action_id": "tinygirl___illustrious_000016", "action_name": "Tinygirl Illustrious 000016", "action": { - "full_body": "sitting, knees up, embracing knees, small scale", - "head": "tilted up, looking up", - "eyes": "wide eyes, curious", - "arms": "arms around legs", - "hands": "hands clasped", - "torso": "leaning forward slightly", - "pelvis": "sitting on surface", - "legs": "bent, knees to chest", - "feet": "close together", - "additional": "size difference, giant surroundings, depth of field, oversized furniture" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "minigirl, size_difference, standing", + "head": "looking_at_viewer, looking_up", + "eyes": "detailed_eyes", + "arms": "arms_at_sides", + "hands": "small_hands", + "torso": "torso", + "pelvis": "hips", + "legs": "legs_together", + "feet": "barefoot", + "additional": "giant, miniature, scale_comparison, high_angle" }, "lora": { "lora_name": "Illustrious/Poses/Tinygirl_-_Illustrious-000016.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Tinygirl_-_Illustrious-000016" + "lora_weight": 0.6, + "lora_triggers": "teeny, tinygirl" }, "tags": [ - "tinygirl", - "size difference", - "mini", - "sitting", - "knees up", - "looking up", - "giant background", - "macrophilia" + "minigirl", + "size_difference", + "1girl", + "miniature", + "looking_at_viewer" ] } \ No newline at end of file diff --git a/data/actions/tongue_lick__press.json b/data/actions/tongue_lick__press.json index 2bfb82d..d8f2206 100644 --- a/data/actions/tongue_lick__press.json +++ b/data/actions/tongue_lick__press.json @@ -2,36 +2,30 @@ "action_id": "tongue_lick__press", "action_name": "Tongue Lick Press", "action": { - "full_body": "close-up or upper body shot, character leaning intimately towards the viewer or a transparent surface", - "head": "face pushed forward, chin tilted slightly up, facial muscles relaxed but focused on the mouth", - "eyes": "looking at viewer, half-closed or crossed eyes (ahegao style), intense gaze", - "arms": "raised to frame the face or resting on the surface being licked", - "hands": "palms potentially pressed against the screen/glass, fingers splayed", - "torso": "leaning forward, chest pressed slightly if close to surface", - "pelvis": "n/a (usually out of frame)", - "legs": "n/a (usually out of frame)", - "feet": "n/a (usually out of frame)", - "additional": "tongue pressed flat against the screen/glass, saliva strings, visible moisture on tongue, breath condensation" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "close-up, side view, intimate distance", + "head": "open_mouth, tongue_out, saliva, drooling, head_tilt", + "eyes": "half-closed_eyes, lustful", + "arms": "arms_around_neck", + "hands": "holding_head, cup_face", + "torso": "upper_body", + "pelvis": "n/a", + "legs": "n/a", + "feet": "n/a", + "additional": "licking, french_kiss, wet" }, "lora": { "lora_name": "Illustrious/Poses/Tongue_Lick__Press.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Tongue_Lick__Press" + "lora_weight": 0.6, + "lora_triggers": "tongue lick, tongue press" }, "tags": [ - "tongue", "tongue_out", "licking", - "tongue_press", - "against_glass", - "saliva", "open_mouth", + "saliva", + "drooling", + "french_kiss", "close-up", - "pov", - "wet_tongue" + "from_side" ] } \ No newline at end of file diff --git a/data/actions/two_handed_handjob.json b/data/actions/two_handed_handjob.json index 9151238..11c51b7 100644 --- a/data/actions/two_handed_handjob.json +++ b/data/actions/two_handed_handjob.json @@ -2,33 +2,33 @@ "action_id": "two_handed_handjob", "action_name": "Two Handed Handjob", "action": { - "full_body": "kneeling or sitting close to partner, leaning forward", - "head": "tilted down watching hands or looking up with eye contact", - "eyes": "focused on the action or lustful gaze", - "arms": "extended forward, active engagement", - "hands": "both hands wrapped around penis, double grip, milking motion, tight hold, one hand above the other", - "torso": "leaning in towards partner's groin", - "pelvis": "positioned for stability", - "legs": "kneeling or spread", - "feet": "tucked or resting", - "additional": "erection, glans, stimulation, nsfw" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "two-handed_handjob", + "head": "naughty_face, blush, seductive_smile", + "eyes": "looking_at_viewer, half-closed_eyes", + "arms": "arms_forward", + "hands": "penis_grab, two_hands", + "torso": "breasts", + "pelvis": "penis", + "legs": "spread_legs", + "feet": "", + "additional": "glansjob, motion_lines, steam, sound_effects, pov" }, "lora": { "lora_name": "Illustrious/Poses/two-handed_handjob.safetensors", - "lora_weight": 1.0, - "lora_triggers": "two-handed_handjob" + "lora_weight": 0.9, + "lora_triggers": "two-handed_handjobV1, glansjob, two-handed_handjob" }, "tags": [ - "handjob", - "two hands", - "double grip", - "penis", - "stimulation", - "nsfw", - "stroking" + "two-handed_handjob", + "glansjob", + "penis_grab", + "naughty_face", + "seductive_smile", + "motion_lines", + "steam", + "sound_effects", + "looking_at_viewer", + "half-closed_eyes", + "handjob" ] } \ No newline at end of file diff --git a/data/actions/upside_down_missionary_illustriousxl_lora_nochekaiser.json b/data/actions/upside_down_missionary_illustriousxl_lora_nochekaiser.json index ccb9308..c66be2f 100644 --- a/data/actions/upside_down_missionary_illustriousxl_lora_nochekaiser.json +++ b/data/actions/upside_down_missionary_illustriousxl_lora_nochekaiser.json @@ -2,35 +2,34 @@ "action_id": "upside_down_missionary_illustriousxl_lora_nochekaiser", "action_name": "Upside Down Missionary Illustriousxl Lora Nochekaiser", "action": { - "full_body": "duo focus, sexual position, lying on back, partner on top facing feet, reverse missionary, bodies aligned in opposite directions", - "head": "resting on surface, head back, facing upwards", - "eyes": "rolled back or looking at partner's back, half-closed", - "arms": "resting on bed or holding partner's thighs, arms at sides", - "hands": "clutching sheets or gripping partner", - "torso": "chest upwards, back flat on surface", - "pelvis": "hops raised, engaged in intercourse", - "legs": "legs spread wide, knees bent, legs up, m-legs or wrapped around partner's waist", - "feet": "toes curled, soles visible if legs raised", - "additional": "on bed, intimate angle, detailed anatomy" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "lying, on_back, missionary, upside-down, spread_legs", + "head": "upside-down, head_down", + "eyes": "open_eyes, looking_at_viewer", + "arms": "arms_at_sides, arms_up", + "hands": "grabbing_sheet, sheet_grab", + "torso": "chest_up, on_back, navel, collarbone", + "pelvis": "legs_spread, hips_up", + "legs": "spread_legs, knees_bent, legs_up", + "feet": "feet_up", + "additional": "blush, open_mouth, torso_grab, partner_hand_on_torso" }, "lora": { "lora_name": "Illustrious/Poses/upside-down-missionary-illustriousxl-lora-nochekaiser.safetensors", "lora_weight": 1.0, - "lora_triggers": "upside-down-missionary-illustriousxl-lora-nochekaiser" + "lora_triggers": "upside-down missionary, upside-down, missionary, on_back, spread_legs, torso_grab, sheet_grab" }, "tags": [ - "upside-down missionary", - "reverse missionary", - "lying on back", - "legs up", - "spread legs", - "duo", - "sex", - "vaginal", - "m-legs" + "upside-down", + "missionary", + "lying", + "on_back", + "spread_legs", + "sheet_grab", + "torso_grab", + "blush", + "open_mouth", + "navel", + "collarbone", + "from_above" ] } \ No newline at end of file diff --git a/data/actions/usbreedingslave.json b/data/actions/usbreedingslave.json index aadb8b7..a98cb5f 100644 --- a/data/actions/usbreedingslave.json +++ b/data/actions/usbreedingslave.json @@ -2,34 +2,31 @@ "action_id": "usbreedingslave", "action_name": "Usbreedingslave", "action": { - "full_body": "kneeling on all fours, submissive posture, presenting rear", - "head": "turned looking back over shoulder, mouth slightly open, blushing", - "eyes": "looking backward, upward gaze, heavy lidded", - "arms": "forced behind back, hyperextended shoulders", - "hands": "wrists bound together, hands clasped", - "torso": "deeply arched back, chest pressed low towards the ground", - "pelvis": "hips raised high, anterior pelvic tilt", - "legs": "kneeling, knees spread wide apart on the ground", - "feet": "toes curled against the surface, soles visible", - "additional": "wearing collar, sweat drops, heavy atmosphere" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "breeding_mount, bent_over, bound_wrists", + "head": "looking_at_viewer, facing_viewer", + "eyes": "seductive_look", + "arms": "bound, arms_behind_back", + "hands": "bound", + "torso": "bent_over", + "pelvis": "bottomless, no_pants", + "legs": "standing, legs_apart", + "feet": "standing", + "additional": "teasing, restrained" }, "lora": { "lora_name": "Illustrious/Poses/USBreedingSlave.safetensors", - "lora_weight": 1.0, - "lora_triggers": "USBreedingSlave" + "lora_weight": 0.6, + "lora_triggers": "USBreedingSlave, breeding_mount" }, "tags": [ - "kneeling", - "all fours", - "arched back", - "hands bound", - "from behind", - "submission", - "presenting", - "doggystyle" + "breeding_mount", + "bent_over", + "bound", + "restrained", + "bottomless", + "looking_at_viewer", + "teasing", + "seductive_smile", + "no_pants" ] } \ No newline at end of file diff --git a/data/actions/woman_on_top_pov_il_2.json b/data/actions/woman_on_top_pov_il_2.json index 6d69ea8..538098c 100644 --- a/data/actions/woman_on_top_pov_il_2.json +++ b/data/actions/woman_on_top_pov_il_2.json @@ -2,34 +2,33 @@ "action_id": "woman_on_top_pov_il_2", "action_name": "Woman On Top Pov Il 2", "action": { - "full_body": "pov, straddling, woman on top, cowgirl position, sitting on viewer", - "head": "looking down, looking at viewer, face close to camera", - "eyes": "eye contact, seductive gaze", - "arms": "hands on viewer's chest, bracing arms", - "hands": "palms flattening, touching chest", - "torso": "leaning forward, breasts hanging, stomach view", - "pelvis": "crotch contact, hips active", - "legs": "knees bent, spread legs, thighs framing view", - "feet": "out of frame", - "additional": "from below, male pov, lying on back (viewer), intimate angle" - }, - "participants": { - "solo_focus": "true", - "orientation": "MF" + "full_body": "girl_on_top, straddling, leaning_forward, sitting_on_person", + "head": "looking_down, looking_at_viewer", + "eyes": "looking_at_viewer", + "arms": "leaning_on_person", + "hands": "hands_on_own_hips", + "torso": "hanging_breasts, leaning_forward", + "pelvis": "straddling", + "legs": "kneeling, spread_legs", + "feet": "out_of_frame", + "additional": "pov, from_below, low_angle, foreshortening" }, "lora": { "lora_name": "Illustrious/Poses/Woman On Top POV-IL-2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Woman On Top POV-IL-2" + "lora_weight": 0.8, + "lora_triggers": "woman on top, fetop, from below" }, "tags": [ - "pov", - "woman on top", - "cowgirl position", - "looking down", + "girl_on_top", "straddling", - "hands on chest", - "from below", - "intimate" + "leaning_forward", + "looking_down", + "from_below", + "pov", + "hanging_breasts", + "long_hair", + "looking_at_viewer", + "sitting_on_person", + "leaning_on_person" ] } \ No newline at end of file diff --git a/data/checkpoints/checkpoint.json.template b/data/checkpoints/checkpoint.json.template new file mode 100644 index 0000000..88c7c42 --- /dev/null +++ b/data/checkpoints/checkpoint.json.template @@ -0,0 +1,9 @@ +{ + checkpoint_name: "checkpoint.safetensors", + base_postive: "anime", + base_negative: "text, logo", + steps: 25, + cfg: 5, + sampler_name: euler_ancestral, + vae: "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_animij_v7.json b/data/checkpoints/illustrious_animij_v7.json new file mode 100644 index 0000000..28ce375 --- /dev/null +++ b/data/checkpoints/illustrious_animij_v7.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/animij_v7.safetensors", + "checkpoint_name": "animij_v7.safetensors", + "base_positive": "masterpiece, high_quality, highres", + "base_negative": "worst quality, bad quality", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_arthemytoons_v40.json b/data/checkpoints/illustrious_arthemytoons_v40.json new file mode 100644 index 0000000..6c16d5b --- /dev/null +++ b/data/checkpoints/illustrious_arthemytoons_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/arthemyToons_v40.safetensors", + "checkpoint_name": "arthemyToons_v40.safetensors", + "base_positive": "toon (style), best quality, masterpiece, absurdres", + "base_negative": "low quality, worst quality, lowres", + "steps": 30, + "cfg": 3.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_beretmixreal_v80.json b/data/checkpoints/illustrious_beretmixreal_v80.json new file mode 100644 index 0000000..ca034b3 --- /dev/null +++ b/data/checkpoints/illustrious_beretmixreal_v80.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/beretMixReal_v80.safetensors", + "checkpoint_name": "beretMixReal_v80.safetensors", + "base_positive": "masterpiece, best quality, photo realistic, ultra detailed, realistic skin, ultra high res, 8k, very aesthetic, absurdres", + "base_negative": "worst quality, low quality, normal quality, watermark, sexual fluids", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_bismuthillustrious_v60.json b/data/checkpoints/illustrious_bismuthillustrious_v60.json new file mode 100644 index 0000000..bccd3ee --- /dev/null +++ b/data/checkpoints/illustrious_bismuthillustrious_v60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/bismuthIllustrious_v60.safetensors", + "checkpoint_name": "bismuthIllustrious_v60.safetensors", + "base_positive": "masterpiece, best quality, highly detailed, good quality, newest", + "base_negative": "bad quality, worst quality, lowres, deformed, bad hands, watermark, simple background", + "steps": 35, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_blendermixillustrious_v01.json b/data/checkpoints/illustrious_blendermixillustrious_v01.json new file mode 100644 index 0000000..6a3694a --- /dev/null +++ b/data/checkpoints/illustrious_blendermixillustrious_v01.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/blendermixIllustrious_v01.safetensors", + "checkpoint_name": "blendermixIllustrious_v01.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, low quality, jpeg artifacts, multiple views, 4koma, bad anatomy, bad hands, text", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_boleromixwainsfw_v10.json b/data/checkpoints/illustrious_boleromixwainsfw_v10.json new file mode 100644 index 0000000..4e716f6 --- /dev/null +++ b/data/checkpoints/illustrious_boleromixwainsfw_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/boleromixWAINSFW_v10.safetensors", + "checkpoint_name": "boleromixWAINSFW_v10.safetensors", + "base_positive": "(HDR), (intricate details), newest, (amazing quality:0.5), absurdres, highres, 8k resolution, film grain, soft lighting, anime, (anime screenshot:2, anime coloring:2), detailed background, 8k, masterpiece, best quality, very aesthetic", + "base_negative": "bad anatomy, sketch, jpeg artifacts, signature, watermark, bar censor, mosaic censoring, censored, mosaic, inset images, split images, backlighting, shaded face, out of frame, cropped, blurry, ugly, deformed, mutated, bad proportions, extra limbs, missing limbs, extra fingers, missing fingers, writing, text, username, comics, speech bubble, several images, collage, monochrome, smudge, artifact", + "steps": 24, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_catpony_aniilv51.json b/data/checkpoints/illustrious_catpony_aniilv51.json new file mode 100644 index 0000000..86e17a5 --- /dev/null +++ b/data/checkpoints/illustrious_catpony_aniilv51.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/catpony_aniIlV51.safetensors", + "checkpoint_name": "catpony_aniIlV51.safetensors", + "base_positive": "masterpiece, best quality, 2.5D, very aesthetic, absurdres", + "base_negative": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name", + "steps": 60, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_cherryfish_v60.json b/data/checkpoints/illustrious_cherryfish_v60.json new file mode 100644 index 0000000..c0248b3 --- /dev/null +++ b/data/checkpoints/illustrious_cherryfish_v60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/cherryfish_v60.safetensors", + "checkpoint_name": "cherryfish_v60.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, anime, high resolution, detailed", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, lowres, blurry", + "steps": 30, + "cfg": 3.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_cutecandymix_illustrious.json b/data/checkpoints/illustrious_cutecandymix_illustrious.json new file mode 100644 index 0000000..ada89e8 --- /dev/null +++ b/data/checkpoints/illustrious_cutecandymix_illustrious.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/cutecandymix_illustrious.safetensors", + "checkpoint_name": "cutecandymix_illustrious.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, year 2023", + "base_negative": "lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, (abstract:0.9), nsfw", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "sdxl_vae.safetensors" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_cuteretrogirl_v10.json b/data/checkpoints/illustrious_cuteretrogirl_v10.json new file mode 100644 index 0000000..a53d3dd --- /dev/null +++ b/data/checkpoints/illustrious_cuteretrogirl_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/cuteRetroGirl_v10.safetensors", + "checkpoint_name": "cuteRetroGirl_v10.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, retro-anime-style", + "base_negative": "low quality, worst quality, normal quality, jpeg artifacts, watermark, signature, text, error, bad anatomy, distorted, ugly", + "steps": 35, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_cyberillustrious_v50.json b/data/checkpoints/illustrious_cyberillustrious_v50.json new file mode 100644 index 0000000..bf999cb --- /dev/null +++ b/data/checkpoints/illustrious_cyberillustrious_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/cyberillustrious_v50.safetensors", + "checkpoint_name": "cyberillustrious_v50.safetensors", + "base_positive": "masterpiece, best quality, high quality, ultra-detailed, realistic", + "base_negative": "cartoon, illustration, anime, painting, CGI, 3D render, low quality, watermark, logo, label, deformed, deformed face, bad quality, worst quality, extra fingers, deformed teeth", + "steps": 30, + "cfg": 4.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_danliuweimix_v65.json b/data/checkpoints/illustrious_danliuweimix_v65.json new file mode 100644 index 0000000..52ee011 --- /dev/null +++ b/data/checkpoints/illustrious_danliuweimix_v65.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/danliuweiMix_v65.safetensors", + "checkpoint_name": "danliuweiMix_v65.safetensors", + "base_positive": "masterwork, masterpiece, best quality, detailed, high detail, very aesthetic, amazing quality, absurdres, newest", + "base_negative": "low quality, bad quality, worst quality, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, signature, watermark, username, blurry", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_dasiwaillustriousrealistic_shatteredrealityv1.json b/data/checkpoints/illustrious_dasiwaillustriousrealistic_shatteredrealityv1.json new file mode 100644 index 0000000..3bd9a25 --- /dev/null +++ b/data/checkpoints/illustrious_dasiwaillustriousrealistic_shatteredrealityv1.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/DasiwaIllustriousRealistic_shatteredrealityV1.safetensors", + "checkpoint_name": "DasiwaIllustriousRealistic_shatteredrealityV1.safetensors", + "base_positive": "masterpiece, best quality, realistic", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, username", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_divingillustrious_v11vae.json b/data/checkpoints/illustrious_divingillustrious_v11vae.json new file mode 100644 index 0000000..c26f41a --- /dev/null +++ b/data/checkpoints/illustrious_divingillustrious_v11vae.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/divingIllustrious_v11VAE.safetensors", + "checkpoint_name": "divingIllustrious_v11VAE.safetensors", + "base_positive": "masterpiece, best quality, ultra-HD, photorealistic, high detail, 8k", + "base_negative": "(worst quality, low quality, normal quality, caucasian:1), lowres, bad anatomy, bad hands, signature, watermarks, ugly, imperfect eyes, unnatural face, unnatural body, error, extra limb, missing limbs", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_dixar_4dixgalore.json b/data/checkpoints/illustrious_dixar_4dixgalore.json new file mode 100644 index 0000000..911f993 --- /dev/null +++ b/data/checkpoints/illustrious_dixar_4dixgalore.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/dixar_4DixGalore.safetensors", + "checkpoint_name": "dixar_4DixGalore.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy", + "steps": 40, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_dvine_v100.json b/data/checkpoints/illustrious_dvine_v100.json new file mode 100644 index 0000000..6a32959 --- /dev/null +++ b/data/checkpoints/illustrious_dvine_v100.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/dvine_v100.safetensors", + "checkpoint_name": "dvine_v100.safetensors", + "base_positive": "masterpiece, best quality, absurdres, highres, very aesthetic, high quality, detailed, insanely detailed, beautiful, very awa, anime screencap", + "base_negative": "lowres, bad quality, worst quality, bad anatomy, sketch, jpeg artifacts, ugly, poorly drawn, blurry, transparent background, tears, censored, (simple background:1.6), artist name, signature, watermark", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_earthboundmode9_v20.json b/data/checkpoints/illustrious_earthboundmode9_v20.json new file mode 100644 index 0000000..ec2c6d8 --- /dev/null +++ b/data/checkpoints/illustrious_earthboundmode9_v20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/earthboundMode9_v20.safetensors", + "checkpoint_name": "earthboundMode9_v20.safetensors", + "base_positive": "masterpiece, best quality, high resolution, very aesthetic", + "base_negative": "low quality, bad quality, worst quality, watermark", + "steps": 25, + "cfg": 6.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_finnishfish_v40.json b/data/checkpoints/illustrious_finnishfish_v40.json new file mode 100644 index 0000000..c77e316 --- /dev/null +++ b/data/checkpoints/illustrious_finnishfish_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/finnishfish_v40.safetensors", + "checkpoint_name": "finnishfish_v40.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, high-resolution, detailed skin, very aesthetic, absurdres, newest, volumetric lighting", + "base_negative": "lowres, worst quality, bad quality, bad anatomy, nsfw, 3d, watermark, text", + "steps": 30, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_fivestarsillustrious_50_1630144.json b/data/checkpoints/illustrious_fivestarsillustrious_50_1630144.json new file mode 100644 index 0000000..62309f6 --- /dev/null +++ b/data/checkpoints/illustrious_fivestarsillustrious_50_1630144.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/fiveStarsIllustrious_50_1630144.safetensors", + "checkpoint_name": "fiveStarsIllustrious_50_1630144.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, signature", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_flanimeillustriousxl_v16.json b/data/checkpoints/illustrious_flanimeillustriousxl_v16.json new file mode 100644 index 0000000..4278aad --- /dev/null +++ b/data/checkpoints/illustrious_flanimeillustriousxl_v16.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/flanimeIllustriousXL_v16.safetensors", + "checkpoint_name": "flanimeIllustriousXL_v16.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest, anime coloring", + "base_negative": "bad quality, worst quality, bad anatomy, bad hands, comic, jpeg artifacts, watermark, text, logo, artist name, realistic, 3d, ugly, distorted, poorly drawn, low quality", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_fubuwamix3dreal_v134.json b/data/checkpoints/illustrious_fubuwamix3dreal_v134.json new file mode 100644 index 0000000..6cdee30 --- /dev/null +++ b/data/checkpoints/illustrious_fubuwamix3dreal_v134.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/fubuwaMIX3DREAL_v134.safetensors", + "checkpoint_name": "fubuwaMIX3DREAL_v134.safetensors", + "base_positive": "masterpiece, best quality, 3d, realistic, very aesthetic, absurdres", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, signature, ugly, bad hands", + "steps": 30, + "cfg": 3.5, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_galenacatgalenacitronanime_ilv5.json b/data/checkpoints/illustrious_galenacatgalenacitronanime_ilv5.json new file mode 100644 index 0000000..39773a0 --- /dev/null +++ b/data/checkpoints/illustrious_galenacatgalenacitronanime_ilv5.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/galenaCATGalenaCitronAnime_ilV5.safetensors", + "checkpoint_name": "galenaCATGalenaCitronAnime_ilV5.safetensors", + "base_positive": "anime", + "base_negative": "text, logo", + "steps": 25, + "cfg": 5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_graycolorhentaimixil_v21reccomend.json b/data/checkpoints/illustrious_graycolorhentaimixil_v21reccomend.json new file mode 100644 index 0000000..de964d5 --- /dev/null +++ b/data/checkpoints/illustrious_graycolorhentaimixil_v21reccomend.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/graycolorhentaimixil_v21Reccomend.safetensors", + "checkpoint_name": "graycolorhentaimixil_v21Reccomend.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, newest", + "base_negative": "bad anatomy, worst quality, low quality", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "sdxl_vae.safetensors" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hana4chrome_huge.json b/data/checkpoints/illustrious_hana4chrome_huge.json new file mode 100644 index 0000000..17bd703 --- /dev/null +++ b/data/checkpoints/illustrious_hana4chrome_huge.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hana4CHROME_huge.safetensors", + "checkpoint_name": "hana4CHROME_huge.safetensors", + "base_positive": "HDR, raytracing, pathtracing, realistic shadows, masterpiece, best quality, newest, absurdres, highres", + "base_negative": "worst quality, bad quality, low quality, lowres, anatomical nonsense, artistic error, bad anatomy", + "steps": 30, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hana4chrome_v90.json b/data/checkpoints/illustrious_hana4chrome_v90.json new file mode 100644 index 0000000..c10f564 --- /dev/null +++ b/data/checkpoints/illustrious_hana4chrome_v90.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hana4CHROME_v90.safetensors", + "checkpoint_name": "hana4CHROME_v90.safetensors", + "base_positive": "HDR, raytracing, pathtracing, realistic shadows, masterpiece, best quality, newest, absurdres, highres", + "base_negative": "worst quality, bad quality, low quality, lowres, anatomical nonsense, artistic error, bad anatomy", + "steps": 30, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hassakuxlillustrious_v34.json b/data/checkpoints/illustrious_hassakuxlillustrious_v34.json new file mode 100644 index 0000000..841350b --- /dev/null +++ b/data/checkpoints/illustrious_hassakuxlillustrious_v34.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hassakuXLIllustrious_v34.safetensors", + "checkpoint_name": "hassakuXLIllustrious_v34.safetensors", + "base_positive": "masterpiece", + "base_negative": "signature, text, logo, speech bubble, watermark, low quality, worst quality", + "steps": 25, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hawawamixil_v10.json b/data/checkpoints/illustrious_hawawamixil_v10.json new file mode 100644 index 0000000..98ff245 --- /dev/null +++ b/data/checkpoints/illustrious_hawawamixil_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hawawamixIL_v10.safetensors", + "checkpoint_name": "hawawamixIL_v10.safetensors", + "base_positive": "masterpiece, best quality, newest, absurdres, highres, anime screenshot, anime coloring", + "base_negative": "(worst quality, low quality, normal quality), lowres, bad anatomy, bad hands, bad finger, signature, watermarks, bara, muscle, loli, realistic", + "steps": 20, + "cfg": 3.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hdarainbowillus_v14.json b/data/checkpoints/illustrious_hdarainbowillus_v14.json new file mode 100644 index 0000000..6b3f66e --- /dev/null +++ b/data/checkpoints/illustrious_hdarainbowillus_v14.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hdaRainbowIllus_v14.safetensors", + "checkpoint_name": "hdaRainbowIllus_v14.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "unfinished, (weird anatomy), bad anatomy, conjoined, english text, signature, text, censored, black border, border", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "sdxl_vae.safetensors" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hsartanime_il30.json b/data/checkpoints/illustrious_hsartanime_il30.json new file mode 100644 index 0000000..421cf41 --- /dev/null +++ b/data/checkpoints/illustrious_hsartanime_il30.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hsArtAnime_il30.safetensors", + "checkpoint_name": "hsArtAnime_il30.safetensors", + "base_positive": "masterpiece, best quality, newest, absurdres, highres, safe", + "base_negative": "nsfw, worst quality, old, early, low quality, lowres, signature, username, logo, bad hands, mutated hands, mammal, anthro, furry, ambiguous form, feral, semi-anthro", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_hsultrahdcg_v50.json b/data/checkpoints/illustrious_hsultrahdcg_v50.json new file mode 100644 index 0000000..7628fb9 --- /dev/null +++ b/data/checkpoints/illustrious_hsultrahdcg_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/hsUltrahdCG_v50.safetensors", + "checkpoint_name": "hsUltrahdCG_v50.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, anime, cg, digital painting", + "base_negative": "low quality, bad quality, worst quality, text, watermark, logo", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_ichigomilk_v10.json b/data/checkpoints/illustrious_ichigomilk_v10.json new file mode 100644 index 0000000..480008c --- /dev/null +++ b/data/checkpoints/illustrious_ichigomilk_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/ichigomilk_v10.safetensors", + "checkpoint_name": "ichigomilk_v10.safetensors", + "base_positive": "anime", + "base_negative": "text, logo", + "steps": 25, + "cfg": 5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustein_v2.json b/data/checkpoints/illustrious_illustein_v2.json new file mode 100644 index 0000000..ad20686 --- /dev/null +++ b/data/checkpoints/illustrious_illustein_v2.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustein_V2.safetensors", + "checkpoint_name": "illustein_V2.safetensors", + "base_positive": "masterpiece, best quality, absurdres", + "base_negative": "text, logo, watermark, bad anatomy, low quality, worst quality", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustrij_v20.json b/data/checkpoints/illustrious_illustrij_v20.json new file mode 100644 index 0000000..f898c63 --- /dev/null +++ b/data/checkpoints/illustrious_illustrij_v20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustrij_v20.safetensors", + "checkpoint_name": "illustrij_v20.safetensors", + "base_positive": "masterpiece, best quality, ultra-detailed, 8k resolution, high dynamic range, absurdres, stunningly, intricate details, sharp focus, detailed eyes, cinematic color grading, high-resolution texture", + "base_negative": "worst quality, bad quality", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustrijevo_lvl3.json b/data/checkpoints/illustrious_illustrijevo_lvl3.json new file mode 100644 index 0000000..6db2e3c --- /dev/null +++ b/data/checkpoints/illustrious_illustrijevo_lvl3.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustrijEVO_lvl3.safetensors", + "checkpoint_name": "illustrijEVO_lvl3.safetensors", + "base_positive": "masterpiece, best quality, ultra-detailed, 8k resolution, high dynamic range, absurdres, stunningly beautiful, intricate details, sharp focus, detailed eyes, cinematic color grading, high-resolution texture", + "base_negative": "(worst quality:2), (low quality:2), (normal quality:2), bad anatomy, bad proportions, poorly drawn face, poorly drawn hands, missing fingers, extra limbs, blurry, pixelated, distorted, lowres, jpeg artifacts, watermark, signature, text, (deformed:1.5), (bad hands:1.3), overexposed, underexposed, censored, mutated, extra fingers, cloned face, bad eyes", + "steps": 30, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustrijquill_v1.json b/data/checkpoints/illustrious_illustrijquill_v1.json new file mode 100644 index 0000000..77d2875 --- /dev/null +++ b/data/checkpoints/illustrious_illustrijquill_v1.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustrijQuill_v1.safetensors", + "checkpoint_name": "illustrijQuill_v1.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, bad quality", + "steps": 30, + "cfg": 7.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustriousgehenna_v40.json b/data/checkpoints/illustrious_illustriousgehenna_v40.json new file mode 100644 index 0000000..003ac4f --- /dev/null +++ b/data/checkpoints/illustrious_illustriousgehenna_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustriousGehenna_v40.safetensors", + "checkpoint_name": "illustriousGehenna_v40.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest, lips", + "base_negative": "text, logo, watermark, bad anatomy, low quality, worst quality", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_illustriouspixelart_v2seriesv201.json b/data/checkpoints/illustrious_illustriouspixelart_v2seriesv201.json new file mode 100644 index 0000000..2260c3b --- /dev/null +++ b/data/checkpoints/illustrious_illustriouspixelart_v2seriesv201.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/illustriousPixelart_v2SeriesV201.safetensors", + "checkpoint_name": "illustriousPixelart_v2SeriesV201.safetensors", + "base_positive": "pixel_art, retro_artstyle, masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy, 3d, photorealistic, blurry", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_ilustmix_v9.json b/data/checkpoints/illustrious_ilustmix_v9.json new file mode 100644 index 0000000..190222b --- /dev/null +++ b/data/checkpoints/illustrious_ilustmix_v9.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/ilustmix_v9.safetensors", + "checkpoint_name": "ilustmix_v9.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, detailed eyes, perfect eyes, realistic eyes", + "base_negative": "worst quality, bad quality, low quality, missing fingers, extra fingers, sweat, dutch angle", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_ilustmixv100_rpii.json b/data/checkpoints/illustrious_ilustmixv100_rpii.json new file mode 100644 index 0000000..da9ec13 --- /dev/null +++ b/data/checkpoints/illustrious_ilustmixv100_rpii.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/ilustmixV100.rPII.safetensors", + "checkpoint_name": "ilustmixV100.rPII.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, detailed eyes, perfect eyes, realistic eyes", + "base_negative": "loli, child, parted lips, (worst quality, low quality, sketch:1.1), error, bad anatomy, bad hands, watermark, ugly, distorted, censored, lowres, signature", + "steps": 25, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_jedpointil_v6vae.json b/data/checkpoints/illustrious_jedpointil_v6vae.json new file mode 100644 index 0000000..521b6e5 --- /dev/null +++ b/data/checkpoints/illustrious_jedpointil_v6vae.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/jedpointil_v6VAE.safetensors", + "checkpoint_name": "jedpointil_v6VAE.safetensors", + "base_positive": "masterpiece, detailed_eyes, high_quality, best_quality, highres, absurdres, 8k", + "base_negative": "poorly_detailed, jpeg_artifacts, worst_quality, bad_quality", + "steps": 40, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_kawaiialluxanime.json b/data/checkpoints/illustrious_kawaiialluxanime.json new file mode 100644 index 0000000..a647443 --- /dev/null +++ b/data/checkpoints/illustrious_kawaiialluxanime.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/kawaiialluxanime_.safetensors", + "checkpoint_name": "kawaiialluxanime_.safetensors", + "base_positive": "masterpiece, best quality, absurdres, amazing quality, intricate details", + "base_negative": "lowres, worst quality, low quality, bad anatomy, bad hand, extra digits, nsfw", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_kawaiimillesime_v6.json b/data/checkpoints/illustrious_kawaiimillesime_v6.json new file mode 100644 index 0000000..9d025de --- /dev/null +++ b/data/checkpoints/illustrious_kawaiimillesime_v6.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/kawaiimillesime_v6.safetensors", + "checkpoint_name": "kawaiimillesime_v6.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, black eyeliner, long eyelashes", + "base_negative": "worst quality, bad quality, realistic", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_kokioillu_v20.json b/data/checkpoints/illustrious_kokioillu_v20.json new file mode 100644 index 0000000..b0a5112 --- /dev/null +++ b/data/checkpoints/illustrious_kokioillu_v20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/kokioIllu_v20.safetensors", + "checkpoint_name": "kokioIllu_v20.safetensors", + "base_positive": "incredibly absurdres, highres, masterpiece, newest", + "base_negative": "anatomical nonsense, artistic error, bad anatomy, worst quality, bad quality, low quality, lowres", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_lemonsugarmix_v22.json b/data/checkpoints/illustrious_lemonsugarmix_v22.json new file mode 100644 index 0000000..50590d1 --- /dev/null +++ b/data/checkpoints/illustrious_lemonsugarmix_v22.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/lemonsugarmix_v22.safetensors", + "checkpoint_name": "lemonsugarmix_v22.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, 1girl", + "base_negative": "worst quality, bad quality", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_loxssoulsmixperfectdoll_v20.json b/data/checkpoints/illustrious_loxssoulsmixperfectdoll_v20.json new file mode 100644 index 0000000..fd3fbb1 --- /dev/null +++ b/data/checkpoints/illustrious_loxssoulsmixperfectdoll_v20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/loxsSoulsMixPerfectDoll_v20.safetensors", + "checkpoint_name": "loxsSoulsMixPerfectDoll_v20.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, 4k, high resolution, ultra-detailed, newest", + "base_negative": "low quality, bad quality, worst quality, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, signature, watermark, username, blurry", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_loxssoulsmixprisma_prismav60.json b/data/checkpoints/illustrious_loxssoulsmixprisma_prismav60.json new file mode 100644 index 0000000..1d2d995 --- /dev/null +++ b/data/checkpoints/illustrious_loxssoulsmixprisma_prismav60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/loxsSoulsMixPrisma_PRISMAV60.safetensors", + "checkpoint_name": "loxsSoulsMixPrisma_PRISMAV60.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, 4k, high resolution, ultra-detailed, newest", + "base_negative": "low quality, bad quality, worst quality, old, early, signature, watermark, username, artist name, bad anatomy", + "steps": 30, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_lunarcherrymix_v23.json b/data/checkpoints/illustrious_lunarcherrymix_v23.json new file mode 100644 index 0000000..fd0a649 --- /dev/null +++ b/data/checkpoints/illustrious_lunarcherrymix_v23.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/lunarcherrymix_v23.safetensors", + "checkpoint_name": "lunarcherrymix_v23.safetensors", + "base_positive": "masterpiece, best quality, ultra high res, photorealistic, 8K UHD, hyper-detailed", + "base_negative": "lowres, worst quality, bad quality, bad anatomy, sketch, jpeg artifacts, signature, watermark, old, oldest", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_lunarpeachmix_v21baseillustrxl20.json b/data/checkpoints/illustrious_lunarpeachmix_v21baseillustrxl20.json new file mode 100644 index 0000000..6a7fb2c --- /dev/null +++ b/data/checkpoints/illustrious_lunarpeachmix_v21baseillustrxl20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/lunarpeachmix_v21BaseIllustrxl20.safetensors", + "checkpoint_name": "lunarpeachmix_v21BaseIllustrxl20.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest, flat_color", + "base_negative": "bad quality, worst quality, worst detail, sketch, censor", + "steps": 35, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_magicill_magicillvpredv10.json b/data/checkpoints/illustrious_magicill_magicillvpredv10.json new file mode 100644 index 0000000..52abbda --- /dev/null +++ b/data/checkpoints/illustrious_magicill_magicillvpredv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/magicILL_magicILLVpredV10.safetensors", + "checkpoint_name": "magicILL_magicILLVpredV10.safetensors", + "base_positive": "masterpiece, best quality, absurdres, perfect composition, official_art, highly_detailed", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_manifestationsil_v40.json b/data/checkpoints/illustrious_manifestationsil_v40.json new file mode 100644 index 0000000..783a7f9 --- /dev/null +++ b/data/checkpoints/illustrious_manifestationsil_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/manifestationsIL_v40.safetensors", + "checkpoint_name": "manifestationsIL_v40.safetensors", + "base_positive": "masterpiece, ultra-detailed, 8k, subsurface scattering", + "base_negative": "", + "steps": 30, + "cfg": 4.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_maturacomix_aphoticred750.json b/data/checkpoints/illustrious_maturacomix_aphoticred750.json new file mode 100644 index 0000000..6c5b641 --- /dev/null +++ b/data/checkpoints/illustrious_maturacomix_aphoticred750.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/maturacomix_aphoticred750.safetensors", + "checkpoint_name": "maturacomix_aphoticred750.safetensors", + "base_positive": "masterpiece, best quality, anime, comics, crisp lines, high fidelity", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_maturacomix_arcadia.json b/data/checkpoints/illustrious_maturacomix_arcadia.json new file mode 100644 index 0000000..3575a63 --- /dev/null +++ b/data/checkpoints/illustrious_maturacomix_arcadia.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/maturacomix_arcadia.safetensors", + "checkpoint_name": "maturacomix_arcadia.safetensors", + "base_positive": "masterpiece, best quality, comic style, anime, crisp lines, vibrant colors, glossy, finished art", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, blurry", + "steps": 30, + "cfg": 5.0, + "sampler_name": "dpmpp_3m_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_maturacomix_boost.json b/data/checkpoints/illustrious_maturacomix_boost.json new file mode 100644 index 0000000..33ef823 --- /dev/null +++ b/data/checkpoints/illustrious_maturacomix_boost.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/maturacomix_boost.safetensors", + "checkpoint_name": "maturacomix_boost.safetensors", + "base_positive": "masterpiece, best quality, anime, comics, crisp lines, vibrant, glossy, high fidelity, bold style", + "base_negative": "low quality, worst quality, bad anatomy, blurry, text, watermark", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_maturacomix_nitro.json b/data/checkpoints/illustrious_maturacomix_nitro.json new file mode 100644 index 0000000..55b9ef6 --- /dev/null +++ b/data/checkpoints/illustrious_maturacomix_nitro.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/maturacomix_nitro.safetensors", + "checkpoint_name": "maturacomix_nitro.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, crisp lines, comic style, vibrant colors, sharp focus", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, blurry, watermark, text, logo, signature", + "steps": 30, + "cfg": 4.5, + "sampler_name": "dpmpp_3m_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_maturacomix_oneshot.json b/data/checkpoints/illustrious_maturacomix_oneshot.json new file mode 100644 index 0000000..babfb04 --- /dev/null +++ b/data/checkpoints/illustrious_maturacomix_oneshot.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/maturacomix_oneshot.safetensors", + "checkpoint_name": "maturacomix_oneshot.safetensors", + "base_positive": "masterpiece, best quality, anime, comic style, hybrid style, sharp lines, vibrant colors, expressive lineweight, polished rendering", + "base_negative": "low quality, bad anatomy, worst quality, watermark, text, blurry, artifacts", + "steps": 30, + "cfg": 4.5, + "sampler_name": "dpmpp_3m_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_mergeijponyil_v30vae_1382655.json b/data/checkpoints/illustrious_mergeijponyil_v30vae_1382655.json new file mode 100644 index 0000000..f3d13c4 --- /dev/null +++ b/data/checkpoints/illustrious_mergeijponyil_v30vae_1382655.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/mergeijPONYIL_v30VAE_1382655.safetensors", + "checkpoint_name": "mergeijPONYIL_v30VAE_1382655.safetensors", + "base_positive": "masterpiece, best_quality, amazing_quality, very_aesthetic, absurdres, newest, detailed_eyes, HDR, 8K, ultra-detailed, highly_aesthetic, highly_detailed_eyes, depth_of_field, realistic_body", + "base_negative": "worst_quality, bad_quality, poorly_detailed", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_mergesteinanimu_reborn.json b/data/checkpoints/illustrious_mergesteinanimu_reborn.json new file mode 100644 index 0000000..0448174 --- /dev/null +++ b/data/checkpoints/illustrious_mergesteinanimu_reborn.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/mergesteinAnimu_reborn.safetensors", + "checkpoint_name": "mergesteinAnimu_reborn.safetensors", + "base_positive": "masterpiece, best quality, excellent, high Resolution, aesthetic", + "base_negative": "worst quality, bad quality, low quality, lowres, low resolution, anatomical nonsense, artistic error, bad anatomy, interlocked fingers, bad feet, censored, watermark, bad hands, extra digit, fewer digits, bar censor, mosaic censor, conjoined", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_miaomiao3dharem_lh3dvpred10.json b/data/checkpoints/illustrious_miaomiao3dharem_lh3dvpred10.json new file mode 100644 index 0000000..1bea13e --- /dev/null +++ b/data/checkpoints/illustrious_miaomiao3dharem_lh3dvpred10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/miaomiao3DHarem_lh3dVpred10.safetensors", + "checkpoint_name": "miaomiao3DHarem_lh3dVpred10.safetensors", + "base_positive": "very aesthetic, masterpiece, best quality, ultra-detailed, pale_skin, anime coloring, anime screencap, HDR, 8K, high detail RAW color art, 3D, unreal, (photo background:1.3)", + "base_negative": "worst quality, bad quality, simple_background, low quality, jpeg artifacts, mutated hands and fingers, old, oldest, signature, bad hands", + "steps": 30, + "cfg": 4.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_miaomiaoharem_v19.json b/data/checkpoints/illustrious_miaomiaoharem_v19.json new file mode 100644 index 0000000..29d7665 --- /dev/null +++ b/data/checkpoints/illustrious_miaomiaoharem_v19.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/miaomiaoHarem_v19.safetensors", + "checkpoint_name": "miaomiaoHarem_v19.safetensors", + "base_positive": "masterpiece, best quality, absurdres, newest, very aesthetic, amazing quality, highres, sensitive, ultra detailed, best anatomy, HDR, 8K, high detail RAW color art, high contrast", + "base_negative": "(bad hands,mutated hands and fingers:1.2), lowres, (bad), bad feet, text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, signature, artistic error, username, scan, [abstract], english text, shiny hair, 3d, realistic", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_miraimix_50.json b/data/checkpoints/illustrious_miraimix_50.json new file mode 100644 index 0000000..02b624a --- /dev/null +++ b/data/checkpoints/illustrious_miraimix_50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/miraiMix_50.safetensors", + "checkpoint_name": "miraiMix_50.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres", + "base_negative": "worst_quality, bad_quality, poorly_detailed", + "steps": 40, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_mistoonanime_v10illustrious.json b/data/checkpoints/illustrious_mistoonanime_v10illustrious.json new file mode 100644 index 0000000..35cb313 --- /dev/null +++ b/data/checkpoints/illustrious_mistoonanime_v10illustrious.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/mistoonAnime_v10Illustrious.safetensors", + "checkpoint_name": "mistoonAnime_v10Illustrious.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, anime, cartoon, thick borders, vibrant colors, 2d aesthetic", + "base_negative": "low quality, worst quality, 3d, realistic, photorealistic, bad anatomy, bad hands, watermark, text", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_moefussuionillxl_iiz.json b/data/checkpoints/illustrious_moefussuionillxl_iiz.json new file mode 100644 index 0000000..1280719 --- /dev/null +++ b/data/checkpoints/illustrious_moefussuionillxl_iiz.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/moefussuionIllXL_iiz.safetensors", + "checkpoint_name": "moefussuionIllXL_iiz.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "lowres, worst quality, low quality, old, early, bad anatomy, bad hands, 4koma, comic, greyscale, censored, jpeg artifacts, blurry", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_mritualillustrious_v201.json b/data/checkpoints/illustrious_mritualillustrious_v201.json new file mode 100644 index 0000000..0142df0 --- /dev/null +++ b/data/checkpoints/illustrious_mritualillustrious_v201.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/mritualIllustrious_v201.safetensors", + "checkpoint_name": "mritualIllustrious_v201.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, low quality, watermark, trim, simple background, transparent background", + "steps": 20, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_naixlmmmmix_v50.json b/data/checkpoints/illustrious_naixlmmmmix_v50.json new file mode 100644 index 0000000..327afff --- /dev/null +++ b/data/checkpoints/illustrious_naixlmmmmix_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/naixlMmmmix_v50.safetensors", + "checkpoint_name": "naixlMmmmix_v50.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest", + "base_negative": "worst quality, low quality, logo, text, watermark, signature", + "steps": 28, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_neweranewestheticretro_newerav50naiepsilon.json b/data/checkpoints/illustrious_neweranewestheticretro_newerav50naiepsilon.json new file mode 100644 index 0000000..c805ff9 --- /dev/null +++ b/data/checkpoints/illustrious_neweranewestheticretro_newerav50naiepsilon.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/newERANewEstheticRetro_newErav50NAIEpsilon.safetensors", + "checkpoint_name": "newERANewEstheticRetro_newErav50NAIEpsilon.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, signature, watermark, username, blurry", + "steps": 28, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_nexoraspectrumof_prism.json b/data/checkpoints/illustrious_nexoraspectrumof_prism.json new file mode 100644 index 0000000..49583d7 --- /dev/null +++ b/data/checkpoints/illustrious_nexoraspectrumof_prism.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/nexoraSpectrumOf_prism.safetensors", + "checkpoint_name": "nexoraSpectrumOf_prism.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, highres, 8k resolution, soft lighting, vivid colors", + "base_negative": "monochrome, bad anatomy, bad hands, worst aesthetic, worst quality, text, signature, watermark, lowres, low quality, blurry", + "steps": 28, + "cfg": 5.0, + "sampler_name": "dpmpp_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_nova3dcgxl_illustriousv60.json b/data/checkpoints/illustrious_nova3dcgxl_illustriousv60.json new file mode 100644 index 0000000..3cc0350 --- /dev/null +++ b/data/checkpoints/illustrious_nova3dcgxl_illustriousv60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/nova3DCGXL_illustriousV60.safetensors", + "checkpoint_name": "nova3DCGXL_illustriousV60.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest, scenery, 3d, rendered, depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novaanimexl_ilv100.json b/data/checkpoints/illustrious_novaanimexl_ilv100.json new file mode 100644 index 0000000..6f7d939 --- /dev/null +++ b/data/checkpoints/illustrious_novaanimexl_ilv100.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaAnimeXL_ilV100.safetensors", + "checkpoint_name": "novaAnimeXL_ilV100.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novacartoonxl_v40.json b/data/checkpoints/illustrious_novacartoonxl_v40.json new file mode 100644 index 0000000..42d24fb --- /dev/null +++ b/data/checkpoints/illustrious_novacartoonxl_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaCartoonXL_v40.safetensors", + "checkpoint_name": "novaCartoonXL_v40.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, high resolution, ultra-detailed, absurdres, newest, cartoon, toon, depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, anime, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novacrossxl_ilvf.json b/data/checkpoints/illustrious_novacrossxl_ilvf.json new file mode 100644 index 0000000..5badb6d --- /dev/null +++ b/data/checkpoints/illustrious_novacrossxl_ilvf.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaCrossXL_ilVF.safetensors", + "checkpoint_name": "novaCrossXL_ilVF.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, high resolution, ultra-detailed, absurdres, newest, depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novafurryxl_illustriousv7b_1660983.json b/data/checkpoints/illustrious_novafurryxl_illustriousv7b_1660983.json new file mode 100644 index 0000000..4cc70aa --- /dev/null +++ b/data/checkpoints/illustrious_novafurryxl_illustriousv7b_1660983.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaFurryXL_illustriousV7b_1660983.safetensors", + "checkpoint_name": "novaFurryXL_illustriousV7b_1660983.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, high resolution, ultra-detailed, absurdres, newest, scenery, furry, anthro, depth of field, detailed fluffy fur, volumetric lighting", + "base_negative": "human, multiple tails, modern, recent, old, oldest, graphic, cartoon, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), bad anatomy, sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 28, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novamaturexl_v10.json b/data/checkpoints/illustrious_novamaturexl_v10.json new file mode 100644 index 0000000..a71b218 --- /dev/null +++ b/data/checkpoints/illustrious_novamaturexl_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaMatureXL_v10.safetensors", + "checkpoint_name": "novaMatureXL_v10.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest, scenery, mature face, sharp face, long face", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novamoexl_v10.json b/data/checkpoints/illustrious_novamoexl_v10.json new file mode 100644 index 0000000..6794ece --- /dev/null +++ b/data/checkpoints/illustrious_novamoexl_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaMoeXL_v10.safetensors", + "checkpoint_name": "novaMoeXL_v10.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest, oldest, scenery, 2000s_(style), depth of field, volumetric lighting", + "base_negative": "modern, recent, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novaorangexl_exv10.json b/data/checkpoints/illustrious_novaorangexl_exv10.json new file mode 100644 index 0000000..29a1697 --- /dev/null +++ b/data/checkpoints/illustrious_novaorangexl_exv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaOrangeXL_exV10.safetensors", + "checkpoint_name": "novaOrangeXL_exV10.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest, depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novaorangexl_rev40.json b/data/checkpoints/illustrious_novaorangexl_rev40.json new file mode 100644 index 0000000..0f34d47 --- /dev/null +++ b/data/checkpoints/illustrious_novaorangexl_rev40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaOrangeXL_reV40.safetensors", + "checkpoint_name": "novaOrangeXL_reV40.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, high resolution, ultra-detailed, absurdres, newest, scenery, depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novapixelsxl_v10.json b/data/checkpoints/illustrious_novapixelsxl_v10.json new file mode 100644 index 0000000..4934cf6 --- /dev/null +++ b/data/checkpoints/illustrious_novapixelsxl_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaPixelsXL_v10.safetensors", + "checkpoint_name": "novaPixelsXL_v10.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, 4k, very aesthetic, ultra-detailed, (pixel art, dithering, pixelated, sprite art, 8-bit:1.2), depth of field, volumetric lighting", + "base_negative": "modern, recent, old, oldest, anime, illustration, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novarealityxl_illustriousv60.json b/data/checkpoints/illustrious_novarealityxl_illustriousv60.json new file mode 100644 index 0000000..3b38135 --- /dev/null +++ b/data/checkpoints/illustrious_novarealityxl_illustriousv60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaRealityXL_illustriousV60.safetensors", + "checkpoint_name": "novaRealityXL_illustriousV60.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, high resolution, ultra-detailed, absurdres, scenery, photorealistic, depth of field, photorealistic details", + "base_negative": "modern, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, very displeasing, (worst quality, bad quality:1.2), sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_novaunrealxl_v90.json b/data/checkpoints/illustrious_novaunrealxl_v90.json new file mode 100644 index 0000000..fb0af69 --- /dev/null +++ b/data/checkpoints/illustrious_novaunrealxl_v90.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/novaUnrealXL_v90.safetensors", + "checkpoint_name": "novaUnrealXL_v90.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, high resolution, ultra-detailed, absurdres, newest, scenery, cute, depth of field, photorealistic, volumetric lighting", + "base_negative": "modern, recent, old, oldest, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured, long body, lowres, bad anatomy, bad hands, missing fingers, extra digits, fewer digits, cropped, very displeasing, worst quality, bad quality, sketch, jpeg artifacts, signature, watermark, username, simple background, conjoined, bad ai-generated", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_ntrmixillustriousxl_xiii.json b/data/checkpoints/illustrious_ntrmixillustriousxl_xiii.json new file mode 100644 index 0000000..aae8784 --- /dev/null +++ b/data/checkpoints/illustrious_ntrmixillustriousxl_xiii.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/ntrMIXIllustriousXL_xiii.safetensors", + "checkpoint_name": "ntrMIXIllustriousXL_xiii.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest", + "base_negative": "lowres, (worst quality, bad quality:1.2), bad anatomy, sketch, jpeg artifacts, signature, watermark, old, oldest, censored, bar_censor, (pregnant), chibi, loli, simple background", + "steps": 25, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_oneobsession_v20bold.json b/data/checkpoints/illustrious_oneobsession_v20bold.json new file mode 100644 index 0000000..f331fd7 --- /dev/null +++ b/data/checkpoints/illustrious_oneobsession_v20bold.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/oneObsession_v20Bold.safetensors", + "checkpoint_name": "oneObsession_v20Bold.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, anime", + "base_negative": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_oneobsessionbranch_maturemaxeps.json b/data/checkpoints/illustrious_oneobsessionbranch_maturemaxeps.json new file mode 100644 index 0000000..cfd64fa --- /dev/null +++ b/data/checkpoints/illustrious_oneobsessionbranch_maturemaxeps.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/oneObsessionBranch_matureMAXEPS.safetensors", + "checkpoint_name": "oneObsessionBranch_matureMAXEPS.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, signature", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_oneobsessionbranch_v6matureeps.json b/data/checkpoints/illustrious_oneobsessionbranch_v6matureeps.json new file mode 100644 index 0000000..439e388 --- /dev/null +++ b/data/checkpoints/illustrious_oneobsessionbranch_v6matureeps.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/oneObsessionBranch_v6MatureEPS.safetensors", + "checkpoint_name": "oneObsessionBranch_v6MatureEPS.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, signature", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_perfectdeliberate_v60.json b/data/checkpoints/illustrious_perfectdeliberate_v60.json new file mode 100644 index 0000000..4e8439c --- /dev/null +++ b/data/checkpoints/illustrious_perfectdeliberate_v60.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/perfectdeliberate_v60.safetensors", + "checkpoint_name": "perfectdeliberate_v60.safetensors", + "base_positive": "masterpiece, best quality, newest, absurdres, highres, 8K, ultra-detailed, realistic lighting", + "base_negative": "lowres, worst quality, bad quality, modern, recent, oldest, signature, username, logo, watermark, jpeg artifacts, bad hands, cropped, missing fingers, extra digits, fewer digits, error, bad anatomy, ugly, disfigured, young, long neck", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_perfectdeliberate_xl.json b/data/checkpoints/illustrious_perfectdeliberate_xl.json new file mode 100644 index 0000000..c51f42a --- /dev/null +++ b/data/checkpoints/illustrious_perfectdeliberate_xl.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/perfectdeliberate_XL.safetensors", + "checkpoint_name": "perfectdeliberate_XL.safetensors", + "base_positive": "masterpiece, best quality, newest, absurdres, highres, 8K, ultra-detailed, realistic lighting", + "base_negative": "lowres, worst quality, bad quality, modern, recent, oldest, signature, username, logo, watermark, jpeg artifacts, bad hands, cropped, missing fingers, extra digits, fewer digits, error, bad anatomy, ugly, disfigured, young, long neck", + "steps": 30, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_perfectionrealisticilxl_52.json b/data/checkpoints/illustrious_perfectionrealisticilxl_52.json new file mode 100644 index 0000000..0bfd35e --- /dev/null +++ b/data/checkpoints/illustrious_perfectionrealisticilxl_52.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/perfectionRealisticILXL_52.safetensors", + "checkpoint_name": "perfectionRealisticILXL_52.safetensors", + "base_positive": "photorealistic, realistic, 8k, masterpiece, best quality, detailed background", + "base_negative": "watermark, text, simple background, bad anatomy", + "steps": 24, + "cfg": 4.0, + "sampler_name": "dpmpp_3m_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_almond.json b/data/checkpoints/illustrious_plantmilkmodelsuite_almond.json new file mode 100644 index 0000000..6434ad9 --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_almond.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_almond.safetensors", + "checkpoint_name": "plantMilkModelSuite_almond.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, bad anatomy, worst quality, nsfw", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_coconut.json b/data/checkpoints/illustrious_plantmilkmodelsuite_coconut.json new file mode 100644 index 0000000..b4aef48 --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_coconut.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_coconut.safetensors", + "checkpoint_name": "plantMilkModelSuite_coconut.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres", + "base_negative": "nsfw, low quality, worst quality, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, signature, watermark, username, blurry", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_flax.json b/data/checkpoints/illustrious_plantmilkmodelsuite_flax.json new file mode 100644 index 0000000..a2d5bef --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_flax.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_flax.safetensors", + "checkpoint_name": "plantMilkModelSuite_flax.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "nsfw, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_hemp.json b/data/checkpoints/illustrious_plantmilkmodelsuite_hemp.json new file mode 100644 index 0000000..4416e3f --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_hemp.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_hemp.safetensors", + "checkpoint_name": "plantMilkModelSuite_hemp.safetensors", + "base_positive": "masterpiece, best quality, anime", + "base_negative": "low quality, bad anatomy, nsfw, text, watermark", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_hempii.json b/data/checkpoints/illustrious_plantmilkmodelsuite_hempii.json new file mode 100644 index 0000000..bd2a771 --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_hempii.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_hempII.safetensors", + "checkpoint_name": "plantMilkModelSuite_hempII.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, text, watermark, nsfw", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_oat.json b/data/checkpoints/illustrious_plantmilkmodelsuite_oat.json new file mode 100644 index 0000000..5791595 --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_oat.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_oat.safetensors", + "checkpoint_name": "plantMilkModelSuite_oat.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "nsfw, low quality, worst quality, bad anatomy, watermark, text", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_vanilla.json b/data/checkpoints/illustrious_plantmilkmodelsuite_vanilla.json new file mode 100644 index 0000000..0acec84 --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_vanilla.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_vanilla.safetensors", + "checkpoint_name": "plantMilkModelSuite_vanilla.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, bad anatomy, nsfw", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plantmilkmodelsuite_walnut.json b/data/checkpoints/illustrious_plantmilkmodelsuite_walnut.json new file mode 100644 index 0000000..20e220a --- /dev/null +++ b/data/checkpoints/illustrious_plantmilkmodelsuite_walnut.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plantMilkModelSuite_walnut.safetensors", + "checkpoint_name": "plantMilkModelSuite_walnut.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy, nsfw", + "steps": 28, + "cfg": 3.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_plm_passiveslazymix.json b/data/checkpoints/illustrious_plm_passiveslazymix.json new file mode 100644 index 0000000..b84de73 --- /dev/null +++ b/data/checkpoints/illustrious_plm_passiveslazymix.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/plm_passivesLazyMix.safetensors", + "checkpoint_name": "plm_passivesLazyMix.safetensors", + "base_positive": "masterpiece", + "base_negative": "worst quality, low quality, bad hands, disney, oversaturated, blurry, bad eyes", + "steps": 30, + "cfg": 4.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_pornzillahentai_v45.json b/data/checkpoints/illustrious_pornzillahentai_v45.json new file mode 100644 index 0000000..b19f3b9 --- /dev/null +++ b/data/checkpoints/illustrious_pornzillahentai_v45.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/pornzillaHentai_v45.safetensors", + "checkpoint_name": "pornzillaHentai_v45.safetensors", + "base_positive": "masterpiece, best quality, absurdres, highres, very aesthetic, high quality, detailed, insanely detailed, beautiful, very awa, anime screencap", + "base_negative": "lowres, bad quality, worst quality, bad anatomy, sketch, jpeg artifacts, ugly, poorly drawn, blurry, transparent background, tears, censored, (simple background:1.6), artist name, signature, watermark", + "steps": 20, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_pppanimixil_190.json b/data/checkpoints/illustrious_pppanimixil_190.json new file mode 100644 index 0000000..600025c --- /dev/null +++ b/data/checkpoints/illustrious_pppanimixil_190.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/pppanimixIL_190.safetensors", + "checkpoint_name": "pppanimixIL_190.safetensors", + "base_positive": "masterpiece, best quality, general", + "base_negative": "worst quality, low quality, nomal quality, bad anatomy, bad hands, 3d, chinese text, korean text", + "steps": 32, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_prefectillustriousxl_v3.json b/data/checkpoints/illustrious_prefectillustriousxl_v3.json new file mode 100644 index 0000000..fc2812d --- /dev/null +++ b/data/checkpoints/illustrious_prefectillustriousxl_v3.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/prefectIllustriousXL_v3.safetensors", + "checkpoint_name": "prefectIllustriousXL_v3.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, absurdres", + "base_negative": "bad quality, worst quality, worst detail, sketch, censored, watermark, signature, artist name, patreon username, patreon logo", + "steps": 20, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "sdxl_vae.safetensors" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_prefectillustriousxl_v70.json b/data/checkpoints/illustrious_prefectillustriousxl_v70.json new file mode 100644 index 0000000..e6b4470 --- /dev/null +++ b/data/checkpoints/illustrious_prefectillustriousxl_v70.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/prefectIllustriousXL_v70.safetensors", + "checkpoint_name": "prefectIllustriousXL_v70.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, absurdres", + "base_negative": "bad quality, worst quality, worst detail, sketch, censored, watermark, signature, artist name, patreon username, patreon logo", + "steps": 20, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_prefectiousxlnsfw_v10.json b/data/checkpoints/illustrious_prefectiousxlnsfw_v10.json new file mode 100644 index 0000000..47f3726 --- /dev/null +++ b/data/checkpoints/illustrious_prefectiousxlnsfw_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/prefectiousXLNSFW_v10.safetensors", + "checkpoint_name": "prefectiousXLNSFW_v10.safetensors", + "base_positive": "masterpiece, best quality, absurdres, amazing quality", + "base_negative": "bad quality, worst quality, worst detail, sketch, censored, watermark, signature, artist name, patreon username", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_projectil_v5vae.json b/data/checkpoints/illustrious_projectil_v5vae.json new file mode 100644 index 0000000..4942bcf --- /dev/null +++ b/data/checkpoints/illustrious_projectil_v5vae.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/projectIL_v5VAE.safetensors", + "checkpoint_name": "projectIL_v5VAE.safetensors", + "base_positive": "masterpiece, detailed_eyes, high_quality, best_quality, highres, absurdres, 8k", + "base_negative": "poorly_detailed, jpeg_artifacts, worst_quality, bad_quality", + "steps": 40, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_raehoshiillustxl_v50.json b/data/checkpoints/illustrious_raehoshiillustxl_v50.json new file mode 100644 index 0000000..2be92ee --- /dev/null +++ b/data/checkpoints/illustrious_raehoshiillustxl_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/raehoshiIllustXL_v50.safetensors", + "checkpoint_name": "raehoshiIllustXL_v50.safetensors", + "base_positive": "masterpiece, best quality, very awa", + "base_negative": "bad quality, worst quality, poorly drawn, sketch, multiple views, bad anatomy, bad hands, missing fingers, extra fingers, extra digits, fewer digits, signature, watermark, username", + "steps": 25, + "cfg": 4.0, + "sampler_name": "euler", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_rinanimeartflow_v40.json b/data/checkpoints/illustrious_rinanimeartflow_v40.json new file mode 100644 index 0000000..2e863ed --- /dev/null +++ b/data/checkpoints/illustrious_rinanimeartflow_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/rinAnimeArtflow_v40.safetensors", + "checkpoint_name": "rinAnimeArtflow_v40.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic", + "base_negative": "lowres, worst quality, bad quality, low quality, username, signature, long neck, twitter username, text, watermark, logo, signature, pale skin", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_semimergeij_ilv5vae.json b/data/checkpoints/illustrious_semimergeij_ilv5vae.json new file mode 100644 index 0000000..dbfd746 --- /dev/null +++ b/data/checkpoints/illustrious_semimergeij_ilv5vae.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/semimergeij_ilv5vae.safetensors", + "checkpoint_name": "semimergeij_ilv5vae.safetensors", + "base_positive": "high_quality, highres, beautiful, detailed, (masterpiece, best quality:1.2), absurdres, 8k, HDR", + "base_negative": "worst_quality, bad_quality, poorly_detailed", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_semirealillustrious_v10.json b/data/checkpoints/illustrious_semirealillustrious_v10.json new file mode 100644 index 0000000..56152aa --- /dev/null +++ b/data/checkpoints/illustrious_semirealillustrious_v10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/semiRealIllustrious_v10.safetensors", + "checkpoint_name": "semiRealIllustrious_v10.safetensors", + "base_positive": "masterpiece, newest, absurdres, incredibly absurdres, best quality, amazing quality, very aesthetic", + "base_negative": "lowres, bad anatomy, worst quality, low quality, normal quality, bad hands, mutated, extra fingers, artifacts, disfigured", + "steps": 30, + "cfg": 5.0, + "sampler_name": "dpmpp_2m", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_smoothmixillustrious_illustriousv5.json b/data/checkpoints/illustrious_smoothmixillustrious_illustriousv5.json new file mode 100644 index 0000000..10ca7cb --- /dev/null +++ b/data/checkpoints/illustrious_smoothmixillustrious_illustriousv5.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/smoothMixIllustrious_illustriousV5.safetensors", + "checkpoint_name": "smoothMixIllustrious_illustriousV5.safetensors", + "base_positive": "masterpiece, best quality, high quality, anime, semi-realistic", + "base_negative": "low quality, worst quality, jpeg artifacts, blurry, bad anatomy", + "steps": 30, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_softsketchillustrious_v125.json b/data/checkpoints/illustrious_softsketchillustrious_v125.json new file mode 100644 index 0000000..d4b5bbf --- /dev/null +++ b/data/checkpoints/illustrious_softsketchillustrious_v125.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/softsketchIllustrious_v125.safetensors", + "checkpoint_name": "softsketchIllustrious_v125.safetensors", + "base_positive": "flat color, masterpiece, best quality, amazing quality, very aesthetic, absurdres", + "base_negative": "bad quality, worst quality, bad anatomy, bad hands, jpeg artifacts, text, watermark, logo, artist name, censored, low quality, ugly, distorted, monochrome, poorly drawn", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_spicyanimix_v30.json b/data/checkpoints/illustrious_spicyanimix_v30.json new file mode 100644 index 0000000..70b896d --- /dev/null +++ b/data/checkpoints/illustrious_spicyanimix_v30.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/spicyanimix_v30.safetensors", + "checkpoint_name": "spicyanimix_v30.safetensors", + "base_positive": "masterpiece, high_quality, highres", + "base_negative": "low quality, bad quality", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_steincustom_v13.json b/data/checkpoints/illustrious_steincustom_v13.json new file mode 100644 index 0000000..36b70ba --- /dev/null +++ b/data/checkpoints/illustrious_steincustom_v13.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/steincustom_V13.safetensors", + "checkpoint_name": "steincustom_V13.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark, lowres", + "steps": 28, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_sweetmix_illustriousxlv14.json b/data/checkpoints/illustrious_sweetmix_illustriousxlv14.json new file mode 100644 index 0000000..f19d7a2 --- /dev/null +++ b/data/checkpoints/illustrious_sweetmix_illustriousxlv14.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/sweetMix_illustriousXLV14.safetensors", + "checkpoint_name": "sweetMix_illustriousXLV14.safetensors", + "base_positive": "score_9_up, score_8_up, masterpiece, best quality, high quality, detailed, absurdres", + "base_negative": "ugly, bad feet, bad hands, bad art, ugly artstyle, bad anatomy, bad fingers, censor, censored, deformed, noisy, blurry, low contrast, photo, realistic, watermark, username, text", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "sdxl_vae.safetensors" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_thrillustrious_v60thrillex.json b/data/checkpoints/illustrious_thrillustrious_v60thrillex.json new file mode 100644 index 0000000..765bf26 --- /dev/null +++ b/data/checkpoints/illustrious_thrillustrious_v60thrillex.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/thrillustrious_v60THRILLEX.safetensors", + "checkpoint_name": "thrillustrious_v60THRILLEX.safetensors", + "base_positive": "masterpiece, best quality, realistic", + "base_negative": "low quality, worst quality, bad anatomy, text, watermark", + "steps": 35, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_unholydesiremixsinister_v50.json b/data/checkpoints/illustrious_unholydesiremixsinister_v50.json new file mode 100644 index 0000000..7f932b2 --- /dev/null +++ b/data/checkpoints/illustrious_unholydesiremixsinister_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/unholyDesireMixSinister_v50.safetensors", + "checkpoint_name": "unholyDesireMixSinister_v50.safetensors", + "base_positive": "unholy-aesthetic, masterpiece, best quality, amazing quality, very aesthetic, absurdres, ultra detailed face, ultra detailed eyes", + "base_negative": "bad quality, worst quality, worst detail, sketch, censor", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_uniformmixillustrious_v6.json b/data/checkpoints/illustrious_uniformmixillustrious_v6.json new file mode 100644 index 0000000..59188fa --- /dev/null +++ b/data/checkpoints/illustrious_uniformmixillustrious_v6.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/uniformmixIllustrious_v6.safetensors", + "checkpoint_name": "uniformmixIllustrious_v6.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres, newest, HDR, 8K, high contrast, ultra-detailed", + "base_negative": "text, lowres, (worst quality:1.2), (bad quality:1.2), bad anatomy, jpeg artifacts, signature, watermark, old, oldest, conjoined, ai-generated, monochrome, grayscale", + "steps": 28, + "cfg": 5.0, + "sampler_name": "dpmpp_2m_sde", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_unnamedixlrealisticmodel_v3.json b/data/checkpoints/illustrious_unnamedixlrealisticmodel_v3.json new file mode 100644 index 0000000..495e78d --- /dev/null +++ b/data/checkpoints/illustrious_unnamedixlrealisticmodel_v3.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/unnamedixlRealisticModel_v3.safetensors", + "checkpoint_name": "unnamedixlRealisticModel_v3.safetensors", + "base_positive": "masterpiece, best quality, realistic, photorealistic", + "base_negative": "text, logo, watermark, bad anatomy, low quality, worst quality, signature, username, blurry", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_vixonsnsfwmilk_illustv2.json b/data/checkpoints/illustrious_vixonsnsfwmilk_illustv2.json new file mode 100644 index 0000000..a2eff97 --- /dev/null +++ b/data/checkpoints/illustrious_vixonsnsfwmilk_illustv2.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/vixonSNSFWMilk_illustV2.safetensors", + "checkpoint_name": "vixonSNSFWMilk_illustV2.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, anime style", + "base_negative": "low quality, worst quality, bad anatomy, bad composition, watermark, text", + "steps": 35, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_waicollectionmustard_waihassakuxlv10.json b/data/checkpoints/illustrious_waicollectionmustard_waihassakuxlv10.json new file mode 100644 index 0000000..b07e5c0 --- /dev/null +++ b/data/checkpoints/illustrious_waicollectionmustard_waihassakuxlv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/waiCollectionMustard_waihassakuxlV10.safetensors", + "checkpoint_name": "waiCollectionMustard_waihassakuxlV10.safetensors", + "base_positive": "masterpiece, best quality, perfect quality, absurdres, newest, very aesthetic, hyper detailed", + "base_negative": "bad quality, worst quality, worst detail, lowres, bad anatomy, watermark", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_waicollectionmustard_waioneobsessionv10.json b/data/checkpoints/illustrious_waicollectionmustard_waioneobsessionv10.json new file mode 100644 index 0000000..de1f37b --- /dev/null +++ b/data/checkpoints/illustrious_waicollectionmustard_waioneobsessionv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/waiCollectionMustard_waioneobsessionV10.safetensors", + "checkpoint_name": "waiCollectionMustard_waioneobsessionV10.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "bad quality, worst quality, worst detail", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_waicollectionmustard_waiplantmilkv10.json b/data/checkpoints/illustrious_waicollectionmustard_waiplantmilkv10.json new file mode 100644 index 0000000..e9e9c15 --- /dev/null +++ b/data/checkpoints/illustrious_waicollectionmustard_waiplantmilkv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/waiCollectionMustard_waiplantmilkV10.safetensors", + "checkpoint_name": "waiCollectionMustard_waiplantmilkV10.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "bad quality, worst quality, worst detail", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_waijfu_alpha.json b/data/checkpoints/illustrious_waijfu_alpha.json new file mode 100644 index 0000000..a089bbc --- /dev/null +++ b/data/checkpoints/illustrious_waijfu_alpha.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/waijfu_alpha.safetensors", + "checkpoint_name": "waijfu_alpha.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, bad quality", + "steps": 30, + "cfg": 7.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_wainsfwillustrious_v150.json b/data/checkpoints/illustrious_wainsfwillustrious_v150.json new file mode 100644 index 0000000..8801d94 --- /dev/null +++ b/data/checkpoints/illustrious_wainsfwillustrious_v150.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/waiNSFWIllustrious_v150.safetensors", + "checkpoint_name": "waiNSFWIllustrious_v150.safetensors", + "base_positive": "masterpiece, best quality, amazing quality", + "base_negative": "bad quality, worst quality, worst detail, sketch, censor", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_yomama25dillustrious_illustriousv20.json b/data/checkpoints/illustrious_yomama25dillustrious_illustriousv20.json new file mode 100644 index 0000000..43edb04 --- /dev/null +++ b/data/checkpoints/illustrious_yomama25dillustrious_illustriousv20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/yomama25DIllustrious_illustriousV20.safetensors", + "checkpoint_name": "yomama25DIllustrious_illustriousV20.safetensors", + "base_positive": "masterpiece, best quality, realistic", + "base_negative": "worst quality, old, early, low quality, lowres, bad hands, bad fingers, mutated hands, greyscale, text, copyright name, logo", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_zukianimeill_v50.json b/data/checkpoints/illustrious_zukianimeill_v50.json new file mode 100644 index 0000000..a45dcb4 --- /dev/null +++ b/data/checkpoints/illustrious_zukianimeill_v50.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/zukiAnimeILL_v50.safetensors", + "checkpoint_name": "zukiAnimeILL_v50.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres", + "base_negative": "lowres, bad quality, worst quality, bad anatomy, sketch, jpeg artifacts, ugly, poorly drawn, censor, blurry, watermark, simple background, transparent background", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_zukicuteill_v40.json b/data/checkpoints/illustrious_zukicuteill_v40.json new file mode 100644 index 0000000..0025bcb --- /dev/null +++ b/data/checkpoints/illustrious_zukicuteill_v40.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/zukiCuteILL_v40.safetensors", + "checkpoint_name": "zukiCuteILL_v40.safetensors", + "base_positive": "anime", + "base_negative": "text, logo", + "steps": 25, + "cfg": 5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/illustrious_zukinewcuteill_newv20.json b/data/checkpoints/illustrious_zukinewcuteill_newv20.json new file mode 100644 index 0000000..a13ea7d --- /dev/null +++ b/data/checkpoints/illustrious_zukinewcuteill_newv20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Illustrious/zukiNewCuteILL_newV20.safetensors", + "checkpoint_name": "zukiNewCuteILL_newV20.safetensors", + "base_positive": "anime", + "base_negative": "text, logo", + "steps": 25, + "cfg": 5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_2dn_animev3.json b/data/checkpoints/noob_2dn_animev3.json new file mode 100644 index 0000000..909824f --- /dev/null +++ b/data/checkpoints/noob_2dn_animev3.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/2dn_animeV3.safetensors", + "checkpoint_name": "2dn_animeV3.safetensors", + "base_positive": "masterpiece, best quality, anime, very aesthetic", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, text, watermark, green theme", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_cattowernoobaixl_chenkinnoobv10.json b/data/checkpoints/noob_cattowernoobaixl_chenkinnoobv10.json new file mode 100644 index 0000000..1d89d33 --- /dev/null +++ b/data/checkpoints/noob_cattowernoobaixl_chenkinnoobv10.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/catTowerNoobaiXL_chenkinnoobV10.safetensors", + "checkpoint_name": "catTowerNoobaiXL_chenkinnoobV10.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, bad quality, low quality, lowres, scan artifacts, jpeg artifacts, sketch, light particles", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_chenkinnoobxlckxl_v02.json b/data/checkpoints/noob_chenkinnoobxlckxl_v02.json new file mode 100644 index 0000000..94025ff --- /dev/null +++ b/data/checkpoints/noob_chenkinnoobxlckxl_v02.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/chenkinNoobXLCKXL_v02.safetensors", + "checkpoint_name": "chenkinNoobXLCKXL_v02.safetensors", + "base_positive": "high resolution, aesthetic, excellent, medium resolution, year 2025, newest", + "base_negative": "low resolution, e621, Furry, old", + "steps": 28, + "cfg": 5.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_cocoillustriousnoobai_v56.json b/data/checkpoints/noob_cocoillustriousnoobai_v56.json new file mode 100644 index 0000000..a31504e --- /dev/null +++ b/data/checkpoints/noob_cocoillustriousnoobai_v56.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/cocoIllustriousNoobai_v56.safetensors", + "checkpoint_name": "cocoIllustriousNoobai_v56.safetensors", + "base_positive": "(masterpiece, best quality), safe, amazing quality, very aesthetic, absurdres, highres, newest, HDR, 8K, high detail RAW color art", + "base_negative": "lowres, worst quality, bad quality, bad anatomy, jpeg artifacts, watermark, nostrils, nose", + "steps": 25, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_hikarinoobvpred_121.json b/data/checkpoints/noob_hikarinoobvpred_121.json new file mode 100644 index 0000000..72e3d41 --- /dev/null +++ b/data/checkpoints/noob_hikarinoobvpred_121.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/hikariNoobVPred_121.safetensors", + "checkpoint_name": "hikariNoobVPred_121.safetensors", + "base_positive": "", + "base_negative": "", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_hosekilustrousmix_illustnoobaieps11v2.json b/data/checkpoints/noob_hosekilustrousmix_illustnoobaieps11v2.json new file mode 100644 index 0000000..5f0c5e4 --- /dev/null +++ b/data/checkpoints/noob_hosekilustrousmix_illustnoobaieps11v2.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/hosekiLustrousmix_illustNoobaiEPS11V2.safetensors", + "checkpoint_name": "hosekiLustrousmix_illustNoobaiEPS11V2.safetensors", + "base_positive": "masterpiece, best quality", + "base_negative": "worst quality, low quality, bad anatomy, watermark, censored", + "steps": 24, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_jankutrainednoobairouwei_v69.json b/data/checkpoints/noob_jankutrainednoobairouwei_v69.json new file mode 100644 index 0000000..1873993 --- /dev/null +++ b/data/checkpoints/noob_jankutrainednoobairouwei_v69.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/JANKUTrainedNoobaiRouwei_v69.safetensors", + "checkpoint_name": "JANKUTrainedNoobaiRouwei_v69.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres, high quality", + "base_negative": "low quality, worst quality, bad anatomy, watermark, text, error, bad hands", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_miaomiaorealskin_vpredv11.json b/data/checkpoints/noob_miaomiaorealskin_vpredv11.json new file mode 100644 index 0000000..943fe03 --- /dev/null +++ b/data/checkpoints/noob_miaomiaorealskin_vpredv11.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/miaomiaoRealskin_vPredV11.safetensors", + "checkpoint_name": "miaomiaoRealskin_vPredV11.safetensors", + "base_positive": "nffa, nffa style, masterpiece, best quality, photorealistic", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, text, watermark", + "steps": 30, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_mistoonanime_v10noobai.json b/data/checkpoints/noob_mistoonanime_v10noobai.json new file mode 100644 index 0000000..db064c0 --- /dev/null +++ b/data/checkpoints/noob_mistoonanime_v10noobai.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/mistoonAnime_v10Noobai.safetensors", + "checkpoint_name": "mistoonAnime_v10Noobai.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, anime, colorful, cartoon, thick borders, vibrant", + "base_negative": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, 3d, realistic, photorealistic", + "steps": 28, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_oneobsession_v19atypical.json b/data/checkpoints/noob_oneobsession_v19atypical.json new file mode 100644 index 0000000..7268d2b --- /dev/null +++ b/data/checkpoints/noob_oneobsession_v19atypical.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/oneObsession_v19Atypical.safetensors", + "checkpoint_name": "oneObsession_v19Atypical.safetensors", + "base_positive": "masterpiece, best quality, anime", + "base_negative": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_smoothmixillustrious2_illustrious2noobaiv4.json b/data/checkpoints/noob_smoothmixillustrious2_illustrious2noobaiv4.json new file mode 100644 index 0000000..87ddff6 --- /dev/null +++ b/data/checkpoints/noob_smoothmixillustrious2_illustrious2noobaiv4.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/smoothMixIllustrious2_illustrious2NoobaiV4.safetensors", + "checkpoint_name": "smoothMixIllustrious2_illustrious2NoobaiV4.safetensors", + "base_positive": "SmoothNoob_Quality, masterpiece, best quality", + "base_negative": "SmoothNoob_Negative, SmoothNegative_Hands, low quality, worst quality", + "steps": 30, + "cfg": 4.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_smoothmixnoobai_noobai.json b/data/checkpoints/noob_smoothmixnoobai_noobai.json new file mode 100644 index 0000000..4194402 --- /dev/null +++ b/data/checkpoints/noob_smoothmixnoobai_noobai.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/smoothMixNoobai_noobai.safetensors", + "checkpoint_name": "smoothMixNoobai_noobai.safetensors", + "base_positive": "masterpiece, best quality, very aesthetic, absurdres", + "base_negative": "low quality, worst quality, bad anatomy, bad hands, text, watermark, signature, ugly, bad composition", + "steps": 25, + "cfg": 3.5, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_uncannyvalley_noob3dv2.json b/data/checkpoints/noob_uncannyvalley_noob3dv2.json new file mode 100644 index 0000000..f842934 --- /dev/null +++ b/data/checkpoints/noob_uncannyvalley_noob3dv2.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/uncannyValley_Noob3dV2.safetensors", + "checkpoint_name": "uncannyValley_Noob3dV2.safetensors", + "base_positive": "masterpiece, best quality, amazing quality, very aesthetic, absurdres", + "base_negative": "lowres, low quality, worst quality, bad quality, bad anatomy, sketch, jpeg artifacts, old, oldest, censored, bar censor, copyright name, dialogue, text, speech bubble, Dialogue box, error, fewer, missing, watermark, signature, extra digits, username, scan, abstract, multiple views, censored, logo, bad hands, mutated hand", + "steps": 20, + "cfg": 3.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/checkpoints/noob_waishufflenoob_vpred20.json b/data/checkpoints/noob_waishufflenoob_vpred20.json new file mode 100644 index 0000000..97b5595 --- /dev/null +++ b/data/checkpoints/noob_waishufflenoob_vpred20.json @@ -0,0 +1,10 @@ +{ + "checkpoint_path": "Noob/waiSHUFFLENOOB_vPred20.safetensors", + "checkpoint_name": "waiSHUFFLENOOB_vPred20.safetensors", + "base_positive": "masterpiece, best quality, newest, absurdres, highres, very awa", + "base_negative": "low quality, worst quality, normal quality, text, jpeg artifacts, bad anatomy, old, early, copyright name, watermark, artist name, signature", + "steps": 30, + "cfg": 6.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} \ No newline at end of file diff --git a/data/prompts/action_system.txt b/data/prompts/action_system.txt new file mode 100644 index 0000000..4add3cf --- /dev/null +++ b/data/prompts/action_system.txt @@ -0,0 +1,35 @@ +You are a JSON generator for action/pose profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'sitting_on_ground', 'arms_behind_back') for the values. +- Keep values concise. + +Structure: +{ + "action_id": "WILL_BE_REPLACED", + "action_name": "WILL_BE_REPLACED", + "action": { + "full_body": "string (pose description)", + "head": "string (expression/head position)", + "eyes": "string", + "arms": "string", + "hands": "string", + "torso": "string", + "pelvis": "string", + "legs": "string", + "feet": "string", + "additional": "string" + }, + "lora": { + "lora_name": "WILL_BE_REPLACED", + "lora_weight": 1.0, + "lora_triggers": "WILL_BE_REPLACED" + }, + "tags": ["string", "string"] +} +Use the provided LoRA filename and HTML context as clues to what the action/pose represents. +IMPORTANT: Look for suggested LoRA strength/weight (e.g. 'Strength of 0.7'), trigger words (e.g. 'Trigger: xyz'), and recommended/optional prompt tags in the HTML text. Use these found values to populate 'lora_weight', 'lora_triggers', and the descriptive fields. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/prompts/character_system.txt b/data/prompts/character_system.txt new file mode 100644 index 0000000..606909f --- /dev/null +++ b/data/prompts/character_system.txt @@ -0,0 +1,57 @@ +You are a JSON generator for character profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'long_hair', 'blue_eyes') for the values. +- Keep values concise. +- Use empty strings "" for fields that are not applicable or unknown - never use words like "none" or "n/a". +- Leave defaults fields empty. + +Structure: +{ + "character_id": "WILL_BE_REPLACED", + "character_name": "WILL_BE_REPLACED", + "identity": { + "base_specs": "string (e.g. 1girl, build, skin)", + "hair": "string", + "eyes": "string", + "hands": "string", + "arms": "string", + "torso": "string", + "pelvis": "string", + "legs": "string", + "feet": "string", + "extra": "string" + }, + "defaults": { + "expression": "", + "pose": "", + "scene": "" + }, + "wardrobe": { + "full_body": "string (e.g. bodysuit, dress, full outfit description)", + "headwear": "string", + "top": "string", + "bottom": "string", + "legwear": "string", + "footwear": "string", + "hands": "string", + "accessories": "string" + }, + "styles": { + "aesthetic": "string", + "primary_color": "string", + "secondary_color": "string", + "tertiary_color": "string" + }, + "lora": { + "lora_name": "", + "lora_weight": 1.0, + "lora_triggers": "" + }, + "tags": ["string", "string"] +} +Fill the fields based on the user's description. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/prompts/checkpoint_system.txt b/data/prompts/checkpoint_system.txt new file mode 100644 index 0000000..86fd579 --- /dev/null +++ b/data/prompts/checkpoint_system.txt @@ -0,0 +1,24 @@ +You are a JSON generator for AI image generation model (checkpoint) profiles. Output ONLY valid JSON matching the exact structure below. Do not wrap in markdown code blocks. + +Structure: +{ + "checkpoint_path": "WILL_BE_REPLACED", + "checkpoint_name": "WILL_BE_REPLACED", + "base_positive": "string (base positive prompt tags for this checkpoint, e.g. 'anime, masterpiece, best quality')", + "base_negative": "string (base negative prompt tags, e.g. 'text, logo, watermark, bad anatomy')", + "steps": 25, + "cfg": 5.0, + "sampler_name": "euler_ancestral", + "vae": "integrated" +} + +Field guidance: +- "base_positive": Comma-separated tags that improve output quality for this specific model. Look for recommended positive prompt tags in the HTML. +- "base_negative": Comma-separated tags to suppress unwanted artifacts. Look for recommended negative prompt tags in the HTML. +- "steps": Integer. Default 25. Use the recommended steps from the HTML if present (commonly 20-30 for SDXL models). +- "cfg": Float. Default 5.0. Use the recommended CFG/guidance scale from the HTML if present (commonly 3.5-7.0 for SDXL models). +- "sampler_name": String matching a ComfyUI sampler name. Common values: "euler_ancestral", "euler", "dpmpp_2m", "dpmpp_sde". Use the HTML recommendation if present, otherwise default to "euler_ancestral". +- "vae": Either "integrated" if the checkpoint includes its own VAE (most modern SDXL checkpoints do), or "sdxl_vae.safetensors" if an external VAE is recommended. Default to "integrated" unless the HTML specifically recommends an external VAE. + +If no HTML context is provided or the HTML does not contain relevant information for a field, use the default values above. +IMPORTANT: "checkpoint_path" and "checkpoint_name" will always be replaced by the system — set them to empty strings in your output. diff --git a/data/prompts/detailer_system.txt b/data/prompts/detailer_system.txt new file mode 100644 index 0000000..5b2b25b --- /dev/null +++ b/data/prompts/detailer_system.txt @@ -0,0 +1,22 @@ +You are a JSON generator for detailer/refinement profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'highly_detailed', 'intricate_details') for the values. + +Structure: +{ + "detailer_id": "WILL_BE_REPLACED", + "detailer_name": "WILL_BE_REPLACED", + "prompt": "string (Danbooru-style tags for the effect)", + "lora": { + "lora_name": "WILL_BE_REPLACED", + "lora_weight": 1.0, + "lora_triggers": "WILL_BE_REPLACED" + } +} +Use the provided LoRA filename and HTML context as clues to what refinement it provides. +IMPORTANT: Look for suggested LoRA strength/weight (e.g. 'Strength of 0.7'), trigger words (e.g. 'Trigger: xyz'), and recommended/optional prompt tags in the HTML text. Use these found values to populate 'lora_weight' and 'lora_triggers', and the descriptive fields. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/prompts/outfit_system.txt b/data/prompts/outfit_system.txt new file mode 100644 index 0000000..5ae0323 --- /dev/null +++ b/data/prompts/outfit_system.txt @@ -0,0 +1,34 @@ +You are a JSON generator for outfit profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'frilled_skirt', 'lace_stockings') for the values. +- Keep values concise. +- Use empty strings "" for fields that are not applicable or unknown - never use words like "none" or "n/a". +- Leave lora fields empty - they can be configured later. + +Structure: +{ + "outfit_id": "WILL_BE_REPLACED", + "outfit_name": "WILL_BE_REPLACED", + "wardrobe": { + "full_body": "string (e.g. bodysuit, dress, full outfit description)", + "headwear": "string (e.g. hairband, cap)", + "top": "string (e.g. blouse, corset, jacket)", + "bottom": "string (e.g. skirt, pants, shorts)", + "legwear": "string (e.g. stockings, tights, socks)", + "footwear": "string (e.g. heels, boots, sneakers)", + "hands": "string (e.g. gloves, sleeves)", + "accessories": "string (e.g. necklace, belt, apron)" + }, + "lora": { + "lora_name": "", + "lora_weight": 0.8, + "lora_triggers": "" + }, + "tags": ["string", "string"] +} +Fill the fields based on the user's description. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/prompts/scene_system.txt b/data/prompts/scene_system.txt new file mode 100644 index 0000000..5972cd2 --- /dev/null +++ b/data/prompts/scene_system.txt @@ -0,0 +1,31 @@ +You are a JSON generator for scene profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'japanese_garden', 'cherry_blossoms') for the values. + +Structure: +{ + "scene_id": "WILL_BE_REPLACED", + "scene_name": "WILL_BE_REPLACED", + "description": "string (brief description of the scene)", + "scene": { + "background": "string (Danbooru-style tags)", + "foreground": "string (Danbooru-style tags)", + "furniture": ["string", "string"], + "colors": ["string", "string"], + "lighting": "string", + "theme": "string" + }, + "lora": { + "lora_name": "WILL_BE_REPLACED", + "lora_weight": 1.0, + "lora_triggers": "WILL_BE_REPLACED" + }, + "tags": ["string", "string"] +} +Use the provided LoRA filename and HTML context as clues to what the scene represents. +IMPORTANT: Look for suggested LoRA strength/weight (e.g. 'Strength of 0.7'), trigger words (e.g. 'Trigger: xyz'), and recommended/optional prompt tags in the HTML text. Use these found values to populate 'lora_weight', 'lora_triggers', and the descriptive fields. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/prompts/style_system.txt b/data/prompts/style_system.txt new file mode 100644 index 0000000..5939ce4 --- /dev/null +++ b/data/prompts/style_system.txt @@ -0,0 +1,25 @@ +You are a JSON generator for art style/artist profiles. Output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks. + +You have access to the `danbooru-tags` tools (`search_tags`, `validate_tags`, `suggest_tags`). +Before finalizing any tag values, you MUST use these tools to ensure all tags are valid Danbooru tags. +- Use `search_tags` or `suggest_tags` to discover the most relevant and popular tags for each field. +- Use `validate_tags` to check your final selection. +- Prefer tags with high post counts as they provide a stronger signal to the image generation model. +- Use Danbooru-style tags (underscores instead of spaces, e.g., 'oil_painting', 'cel_shaded') for the values. + +Structure: +{ + "style_id": "WILL_BE_REPLACED", + "style_name": "WILL_BE_REPLACED", + "style": { + "artist_name": "string (name of the artist if applicable)", + "artistic_style": "string (description of the art style, e.g. 'oil painting', 'cel shaded')" + }, + "lora": { + "lora_name": "WILL_BE_REPLACED", + "lora_weight": 1.0, + "lora_triggers": "WILL_BE_REPLACED" + } +} +Use the provided LoRA filename and HTML context as clues to what artist or style it represents. +IMPORTANT: Look for suggested LoRA strength/weight (e.g. 'Strength of 0.7'), trigger words (e.g. 'Trigger: xyz'), and recommended/optional prompt tags in the HTML text. Use these found values to populate 'lora_weight' and 'lora_triggers'. Use the tools to ensure the quality and validity of the tags. \ No newline at end of file diff --git a/data/scenes/arcade___illustrious.json b/data/scenes/arcade___illustrious.json index effa1d2..7681d70 100644 --- a/data/scenes/arcade___illustrious.json +++ b/data/scenes/arcade___illustrious.json @@ -1,34 +1,37 @@ { "scene_id": "arcade___illustrious", "scene_name": "Arcade Illustrious", - "description": "A vibrant, bustling interior of a Japanese-style game center illuminated by the glow of retro arcade cabinets and neon signs.", + "description": "A vibrant, dimly lit arcade filled with rows of classic game cabinets and neon lights.", "scene": { - "background": "arcade, indoors, game center, crowded, scenery, posters, ceiling lights, patterned carpet, rows of machines", - "foreground": "arcade cabinet, claw machine, joystick, buttons, screen, neon signage, glowing", + "background": "indoors, checkered_floor, neon_lights, dark_background, poster", + "foreground": "arcade_cabinet, joystick, monitor, stool", "furniture": [ - "arcade machine", - "crane game", + "arcade_cabinet", "stool", - "change machine" + "game_machine" ], "colors": [ - "neon purple", - "cyan", - "magenta", - "dark blue" + "purple", + "neon_blue", + "red", + "dark" ], - "lighting": "dimly lit, cinematic lighting, neon glow, screen light, bloom", - "theme": "gaming, retro, cyberpunk, nightlife" + "lighting": "dimly_lit, ceiling_light, bloom, neon_lights", + "theme": "retro_gaming, cyberpunk, 80s" }, "lora": { "lora_name": "Illustrious/Backgrounds/Arcade_-_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Arcade_-_Illustrious" + "lora_weight": 0.7, + "lora_triggers": "4rc4d3" }, "tags": [ - "video games", - "amusement", - "electronic", - "nostalgia" + "indoors", + "arcade_cabinet", + "joystick", + "monitor", + "checkered_floor", + "ceiling_light", + "neon_lights", + "retro_artstyle" ] } \ No newline at end of file diff --git a/data/scenes/arcadev2.json b/data/scenes/arcadev2.json index a7bcb1e..fc6965c 100644 --- a/data/scenes/arcadev2.json +++ b/data/scenes/arcadev2.json @@ -1,38 +1,36 @@ { "scene_id": "arcadev2", "scene_name": "Arcadev2", - "description": "A vibrant, dimly lit retro arcade filled with rows of classic game cabinets and neon signs.", + "description": "A vibrant, retro-styled video arcade interior filled with rows of gaming cabinets, illuminated by neon glows and ceiling lights over a classic checkered floor.", "scene": { - "background": "indoors, arcade, row of arcade machines, arcade cabinet, neon sign, patterned carpet, posters, crowd background", - "foreground": "arcade machine, joystick, buttons, coin slot, reflection, glowing screen", + "background": "indoors", + "foreground": "arcade_cabinet", "furniture": [ - "arcade cabinet", - "stool", - "pinball machine", - "crane game" + "arcade_cabinet", + "stool" ], "colors": [ - "neon purple", - "neon blue", - "cyan", - "magenta", - "black" + "neon_lights", + "colorful" ], - "lighting": "dimly lit, neon glow, backlighting, screen glow, cinematic lighting", - "theme": "retro, synthwave, 1980s, gaming, cyberpunk" + "lighting": "ceiling_light", + "theme": "arcade" }, "lora": { "lora_name": "Illustrious/Backgrounds/ArcadeV2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "ArcadeV2" + "lora_weight": 0.7, + "lora_triggers": "4rc4d3" }, "tags": [ "arcade", - "scenery", - "retro gaming", "indoors", - "neon lights", - "video games", - "atmosphere" + "arcade_cabinet", + "joystick", + "monitor", + "checkered_floor", + "ceiling_light", + "neon_lights", + "stool", + "dim_lighting" ] } \ No newline at end of file diff --git a/data/scenes/backstage.json b/data/scenes/backstage.json index 8555a72..f205075 100644 --- a/data/scenes/backstage.json +++ b/data/scenes/backstage.json @@ -1,35 +1,36 @@ { "scene_id": "backstage", "scene_name": "Backstage", - "description": "A cluttered and atmospheric backstage dressing room area behind the scenes of a performance venue.", + "description": "A behind-the-scenes perspective of a concert or theater stage, characterized by heavy velvet curtains, industrial scaffolding, and stage equipment waiting in the wings.", "scene": { - "background": "indoors, backstage, brick wall, electrical wires, flight cases, musical equipment, posters on wall", - "foreground": "vanity mirror, light bulbs, makeup tools, scattered clothes, clothing rack, hanging clothes", + "background": "backstage, stage_curtains, scaffolding, indoors, crowd", + "foreground": "microphone_stand, amplifier, cable, instrument", "furniture": [ - "vanity table", - "folding chair", - "clothing rack", - "sofa" + "scaffolding", + "microphone_stand", + "amplifier" ], "colors": [ - "tungsten yellow", - "dark grey", "black", - "wood brown" + "red", + "grey" ], - "lighting": "dim lighting, warm lighting, artificial light, cinematic lighting, dramatic shadows", - "theme": "behind the scenes, concerts, theater, preparation" + "lighting": "stage_lights, spotlight, artificial_lighting, dimly_lit", + "theme": "music_concert, performance, idol, theater" }, "lora": { "lora_name": "Illustrious/Backgrounds/Backstage.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Backstage" + "lora_weight": 0.8, + "lora_triggers": "b4ckst4g3" }, "tags": [ "backstage", - "dressing room", - "green room", - "behind the scenes", - "concert venue" + "curtains", + "scaffolding", + "indoors", + "stage_curtains", + "stage_lights", + "crowd", + "microphone_stand" ] } \ No newline at end of file diff --git a/data/scenes/barbie_b3dr00m_i.json b/data/scenes/barbie_b3dr00m_i.json index 3d34619..a6d706b 100644 --- a/data/scenes/barbie_b3dr00m_i.json +++ b/data/scenes/barbie_b3dr00m_i.json @@ -1,39 +1,49 @@ { "scene_id": "barbie_b3dr00m_i", "scene_name": "Barbie B3Dr00M I", - "description": "A vibrant and glamorous bedroom inspired by a Barbie dream house, featuring extensive pink decor, plastic-like textures, and cute, girly aesthetics typical of a dollhouse interior.", + "description": "A vibrant, pink-themed Barbie bedroom filled with glamorous decor and accessories.", "scene": { - "background": "indoors, bedroom, pink wallpaper, heart pattern, window, lace curtains, chandelier, ornate walls", - "foreground": "bed, pink bedding, fluffy pillows, stuffed toys, perfume bottles, vanity mirror", + "background": "indoors, bedroom, pink_theme, neon_lights, curtains, wall, shelf", + "foreground": "bed, pillow, handbag, high_heels, tiara, sequins, gem, ribbon", "furniture": [ - "canopy bed", - "vanity table", - "heart-shaped chair", - "wardrobe", - "nightstand" + "bed", + "chandelier", + "mirror", + "shelf", + "curtains" ], "colors": [ "pink", - "magenta", - "white", "fuchsia", - "pastel pink" + "purple" ], - "lighting": "bright, soft box, sparkling, dreamy, sunlight", - "theme": "barbiecore, dollhouse, girly, plastic, cute" + "lighting": "neon_lights, sparkle", + "theme": "barbie_(franchise), glitter, frills, kitsch" }, "lora": { "lora_name": "Illustrious/Backgrounds/Barbie_b3dr00m-i.safetensors", "lora_weight": 1.0, - "lora_triggers": "Barbie_b3dr00m-i" + "lora_triggers": "barbie bedroom" }, "tags": [ - "interior", + "barbie_(franchise)", "bedroom", - "barbie", - "pink", - "dollhouse", - "cozy", - "room" + "indoors", + "pink_theme", + "fuchsia", + "neon_lights", + "sparkle", + "sequins", + "gem", + "mirror", + "chandelier", + "frills", + "curtains", + "bed", + "pillow", + "handbag", + "high_heels", + "tiara", + "ribbon" ] } \ No newline at end of file diff --git a/data/scenes/bedroom_0f_4_succubus_i.json b/data/scenes/bedroom_0f_4_succubus_i.json index b0e9e5b..e7172c2 100644 --- a/data/scenes/bedroom_0f_4_succubus_i.json +++ b/data/scenes/bedroom_0f_4_succubus_i.json @@ -1,35 +1,43 @@ { "scene_id": "bedroom_0f_4_succubus_i", "scene_name": "Bedroom 0F 4 Succubus I", - "description": "A lavish and moody gothic bedroom designed for a succubus, featuring dark romantic aesthetics, mystical colors, and ornate furniture.", + "description": "A dark and seductive bedroom designed for a succubus, featuring a grand canopy bed with red velvet, black stone walls, glowing runes, and gothic decor.", "scene": { - "background": "indoors, bedroom, gothic architecture, stone walls, stained glass window, night", - "foreground": "ornate canopy bed, silk sheets, heart motif, scattered rose petals, magical aura", + "background": "indoors, stone_wall, black_wall, runes, glowing, smoke, incense", + "foreground": "chain, skull", "furniture": [ - "canopy bed", - "antique vanity", - "candelabra", - "heavy velvet curtains" + "canopy_bed", + "curtains", + "mirror", + "candle" ], "colors": [ - "crimson", - "black", - "deep purple", - "gold" + "black_theme", + "red_theme" ], - "lighting": "dim lighting, candlelight, purple ambient glow, volumetric lighting", - "theme": "dark fantasy" + "lighting": "dim_lighting, candlelight", + "theme": "gothic_architecture, fantasy" }, "lora": { "lora_name": "Illustrious/Backgrounds/bedroom_0f_4_succubus-i.safetensors", "lora_weight": 1.0, - "lora_triggers": "bedroom_0f_4_succubus-i" + "lora_triggers": "bedroom 0f 4 succubus" }, "tags": [ - "interior", - "gothic", - "fantasy", - "luxurious", - "succubus theme" + "indoors", + "scenery", + "no_humans", + "bedroom", + "gothic_architecture", + "stone_wall", + "canopy_bed", + "runes", + "candlelight", + "red_theme", + "black_theme", + "dim_lighting", + "chain", + "skull", + "incense" ] } \ No newline at end of file diff --git a/data/scenes/before_the_chalkboard_il.json b/data/scenes/before_the_chalkboard_il.json index 9092fff..bd74841 100644 --- a/data/scenes/before_the_chalkboard_il.json +++ b/data/scenes/before_the_chalkboard_il.json @@ -1,34 +1,40 @@ { "scene_id": "before_the_chalkboard_il", "scene_name": "Before The Chalkboard Il", - "description": "A character standing confidently in a classroom setting with a chalkboard full of equations and notes in the background.", + "description": "A classroom scene where a character stands near the teacher's desk (lectern) in front of the chalkboard, typically used for self-introductions or announcements.", "scene": { - "background": "indoors, classroom, school, chalkboard, greenboard, math, formula, writing on board, window, daylight, dust motes", - "foreground": "solo, standing, looking at viewer, holding chalk, pointing, school uniform, upper body", + "background": "classroom, chalkboard, indoors, clock", + "foreground": "standing, desk, lectern, chalk", "furniture": [ + "desk", + "lectern", + "school_desk", "chalkboard", - "teacher's desk", - "podium" + "clock" ], "colors": [ - "dark green", - "chalk white", - "wood brown", - "creamy beige" + "green", + "brown", + "white" ], - "lighting": "natural light, sunbeams, soft indoor lighting, cinematic lighting", - "theme": "education, school life, presentation" + "lighting": "indoors", + "theme": "school, introduction" }, "lora": { "lora_name": "Illustrious/Backgrounds/Before_the_Chalkboard_IL.safetensors", "lora_weight": 1.0, - "lora_triggers": "Before_the_Chalkboard_IL" + "lora_triggers": "standing beside desk, chalkboard, indoors" }, "tags": [ "classroom", "chalkboard", - "school", - "teaching", - "presentation" + "desk", + "lectern", + "school_desk", + "chalk", + "clock", + "indoors", + "standing", + "school_uniform" ] } \ No newline at end of file diff --git a/data/scenes/canopy_bed.json b/data/scenes/canopy_bed.json index e1ec534..23a0162 100644 --- a/data/scenes/canopy_bed.json +++ b/data/scenes/canopy_bed.json @@ -1,34 +1,35 @@ { "scene_id": "canopy_bed", "scene_name": "Canopy Bed", - "description": "An ornate and elegant bedroom featuring a grand four-poster canopy bed with flowing sheer drapes, bathed in soft window light.", + "description": "A luxurious bedroom interior centered around a classic canopy bed with heavy draping curtains and soft bedding.", "scene": { - "background": "indoors, bedroom, master_bedroom, ornate_wallpaper, large_window, patterned_carpet, victorian_decor", - "foreground": "canopy_bed, four-poster_bed, bed_curtains, white_bed_sheet, plush_pillows, duvet, no_humans", + "background": "indoors, bedroom, curtains, window, wall", + "foreground": "canopy_bed, bed_sheet, pillow, white_bed_sheet", "furniture": [ - "bedside_table", - "antique_lamp", - "vanity_desk", - "tufted_bench" + "canopy_bed", + "bed" ], "colors": [ - "cream", - "gold", "white", - "pale_blue" + "blue" ], - "lighting": "soft_lighting, natural_light, volumetric_lighting, sunbeams", - "theme": "aristocratic, cozy, vintage, romance" + "lighting": "soft_lighting", + "theme": "bedroom" }, "lora": { "lora_name": "Illustrious/Backgrounds/Canopy_Bed.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Canopy_Bed" + "lora_weight": 0.8, + "lora_triggers": "c4nopy" }, "tags": [ - "interior_design", - "furniture", - "scenery", - "classic" + "indoors", + "bedroom", + "canopy_bed", + "curtains", + "pillow", + "bed_sheet", + "white_bed_sheet", + "soft_lighting", + "no_humans" ] } \ No newline at end of file diff --git a/data/scenes/cozy_bedroom___illustrious.json b/data/scenes/cozy_bedroom___illustrious.json index 87444ef..53d71c4 100644 --- a/data/scenes/cozy_bedroom___illustrious.json +++ b/data/scenes/cozy_bedroom___illustrious.json @@ -1,35 +1,37 @@ { "scene_id": "cozy_bedroom___illustrious", "scene_name": "Cozy Bedroom Illustrious", - "description": "A warm and inviting bedroom filled with soft light, plush textures, and a relaxing atmosphere.", + "description": "A detailed, modern, and lived-in cozy bedroom environment with scattered items and warm atmosphere.", "scene": { - "background": "indoors, bedroom, window, white curtains, sunlight, wood floor, bookshelf, potted plant, cluttered", - "foreground": "bed, messy bed, white bed sheet, duvet, pile of pillows, plush toy, blanket", + "background": "indoors, bedroom, house, scenery, window, curtains, wooden_floor, messy_room", + "foreground": "potted_plant, desk, chair, computer", "furniture": [ - "double bed", - "nightstand", - "rug", - "desk" + "bed", + "desk", + "bookshelf", + "chair", + "lamp", + "pillow", + "blanket" ], "colors": [ - "beige", - "warm brown", - "cream", - "pastel yellow" + "brown_theme", + "orange_theme" ], - "lighting": "warm lighting, natural light, soft illumination, afternoon sun", - "theme": "cozy, comfort, slice of life, relaxation" + "lighting": "sunlight, sunbeam, light_rays, dim_lighting", + "theme": "anime_coloring" }, "lora": { "lora_name": "Illustrious/Backgrounds/Cozy_bedroom_-_Illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Cozy_bedroom_-_Illustrious" + "lora_weight": 0.8, + "lora_triggers": "cozybedroom" }, "tags": [ - "scenery", - "no humans", + "modern", + "cozy", "interior", - "highly detailed", - "aesthetic" + "morning", + "bright", + "dutch_angle" ] } \ No newline at end of file diff --git a/data/scenes/forestill.json b/data/scenes/forestill.json index 4f1899c..85dfde3 100644 --- a/data/scenes/forestill.json +++ b/data/scenes/forestill.json @@ -1,35 +1,36 @@ { "scene_id": "forestill", "scene_name": "Forestill", - "description": "A lush, enchanted forest floor illuminated by shafts of sunlight filtering through ancient trees, rendered in a detailed illustrative style.", + "description": "A dense, atmospheric forest scene featuring mossy rocks, trees, and a river, potentially providing a dark or dappled sunlight backdrop.", "scene": { - "background": "forest, tree, nature, outdoors, scenery, woodland, trunk, leaf, ancient tree, dense foliage, moss", - "foreground": "grass, flower, path, roots, fern, plant, mushroom", - "furniture": [ - "fallen log", - "stump" - ], + "background": "forest, tree, dark_background, nature, outdoors, scenery", + "foreground": "grass, moss, rock, river, stream, snow", + "furniture": [], "colors": [ - "emerald green", - "earth brown", - "golden yellow", - "soft teal" + "green", + "brown", + "dark_green" ], - "lighting": "sunlight, sunbeam, dappled sunlight, god rays, atmospheric lighting", - "theme": "nature, fantasy, ethereal, mysterious, tranquil" + "lighting": "dappled_sunlight, shadow", + "theme": "nature" }, "lora": { "lora_name": "Illustrious/Backgrounds/ForestILL.safetensors", - "lora_weight": 1.0, - "lora_triggers": "ForestILL" + "lora_weight": 0.75, + "lora_triggers": "forest, tree, dark_background" }, "tags": [ "forest", - "illustration", + "tree", + "grass", + "moss", + "rock", + "river", + "dappled_sunlight", + "dark_background", + "snow", "scenery", - "fantasy", - "nature", - "detailed", - "vegetation" + "outdoors", + "nature" ] } \ No newline at end of file diff --git a/data/scenes/girl_b3dr00m_i.json b/data/scenes/girl_b3dr00m_i.json index 5589343..d517a2d 100644 --- a/data/scenes/girl_b3dr00m_i.json +++ b/data/scenes/girl_b3dr00m_i.json @@ -1,41 +1,39 @@ { "scene_id": "girl_b3dr00m_i", "scene_name": "Girl B3Dr00M I", - "description": "A cozy, lived-in girl's bedroom filled with soft textures, personal items, and pastel decor.", + "description": "A beautifully designed modern bedroom with a warm and inviting atmosphere, featuring soft pastel tones, fairy lights, and a cozy bed.", "scene": { - "background": "indoors, bedroom, window, curtains, bookshelf, posters, wallpaper, ", - "foreground": "bed, pillows, stuffed toy, blanket, sheets, cushions", + "background": "indoors, bedroom, window, curtains, bookshelf, string_lights", + "foreground": "bed, pillow, blanket, potted_plant, bedside_table, cat", "furniture": [ "bed", - "desk", - "chair", - "nightstand", - "rug", - "shelves" + "bookshelf", + "bedside_table" ], "colors": [ - "pastel pink", + "pastel_colors", "white", - "cream", - "light blue", - "lavender" + "brown" ], - "lighting": "soft natural light, sunlight, bright, ambient occlusion", - "theme": "cozy, cute, kawaii,interior" + "lighting": "sunlight, warm_light, volumetric_lighting", + "theme": "cozy, modern, scenery" }, "lora": { "lora_name": "Illustrious/Backgrounds/Girl_b3dr00m-i.safetensors", - "lora_weight": 0.7, - "lora_triggers": "Girl_b3dr00m-i" + "lora_weight": 1.0, + "lora_triggers": "Girl b3dr00m" }, "tags": [ "indoors", "bedroom", - "scenery", - "no humans", "room", + "scenery", + "no_humans", + "bed", "furniture", - "messy", - "pastel colors" + "window", + "curtains", + "string_lights", + "pastel_colors" ] } \ No newline at end of file diff --git a/data/scenes/glass_block_wall_il_2_d16.json b/data/scenes/glass_block_wall_il_2_d16.json index b30fefe..b43d05d 100644 --- a/data/scenes/glass_block_wall_il_2_d16.json +++ b/data/scenes/glass_block_wall_il_2_d16.json @@ -1,36 +1,30 @@ { "scene_id": "glass_block_wall_il_2_d16", "scene_name": "Glass Block Wall Il 2 D16", - "description": "A bright, retro-modern interior space featuring a textured glass block wall that distorts sunlight into soft, geometric patterns across the tiled floor.", + "description": "A modern indoor space featuring a distinctive glass block wall (Luxfery) that diffuses light, creating a soft, translucent geometric backdrop often paired with simple flooring.", "scene": { - "background": "glass_block_wall, indoors, architecture, white_wall, window, tiled_floor, blurred_background", - "foreground": "potted_plant, sunlight, heavy_shadows, no_humans, reflection", - "furniture": [ - "sleek_sofa", - "metal_coffee_table", - "potted_fern" - ], + "background": "glass_wall, wall, indoors, blurry_background, simple_background", + "foreground": "wooden_floor", + "furniture": [], "colors": [ - "white", - "cyan", - "light_gray", - "green" + "green_theme", + "grey_theme", + "white_theme" ], - "lighting": "natural_light, caustics, volumetric_lighting, subsurface_scattering, day", - "theme": "interior_design, 1980s_style, aesthetic, minimalism" + "lighting": "backlighting", + "theme": "simple_background" }, "lora": { "lora_name": "Illustrious/Backgrounds/glass_block_wall_il_2_d16.safetensors", "lora_weight": 1.0, - "lora_triggers": "glass_block_wall_il_2_d16" + "lora_triggers": "glass block wall" }, "tags": [ - "glass_block_wall", - "scenery", - "interior", - "translucent", - "retro", - "distortion", - "architectural" + "glass_wall", + "indoors", + "backlighting", + "wooden_floor", + "blurry_background", + "wall" ] } \ No newline at end of file diff --git a/data/scenes/homeless_ossan_v2.json b/data/scenes/homeless_ossan_v2.json index cf1c992..5b257e3 100644 --- a/data/scenes/homeless_ossan_v2.json +++ b/data/scenes/homeless_ossan_v2.json @@ -1,39 +1,32 @@ { "scene_id": "homeless_ossan_v2", "scene_name": "Homeless Ossan V2", - "description": "A gritty and melancholic urban scene featuring a disheveled middle-aged man sitting in a dimly lit alleyway surrounded by the remnants of daily life.", + "description": "A cramped and chaotic makeshift living space, characterized by urban decay and accumulation of refuse. The area is enclosed by blue tarpaulins and battered partitions, filled with scattered trash, cardboard boxes, and worn-out bedding like tatami mats and futons, illuminated by dim, dappled sunlight filtering through gaps.", "scene": { - "background": "outdoors, alley, night, brick wall, graffiti, trash, garbage, asphalt, damp, scenery, depth of field", - "foreground": "1male, solo, ossan, middle-aged man, beard, stubble, wrinkled skin, dirty face, messy hair, tired eyes, worn clothes, torn jacket, beanie, sitting on ground, crouching, gloom, realistic", + "background": "ruins, messy_room, tarpaulin, wall, partition", + "foreground": "trash, litter, cardboard_box, plastic_bag, crumpled_paper, mold", "furniture": [ - "cardboard box", - "blue tarp", - "milk crate", - "empty can" + "tatami", + "futon", + "pillow" ], "colors": [ - "grey", + "blue", "brown", - "black", - "mustard yellow", - "desaturated" + "grey" ], - "lighting": "dim lighting, cinematic lighting, street light, harsh shadows, low key, volumetric lighting", - "theme": "poverty, homelessness, urban decay, depression, survival, realistic" + "lighting": "dim_lighting, dappled_sunlight, light_particles", + "theme": "poverty, dirty, urban_decay, deterioration" }, "lora": { "lora_name": "Illustrious/Backgrounds/homeless_ossan_V2.safetensors", - "lora_weight": 1.0, - "lora_triggers": "homeless_ossan_V2" + "lora_weight": 0.8, + "lora_triggers": "homeless_ossan" }, "tags": [ - "homeless", - "ossan", - "poverty", - "urban", - "gritty", - "middle-aged", - "realistic", - "depressed" + "dutch_angle", + "fisheye", + "scenery", + "no_humans" ] } \ No newline at end of file diff --git a/data/scenes/il_medieval_brothel_bedroom_r1.json b/data/scenes/il_medieval_brothel_bedroom_r1.json index 7b0fc2f..05eff7f 100644 --- a/data/scenes/il_medieval_brothel_bedroom_r1.json +++ b/data/scenes/il_medieval_brothel_bedroom_r1.json @@ -1,40 +1,42 @@ { "scene_id": "il_medieval_brothel_bedroom_r1", "scene_name": "Il Medieval Brothel Bedroom R1", - "description": "A dimly lit, intimate medieval bedroom with rustic stone walls and luxurious red ornate fabrics, illuminated by warm candlelight and a fireplace.", + "description": "A dimly lit, rustic medieval bedroom featuring a large canopy bed, wooden interiors, and red drapery.", "scene": { - "background": "indoors, stone wall, wood flooring, arched window, fireplace, tapestry, medieval interior, wooden beams, night", - "foreground": "canopy bed, red bedding, messy sheets, velvet pillows, fur rug, ornate chair, goblet, washbasin", + "background": "indoors, wooden_wall, wooden_floor, window, night", + "foreground": "canopy_bed, carpet, candle", "furniture": [ - "four-poster bed", - "vanity table", - "wooden trunk", - "dressing screen", - "candle stand" + "canopy_bed", + "carpet", + "curtains" ], "colors": [ - "crimson", "brown", - "gold", - "amber", - "deep purple" + "red", + "orange" ], - "lighting": "candlelight, firelight, warm lighting, dim, volumetric lighting, atmospheric, low key", - "theme": "medieval, fantasy, romance, historical, rustic, intimate" + "lighting": "candlelight, dim_light", + "theme": "medieval, brothel, fantasy, red_theme" }, "lora": { "lora_name": "Illustrious/Backgrounds/IL_Medieval_brothel_Bedroom_r1.safetensors", "lora_weight": 1.0, - "lora_triggers": "IL_Medieval_brothel_Bedroom_r1" + "lora_triggers": "medieval_brothel, bedroom, canopy bed, wooden floor, wooden wall, candle, night, red curtains, carpet, window" }, "tags": [ "medieval", - "bedroom", "brothel", - "interior", - "fantasy", - "intricate", - "luxury", - "romantic atmosphere" + "bedroom", + "canopy_bed", + "wooden_floor", + "wooden_wall", + "candle", + "night", + "curtains", + "carpet", + "window", + "candlelight", + "dim_light", + "red_theme" ] } \ No newline at end of file diff --git a/data/scenes/il_vintage_tavern.json b/data/scenes/il_vintage_tavern.json index 42f02ba..ba58e33 100644 --- a/data/scenes/il_vintage_tavern.json +++ b/data/scenes/il_vintage_tavern.json @@ -1,41 +1,43 @@ { "scene_id": "il_vintage_tavern", "scene_name": "Il Vintage Tavern", - "description": "A cozy and rustic tavern interior featuring aged wooden beams, stone walls filled with shelves of bottles, and a warm, inviting atmosphere illuminated by soft lantern light.", + "description": "A dimly lit medieval tavern interior featuring wooden furniture, a bar counter, and warm red lighting with vintage decor.", "scene": { - "background": "indoors, tavern, bar, shelves, glass bottle, alcohol, stone wall, wooden wall, fireplace, shelf, blur", - "foreground": "table, wooden chair, tankard, candle, countertop", + "background": "indoors, tavern, scenery, wooden_wall, wooden_floor, tapestry, shelf, barrel", + "foreground": "wooden_table, chair, stool, counter, bottle, alcohol, glass, mug", "furniture": [ - "wooden beams", - "bar counter", - "bar stool", - "barrels", - "wooden table", - "chandelier" + "wooden_table", + "chair", + "stool", + "shelf", + "counter" ], "colors": [ + "red", "brown", - "amber", - "dark wood", - "warm yellow", - "orange" + "dark" ], - "lighting": "warm lighting, candlelight, cinematic lighting, lantern light, volumetric lighting, low light", - "theme": "rustic, medieval, fantasy, historical, cozy, pub" + "lighting": "chandelier, ceiling_light, lamp, red_light, dimly_lit, candle", + "theme": "medieval, vintage, rustic" }, "lora": { "lora_name": "Illustrious/Backgrounds/IL_Vintage_Tavern.safetensors", - "lora_weight": 1.0, - "lora_triggers": "IL_Vintage_Tavern" + "lora_weight": 0.7, + "lora_triggers": "vinbmf, scenery, vintage, medieval, wooden tables, tavern, counter, red lamps, dark, red tapestry, small chandelier" }, "tags": [ - "scenery", - "no humans", - "detailed background", - "architecture", - "interior", - "perspective", - "depth of field", - "realistic" + "anime", + "vintage", + "medieval", + "tavern", + "background", + "wooden_table", + "counter", + "red_light", + "darkness", + "tapestry", + "chandelier", + "indoors", + "scenery" ] } \ No newline at end of file diff --git a/data/scenes/laboratory___il.json b/data/scenes/laboratory___il.json index 984a65f..d73f600 100644 --- a/data/scenes/laboratory___il.json +++ b/data/scenes/laboratory___il.json @@ -1,33 +1,50 @@ { "scene_id": "laboratory___il", "scene_name": "Laboratory Il", - "description": "A detailed modern science laboratory scene featuring a cluttered workbench with various chemical experiments and high-tech equipment.", + "description": "A detailed scientific laboratory environment featuring high-tech equipment, glassware, and sterile surfaces.", "scene": { - "background": "indoors, laboratory, science, shelves, cabinets, poster, whiteboard, machinery, glass_wall", - "foreground": "table, desk, beaker, flask, test_tube, liquid, chemical, microscope, computer, laptop, messy_desk, paperwork, wire", + "background": "indoors, laboratory, reflective_floor, science_fiction", + "foreground": "test_tube, vial, bottle, round-bottom_flask, chemicals, liquid, potion, paper, cable", "furniture": [ - "lab_bench", - "metal_cabinet", - "stool" + "cabinet", + "shelf", + "monitor", + "table", + "stasis_tank" ], "colors": [ "white", - "silver", - "cyan", - "glass" + "blue", + "silver" ], - "lighting": "fluorescent, bright, cold_lighting, screen_glow", - "theme": "science, research, chemistry, technology" + "lighting": "ceiling_light, artificial_lighting", + "theme": "science, chemistry, medical, sci-fi" }, "lora": { "lora_name": "Illustrious/Backgrounds/Laboratory_-_IL.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Laboratory_-_IL" + "lora_weight": 0.7, + "lora_triggers": "l4b" }, "tags": [ - "scenery", - "no_humans", - "hyperdetailed", - "realistic" + "indoors", + "laboratory", + "science", + "test_tube", + "monitor", + "shelf", + "vial", + "bottle", + "round-bottom_flask", + "cabinet", + "paper", + "reflective_floor", + "cable", + "chemicals", + "jar", + "ceiling_light", + "liquid", + "potion", + "science_fiction", + "stasis_tank" ] } \ No newline at end of file diff --git a/data/scenes/m4dscienc3_il.json b/data/scenes/m4dscienc3_il.json index 4d0b360..97b3eb0 100644 --- a/data/scenes/m4dscienc3_il.json +++ b/data/scenes/m4dscienc3_il.json @@ -1,37 +1,53 @@ { "scene_id": "m4dscienc3_il", "scene_name": "M4Dscienc3 Il", - "description": "A dark, cluttered laboratory filled with chaotic experiments, glowing chemical flasks, and sparking electrical equipment.", + "description": "A freaky, funky laboratory full of strange inventions, bubbling chemicals, and ominous machines with a Saturday morning cartoon vibe.", "scene": { - "background": "indoors, laboratory, science fiction, mess, cluttered, wires, pipes, servers, electronics on wall, monitors, vapor", - "foreground": "flask, beaker, test tube, glowing liquid, bubbling, smoke, sparks, electricity, tesla coil, paperwork, glass shards", + "background": "dungeon, stone_wall, brick_wall, indoors, scenery, dark", + "foreground": "flask, beaker, test_tube, glowing_liquid, green_liquid, purple_liquid, smoke, bubbles, electricity", "furniture": [ - "workbench", - "metal shelving", - "rusty table", - "control console" + "machine", + "table", + "desk", + "shelf", + "monitor", + "cable", + "wire" ], "colors": [ - "neon green", - "electric blue", - "dark grey", - "rust orange" + "green", + "purple", + "black", + "grey" ], - "lighting": "dimly lit, cinematic lighting, volumetric lighting, glow from chemicals, bloom", - "theme": "mad science, cyberpunk, ominous, eccentric, hazard" + "lighting": "dim_lighting, glowing, ominous", + "theme": "science_fiction, horror_(theme), cartoon" }, "lora": { "lora_name": "Illustrious/Backgrounds/M4DSCIENC3-IL.safetensors", "lora_weight": 1.0, - "lora_triggers": "M4DSCIENC3-IL" + "lora_triggers": "M4DSCIENC3, laboratory, dungeon" }, "tags": [ - "masterpiece", - "best quality", - "highres", - "detailed background", - "illustration", - "concept art", - "scifi" + "laboratory", + "dungeon", + "science_fiction", + "horror_(theme)", + "machine", + "flask", + "beaker", + "test_tube", + "glowing_liquid", + "green_liquid", + "purple_liquid", + "smoke", + "cable", + "wire", + "monitor", + "electricity", + "dark", + "indoors", + "no_humans", + "scenery" ] } \ No newline at end of file diff --git a/data/scenes/midis_largeroom_v0_5_il_.json b/data/scenes/midis_largeroom_v0_5_il_.json index 6108603..89d3f05 100644 --- a/data/scenes/midis_largeroom_v0_5_il_.json +++ b/data/scenes/midis_largeroom_v0_5_il_.json @@ -1,34 +1,35 @@ { "scene_id": "midis_largeroom_v0_5_il_", "scene_name": "Midis Largeroom V0 5 Il ", - "description": "An expansive, modern interior space featuring high ceilings and panoramic floor-to-ceiling windows.", + "description": "A vast and distinctively large modern living room, emphasizing the wide open space and architectural details.", "scene": { - "background": "indoors, window, cityscape, sky, high_ceiling, glass_wall, scenery", - "foreground": "spacious, empty_room, polished_floor, depth_of_field", + "background": "living_room, indoors, window, scenery, architecture, ceiling", + "foreground": "carpet, floor", "furniture": [ - "modern_sofa", - "coffee_table", + "couch", + "table", + "bookshelf", "potted_plant", - "carpet" + "television" ], "colors": [ "white", - "beige", - "grey" + "brown", + "beige" ], - "lighting": "natural_light, sunlight, cinematic_lighting, soft_shadows", - "theme": "modern_architecture, luxury, minimalism" + "lighting": "sunlight, day", + "theme": "spacious_interior" }, "lora": { "lora_name": "Illustrious/Backgrounds/midis_LargeRoom_V0.5[IL].safetensors", "lora_weight": 1.0, - "lora_triggers": "midis_LargeRoom_V0.5[IL]" + "lora_triggers": "largeroom" }, "tags": [ - "best_quality", "masterpiece", - "ultra_detailed", - "architectural_photography", - "no_humans" + "best_quality", + "absurdres", + "wide_shot", + "very_aesthetic" ] } \ No newline at end of file diff --git a/data/scenes/mushroom.json b/data/scenes/mushroom.json index d91d863..f6c48ba 100644 --- a/data/scenes/mushroom.json +++ b/data/scenes/mushroom.json @@ -1,34 +1,33 @@ { "scene_id": "mushroom", "scene_name": "Mushroom", - "description": "A whimsical fantasy forest floor teeming with giant bioluminescent mushrooms and magical spores floating in the air.", + "description": "A fantasy forest landscape filled with large, glowing mushrooms and bioluminescent flora under a night sky", "scene": { - "background": "forest, trees, dense vegetation, moss, ferns, dark background, bokeh, nature, outdoors, mist", - "foreground": "mushroom, giant mushroom, glowing fungus, spores, sparkling, intricate details, dew drops, mycelium", - "furniture": [ - "tree stump", - "fallen log" - ], + "background": "forest, giant_mushroom, glowing_mushroom, night, bioluminescence, nature, trees", + "foreground": "grass, mushroom, fungus, ferns, wildflowers", + "furniture": [], "colors": [ - "forest green", - "bioluminescent blue", - "earthy brown", - "glowing purple" + "colorful", + "blue", + "green", + "purple" ], - "lighting": "bioluminescence, soft atmospheric lighting, volumetric lighting, god rays, low light, cinematic", - "theme": "fantasy, magical, botanical, surreal, cottagecore" + "lighting": "bioluminescence, glowing, cinematic_lighting", + "theme": "fantasy, magical, surreal" }, "lora": { "lora_name": "Illustrious/Backgrounds/Mushroom.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Mushroom" + "lora_weight": 0.7, + "lora_triggers": "mshr00m" }, "tags": [ + "forest", + "mushroom", "nature", + "giant_mushroom", + "glowing_mushroom", + "bioluminescence", "fantasy", - "scenery", - "no humans", - "masterpiece", - "best quality" + "night" ] } \ No newline at end of file diff --git a/data/scenes/mysterious_4lch3my_sh0p_i.json b/data/scenes/mysterious_4lch3my_sh0p_i.json index 238d50a..40dc866 100644 --- a/data/scenes/mysterious_4lch3my_sh0p_i.json +++ b/data/scenes/mysterious_4lch3my_sh0p_i.json @@ -1,38 +1,35 @@ { "scene_id": "mysterious_4lch3my_sh0p_i", "scene_name": "Mysterious 4Lch3My Sh0P I", - "description": "A dimly lit, cluttered interior of an apothecary filled with bubbling potions, ancient tomes, and strange artifacts.", + "description": "A dimly lit, mysterious alchemy shop filled with ancient books, glowing potions, and strange magical artifacts like preserved eyes and enchanted daggers.", "scene": { - "background": "indoors, room, wooden walls, stone floor, filled shelves, cobwebs, hanging plants, drying herbs", - "foreground": "counter, glass bottle, potion, glowing liquid, open book, scroll, skull, crystals, mortar and pestle", + "background": "indoors, alchemy laboratory, cluttered, bookshelf, potion, glass bottle, spider web, stone wall, mist, shelves, ancient", + "foreground": "wooden counter, open book, grimoire, mortar and pestle, crystal ball, dagger, jar, cauldron, magic circle, glowing runes, steam", "furniture": [ + "wooden shelves", "wooden counter", - "bookshelf", - "display cabinet", - "stool" + "stone walls" ], "colors": [ - "dark brown", - "emerald green", - "amethyst purple", - "gold" + "deep purple", + "shimmering gold", + "eerie green", + "brown", + "dark grey" ], - "lighting": "dim, candlelight, lantern, glowing, cinematic lighting, volumetric lighting, shadows", - "theme": "fantasy, magic, alchemy, mystery, steampunk" + "lighting": "dimly lit, candlelight, flickering, glowing, volumetric lighting", + "theme": "fantasy, mystery, arcane, magic, ancient" }, "lora": { "lora_name": "Illustrious/Backgrounds/mysterious_4lch3my_sh0p-i.safetensors", "lora_weight": 1.0, - "lora_triggers": "mysterious_4lch3my_sh0p-i" + "lora_triggers": "mysterious 4lch3my sh0p" }, "tags": [ - "alchemy", - "shop", - "magic", - "fantasy", + "mysterious alchemy shop", "interior", - "detailed", - "cluttered", - "mysterious" + "fantasy", + "background", + "magic shop" ] } \ No newline at end of file diff --git a/data/scenes/nightclub.json b/data/scenes/nightclub.json index 8170018..f7ead0a 100644 --- a/data/scenes/nightclub.json +++ b/data/scenes/nightclub.json @@ -1,27 +1,22 @@ { "scene_id": "nightclub", "scene_name": "Nightclub", - "description": "A vibrant and energetic nightclub interior pulsing with neon lasers, haze, and a crowded dance floor atmosphere.", + "description": "A vibrant and moody interior of a nightclub heavily styled with purple tones and neon lighting.", "scene": { - "background": "indoors, nightclub, crowd, bokeh, dj booth, shelves, alcohol bottles, wall, dark", - "foreground": "dance floor, confetti, haze, laser beam", + "background": "indoors, nightclub, purple_background, purple_theme, shelf", + "foreground": "dance_floor", "furniture": [ - "bar counter", - "bar stool", - "disco ball", - "couch", - "speakers", - "amplifier" + "bar_counter", + "bar_stool", + "disco_ball" ], "colors": [ "purple", - "cyan", - "neon pink", - "black", - "midnight blue" + "violet", + "black" ], - "lighting": "cinematic lighting, volumetric lighting, strobe lights, dim, colorful, backlighting", - "theme": "nightlife, party, edm, rave" + "lighting": "neon_lights, dim_lighting, stage_lights", + "theme": "nightlife" }, "lora": { "lora_name": "Illustrious/Backgrounds/nightclub.safetensors", @@ -30,11 +25,10 @@ }, "tags": [ "nightclub", - "party", - "neon", - "music", - "dance", - "crowd", - "alcohol" + "purple_theme", + "neon_lights", + "indoors", + "bar_counter", + "disco_ball" ] } \ No newline at end of file diff --git a/data/scenes/privacy_screen_anyillustriousxlfor_v11_came_1420_v1_0.json b/data/scenes/privacy_screen_anyillustriousxlfor_v11_came_1420_v1_0.json index f387732..dda922c 100644 --- a/data/scenes/privacy_screen_anyillustriousxlfor_v11_came_1420_v1_0.json +++ b/data/scenes/privacy_screen_anyillustriousxlfor_v11_came_1420_v1_0.json @@ -1,35 +1,37 @@ { "scene_id": "privacy_screen_anyillustriousxlfor_v11_came_1420_v1_0", "scene_name": "Privacy Screen Anyillustriousxlfor V11 Came 1420 V1 0", - "description": "An intimate indoor setting featuring a classic folding privacy screen acting as a room divider in a dressing area.", + "description": "A partitioned area within a hospital or infirmary, featuring medical privacy curtains to separate patient beds.", "scene": { - "background": "indoors, bedroom, dressing room, wooden floor, painted wall, rug", - "foreground": "privacy screen, folding screen, room divider, wood frame, paper screen, ornate design", + "background": "hospital, infirmary, indoors, white_wall", + "foreground": "privacy_screen, curtains, partition", "furniture": [ - "privacy screen", - "full-length mirror", - "clothes rack", - "stool" + "hospital_bed", + "intravenous_drip", + "bed" ], "colors": [ - "beige", - "light brown", - "warm white", - "cream" + "white", + "green", + "pale_color" ], - "lighting": "soft ambient lighting, indoor lighting, cast shadows", - "theme": "domestic, privacy, slice of life" + "lighting": "ceiling_light, daylight", + "theme": "medical, sterile" }, "lora": { "lora_name": "Illustrious/Backgrounds/privacy_screen_anyillustriousXLFor_v11_came_1420_v1.0.safetensors", "lora_weight": 1.0, - "lora_triggers": "privacy_screen_anyillustriousXLFor_v11_came_1420_v1.0" + "lora_triggers": "privacy_curtains, hospital_curtains" }, "tags": [ - "privacy screen", - "room divider", - "furniture", - "indoors", - "folding screen" + "hospital", + "infirmary", + "privacy_screen", + "curtains", + "hospital_bed", + "intravenous_drip", + "ceiling_light", + "white_wall", + "partition" ] } \ No newline at end of file diff --git a/data/scenes/retrokitchenill.json b/data/scenes/retrokitchenill.json index 629f343..ae8a518 100644 --- a/data/scenes/retrokitchenill.json +++ b/data/scenes/retrokitchenill.json @@ -1,36 +1,44 @@ { "scene_id": "retrokitchenill", "scene_name": "Retrokitchenill", - "description": "A charming, nostalgic mid-century modern kitchen illustration featuring pastel colors, checkered flooring, and vintage appliances.", + "description": "A charming 1950s-style kitchen scene featuring pastel appliances and checkered floors, evoking a nostalgic diner atmosphere.", "scene": { - "background": "indoors, kitchen, tile floor, checkered floor, window, curtains, wallpaper, cabinets, retro style, scenery, no humans", - "foreground": "table, chair, refrigerator, stove, oven, sink, countertop, plant, vase, fruit bowl", + "background": "kitchen, indoors, checkered_floor, window", + "foreground": "table, chair", "furniture": [ - "chrome dinette set", - "rounded refrigerator", - "gas stove", - "formica table" + "refrigerator", + "stove", + "cabinet", + "sink", + "cupboard" ], "colors": [ - "mint green", - "pastel pink", - "cream", - "turquoise", - "chrome" + "pastel_colors", + "white" ], - "lighting": "soft lighting, natural light, flat lighting", - "theme": "vintage, retro, 1950s, pop art, domestic" + "lighting": "sunlight", + "theme": "1950s_(style), retro_artstyle" }, "lora": { "lora_name": "Illustrious/Backgrounds/RetroKitchenILL.safetensors", "lora_weight": 1.0, - "lora_triggers": "RetroKitchenILL" + "lora_triggers": "retro kitchens" }, "tags": [ - "retro", - "illustration", "kitchen", - "aesthetic", - "vintage" + "indoors", + "checkered_floor", + "refrigerator", + "stove", + "cabinet", + "sink", + "pastel_colors", + "1950s_(style)", + "no_humans", + "scenery", + "table", + "chair", + "window", + "sunlight" ] } \ No newline at end of file diff --git a/data/scenes/scenicill.json b/data/scenes/scenicill.json index 20edae7..651fc94 100644 --- a/data/scenes/scenicill.json +++ b/data/scenes/scenicill.json @@ -1,34 +1,42 @@ { "scene_id": "scenicill", "scene_name": "Scenicill", - "description": "A breathtaking fantasy landscape illustrating a vast valley with floating islands and cascading waterfalls under a vibrant sunset.", + "description": "A mystical and detailed forest landscape bathed in the soft glow of twilight and starlight, evoking a magical atmosphere.", "scene": { - "background": "scenery, outdoors, sky, clouds, day, mountain, waterfall, fantasy, tree, nature, water, river, floating_island, sunset, horizon, vast, panoramic view, aesthetic", - "foreground": "grass, flower, field, moss, rock, path, depth of field, detailed flora", + "background": "scenery, outdoors, nature, forest, tree, night, starry_sky, twilight, magic", + "foreground": "grass, flower, fireflies, glowing, no_humans", "furniture": [ - "ancient ruins", - "stone archway" + "rock", + "tree_stump" ], "colors": [ - "gold", - "azure", - "cyan", - "verdant green" + "blue_theme", + "purple_theme" ], - "lighting": "cinematic lighting, volumetric lighting, god rays, glimmering, golden hour", - "theme": "fantasy, adventure, majesty, tranquility" + "lighting": "starry_sky, glowing, cinematic_lighting", + "theme": "fantasy, magic" }, "lora": { "lora_name": "Illustrious/Backgrounds/ScenicILL.safetensors", - "lora_weight": 1.0, - "lora_triggers": "ScenicILL" + "lora_weight": 0.8, + "lora_triggers": "scenery" }, "tags": [ - "wallpaper", - "highly detailed", + "scenery", + "no_humans", + "nature", + "outdoors", + "forest", + "tree", + "grass", + "flower", + "night", + "twilight", + "starry_sky", + "glowing", + "fireflies", + "magic", "masterpiece", - "best quality", - "vivid colors", - "painting" + "best_quality" ] } \ No newline at end of file diff --git a/data/scenes/space_backround_illustrious.json b/data/scenes/space_backround_illustrious.json index 4a498ac..36ee2f5 100644 --- a/data/scenes/space_backround_illustrious.json +++ b/data/scenes/space_backround_illustrious.json @@ -1,30 +1,32 @@ { "scene_id": "space_backround_illustrious", "scene_name": "Space Backround Illustrious", - "description": "A breathtaking view of a vibrant, swirling nebula and distant galaxies in deep space.", + "description": "A majestic and aesthetic space scenery featuring intricate starry skies, vibrant nebulae, and the vast universe, designed to serve as a high-quality background for illustrations.", "scene": { - "background": "outer space, nebula, galaxy, milky way, starry sky, cosmic dust, purple space, blue space, hyperdetailed sky", - "foreground": "no humans, scenery, wide shot, lens flare", + "background": "space, starry_sky, universe, nebula, galaxy, milky_way, scenery", + "foreground": "", "furniture": [], "colors": [ - "deep violet", - "cyan", - "midnight blue", - "glowing magenta" + "purple_theme", + "blue_theme", + "black" ], - "lighting": "bioluminescent, starlight, cinematic lighting, chromatic aberration", - "theme": "sci-fi, celestial, atmospheric, mysterious" + "lighting": "starry_sky", + "theme": "science_fiction" }, "lora": { "lora_name": "Illustrious/Backgrounds/space_backround_illustrious.safetensors", - "lora_weight": 1.0, - "lora_triggers": "space_backround_illustrious" + "lora_weight": 0.8, + "lora_triggers": "space_backround" }, "tags": [ - "masterpiece", - "best quality", - "wallpaper", - "astrophotography", - "concept art" + "space", + "universe", + "galaxy", + "nebula", + "starry_sky", + "scenery", + "science_fiction", + "milky_way" ] } \ No newline at end of file diff --git a/data/scenes/vip.json b/data/scenes/vip.json index 91d2279..6e8fd70 100644 --- a/data/scenes/vip.json +++ b/data/scenes/vip.json @@ -1,35 +1,40 @@ { "scene_id": "vip", "scene_name": "Vip", - "description": "A high-end, exclusive VIP lounge scene set in a luxury penthouse overlooking a city skyline at night.", + "description": "An exclusive, dimly lit VIP area in a bustling nightclub, separated by velvet rope stanchions and furnished with plush couches and tables laden with expensive alcohol and money.", "scene": { - "background": "indoors, penthouse, luxury, cityscape, night, skyline, large window, heavy curtains, golden geometric patterns", - "foreground": "champagne bottle, ice bucket, crystal glasses, velvet rope, red carpet", + "background": "nightclub, indoors, dim_lighting", + "foreground": "stanchion, alcohol, drinking_glass, banknote, money", "furniture": [ - "chesterfield sofa", - "crystal chandelier", - "marble coffee table", - "gold accents" + "couch", + "booth_seating", + "table" ], "colors": [ - "gold", - "black", - "burgundy", - "royal purple" + "red", + "purple", + "black" ], - "lighting": "dim lighting, mood lighting, cinematic, soft glow, city lights", - "theme": "luxury, wealth, exclusivity, nightlife" + "lighting": "neon_lights", + "theme": "party" }, "lora": { "lora_name": "Illustrious/Backgrounds/VIP.safetensors", - "lora_weight": 1.0, - "lora_triggers": "VIP" + "lora_weight": 0.7, + "lora_triggers": "v1p" }, "tags": [ - "vip", - "luxury", - "rich", - "elegant", - "high lass" + "nightclub", + "indoors", + "stanchion", + "couch", + "table", + "alcohol", + "drinking_glass", + "booth_seating", + "money", + "banknote", + "neon_lights", + "dim_lighting" ] } \ No newline at end of file diff --git a/data/scenes/wedding_venue.json b/data/scenes/wedding_venue.json index 7046440..a1b55e4 100644 --- a/data/scenes/wedding_venue.json +++ b/data/scenes/wedding_venue.json @@ -1,37 +1,43 @@ { "scene_id": "wedding_venue", "scene_name": "Wedding Venue", - "description": "A grand and romantic indoor wedding venue adorned with white floral arrangements, an elegant aisle runner, and soft, ethereal lighting illuminating the altar.", + "description": "A romantic outdoor wedding reception area set in a lush garden, featuring decorated tables and floral arches perfectly prepared for a celebration.", "scene": { - "background": "indoors, church, stained glass, window, altar, arch, scenery, architecture", - "foreground": "aisle, carpet, flower petals, white flower, rose, no humans", + "background": "outdoors, scenery, garden, nature, floral_arch, flower, tree, shrub", + "foreground": "table, tablecloth, bouquet, chair, dishware, bloom", "furniture": [ - "pew", + "table", "chair", - "chandelier", - "podium", - "vase" + "floral_arch" ], "colors": [ "white", - "gold", - "pastel pink", - "cream" + "green", + "pink", + "pastel_colors" ], - "lighting": "sunlight, volumetric lighting, bright, soft lighting, bloom", - "theme": "wedding, romance, ceremony, elegance" + "lighting": "day, sunlight, soft_lighting, natural_light", + "theme": "wedding, party, romance, celebration, formal" }, "lora": { "lora_name": "Illustrious/Backgrounds/Wedding_Venue.safetensors", - "lora_weight": 1.0, - "lora_triggers": "Wedding_Venue" + "lora_weight": 0.7, + "lora_triggers": "w3dd1ng" }, "tags": [ + "w3dd1ng", + "outdoors", "wedding", - "church", - "interior", - "romantic", - "flowers", - "ceremony" + "table", + "bouquet", + "tablecloth", + "floral_arch", + "flower", + "party", + "scenery", + "garden", + "chair", + "nature", + "day" ] } \ No newline at end of file diff --git a/mcp-user-guide.md b/mcp-user-guide.md new file mode 100644 index 0000000..0bbc034 --- /dev/null +++ b/mcp-user-guide.md @@ -0,0 +1,423 @@ +# Danbooru MCP Tag Validator — User Guide + +This guide explains how to integrate and use the `danbooru-mcp` server with an LLM to generate valid, high-quality prompts for Illustrious / Stable Diffusion models trained on Danbooru data. + +--- + +## Table of Contents + +1. [What is this?](#what-is-this) +2. [Quick Start](#quick-start) +3. [Tool Reference](#tool-reference) + - [search_tags](#search_tags) + - [validate_tags](#validate_tags) + - [suggest_tags](#suggest_tags) +4. [Prompt Engineering Workflow](#prompt-engineering-workflow) +5. [Category Reference](#category-reference) +6. [Best Practices](#best-practices) +7. [Common Scenarios](#common-scenarios) +8. [Troubleshooting](#troubleshooting) + +--- + +## What is this? + +Illustrious (and similar Danbooru-trained Stable Diffusion models) uses **Danbooru tags** as its prompt language. +Tags like `1girl`, `blue_hair`, `looking_at_viewer` are meaningful because the model was trained on images annotated with them. + +The problem: there are hundreds of thousands of valid Danbooru tags, and misspelling or inventing tags produces no useful signal — the model generates less accurate images. + +**This MCP server** lets an LLM: +- **Search** the full tag database for tag discovery +- **Validate** a proposed prompt's tags against the real Danbooru database +- **Suggest** corrections for typos or near-miss tags + +The database contains **292,500 tags**, all with ≥10 posts on Danbooru — filtering out one-off or misspelled entries. + +--- + +## Quick Start + +### 1. Add to your MCP client (Claude Desktop example) + +**Using Docker (recommended):** +```json +{ + "mcpServers": { + "danbooru-tags": { + "command": "docker", + "args": ["run", "--rm", "-i", "danbooru-mcp:latest"] + } + } +} +``` + +**Using Python directly:** +```json +{ + "mcpServers": { + "danbooru-tags": { + "command": "/path/to/danbooru-mcp/.venv/bin/python", + "args": ["/path/to/danbooru-mcp/src/server.py"] + } + } +} +``` + +### 2. Instruct the LLM + +Add a system prompt telling the LLM to use the server: + +``` +You have access to the danbooru-tags MCP server for validating Stable Diffusion prompts. +Before generating any final prompt: +1. Use validate_tags to check all proposed tags are real Danbooru tags. +2. Use suggest_tags to fix any invalid tags. +3. Only output the validated, corrected tag list. +``` + +--- + +## Tool Reference + +### `search_tags` + +Find tags by name using full-text / prefix search. + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `query` | `string` | *required* | Search string. Trailing `*` added automatically for prefix match. Supports FTS5 syntax. | +| `limit` | `integer` | `20` | Max results (1–200) | +| `category` | `string` | `null` | Optional filter: `"general"`, `"artist"`, `"copyright"`, `"character"`, `"meta"` | + +**Returns:** List of tag objects: +```json +[ + { + "name": "blue_hair", + "post_count": 1079925, + "category": "general", + "is_deprecated": false + } +] +``` + +**Examples:** + +``` +Search for hair colour tags: + search_tags("blue_hair") + → blue_hair, blue_hairband, blue_hair-chan_(ramchi), … + +Search only character tags for a Vocaloid: + search_tags("hatsune", category="character") + → hatsune_miku, hatsune_mikuo, hatsune_miku_(append), … + +Boolean search: + search_tags("hair AND blue") + → tags matching both "hair" and "blue" +``` + +**FTS5 query syntax:** + +| Syntax | Meaning | +|--------|---------| +| `blue_ha*` | prefix match (added automatically) | +| `"blue hair"` | phrase match | +| `hair AND blue` | both terms present | +| `hair NOT red` | exclusion | + +--- + +### `validate_tags` + +Check a list of tags against the full Danbooru database. Returns three groups: valid, deprecated, and invalid. + +**Parameters:** + +| Parameter | Type | Description | +|-----------|------|-------------| +| `tags` | `list[string]` | Tags to validate, e.g. `["1girl", "blue_hair", "sword"]` | + +**Returns:** +```json +{ + "valid": ["1girl", "blue_hair", "sword"], + "deprecated": [], + "invalid": ["blue_hairs", "not_a_real_tag"] +} +``` + +| Key | Meaning | +|-----|---------| +| `valid` | Exists in Danbooru and is not deprecated — safe to use | +| `deprecated` | Exists but has been deprecated (an updated canonical tag exists) | +| `invalid` | Not found — likely misspelled, hallucinated, or too niche (<10 posts) | + +**Important:** Always run `validate_tags` before finalising a prompt. Invalid tags are silently ignored by the model but waste token budget and reduce prompt clarity. + +--- + +### `suggest_tags` + +Autocomplete-style suggestions for a partial or approximate tag. Results are sorted by post count (most commonly used first). Deprecated tags are **excluded**. + +**Parameters:** + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `partial` | `string` | *required* | Partial tag or rough approximation | +| `limit` | `integer` | `10` | Max suggestions (1–50) | +| `category` | `string` | `null` | Optional category filter | + +**Returns:** Same format as `search_tags`, sorted by `post_count` descending. + +**Examples:** + +``` +Fix a typo: + suggest_tags("looking_at_vewer") + → ["looking_at_viewer", …] + +Find the most popular sword-related tags: + suggest_tags("sword", limit=5, category="general") + → sword (337,737), sword_behind_back (7,203), … + +Find character tags for a partial name: + suggest_tags("miku", category="character") + → hatsune_miku (129,806), yuki_miku (4,754), … +``` + +--- + +## Prompt Engineering Workflow + +This is the recommended workflow for an LLM building Illustrious prompts: + +### Step 1 — Draft + +The LLM drafts an initial list of conceptual tags based on the user's description: + +``` +User: "A girl with long silver hair wearing a kimono in a Japanese garden" + +Draft tags: + 1girl, silver_hair, long_hair, kimono, japanese_garden, cherry_blossoms, + sitting, looking_at_viewer, outdoors, traditional_clothes +``` + +### Step 2 — Validate + +``` +validate_tags([ + "1girl", "silver_hair", "long_hair", "kimono", "japanese_garden", + "cherry_blossoms", "sitting", "looking_at_viewer", "outdoors", + "traditional_clothes" +]) +``` + +Response: +```json +{ + "valid": ["1girl", "long_hair", "kimono", "cherry_blossoms", "sitting", + "looking_at_viewer", "outdoors", "traditional_clothes"], + "deprecated": [], + "invalid": ["silver_hair", "japanese_garden"] +} +``` + +### Step 3 — Fix invalid tags + +``` +suggest_tags("silver_hair", limit=3) +→ [{"name": "white_hair", "post_count": 800000}, ...] + +suggest_tags("japanese_garden", limit=3) +→ [{"name": "garden", "post_count": 45000}, + {"name": "japanese_clothes", "post_count": 12000}, ...] +``` + +### Step 4 — Finalise + +``` +Final prompt: + 1girl, white_hair, long_hair, kimono, garden, cherry_blossoms, + sitting, looking_at_viewer, outdoors, traditional_clothes +``` + +All tags are validated. Prompt is ready to send to ComfyUI. + +--- + +## Category Reference + +Danbooru organises tags into five categories. Understanding them helps scope searches: + +| Category | Value | Description | Examples | +|----------|-------|-------------|---------| +| **general** | `0` | Descriptive tags for image content | `1girl`, `blue_hair`, `sword`, `outdoors` | +| **artist** | `1` | Artist/creator names | `wlop`, `natsuki_subaru` | +| **copyright** | `3` | Source material / franchise | `fate/stay_night`, `touhou`, `genshin_impact` | +| **character** | `4` | Specific character names | `hatsune_miku`, `hakurei_reimu` | +| **meta** | `5` | Image quality / format tags | `highres`, `absurdres`, `commentary` | + +**Tips:** +- For generating images, focus on **general** tags (colours, poses, clothing, expressions) +- Add **character** and **copyright** tags when depicting a specific character +- **meta** tags like `highres` and `best_quality` can improve output quality +- Avoid **artist** tags unless intentionally mimicking a specific art style + +--- + +## Best Practices + +### ✅ Always validate before generating + +```python +# Always run this before finalising +result = validate_tags(your_proposed_tags) +# Fix everything in result["invalid"] before sending to ComfyUI +``` + +### ✅ Use suggest_tags for discoverability + +Even for tags you think you know, run `suggest_tags` to find the canonical form: +- `standing` vs `standing_on_one_leg` vs `standing_split` +- `smile` vs `small_smile` vs `evil_smile` + +The tag with the highest `post_count` is almost always the right one for your intent. + +### ✅ Prefer high-post-count tags + +Higher post count = more training data = more consistent model response. + +```python +# Get the top 5 most established hair colour tags +suggest_tags("hair_color", limit=5, category="general") +``` + +### ✅ Layer specificity + +Good prompts move from general to specific: +``` +# General → Specific +1girl, # subject count +solo, # composition +long_hair, blue_hair, # hair +white_dress, off_shoulder, # clothing +smile, looking_at_viewer, # expression/pose +outdoors, garden, daytime, # setting +masterpiece, best_quality # quality +``` + +### ❌ Avoid deprecated tags + +If `validate_tags` reports a tag as `deprecated`, use `suggest_tags` to find the current replacement: + +```python +# If "nude" is deprecated, find the current tag: +suggest_tags("nude", category="general") +``` + +### ❌ Don't invent tags + +The model doesn't understand arbitrary natural language in prompts — only tags it was trained on. `beautiful_landscape` is not a Danbooru tag; `scenery` and `landscape` are. + +--- + +## Common Scenarios + +### Scenario: Character in a specific pose + +``` +# 1. Search for pose tags +search_tags("sitting", category="general", limit=10) +→ sitting, sitting_on_ground, kneeling, seiza, wariza, … + +# 2. Validate the full tag set +validate_tags(["1girl", "hatsune_miku", "sitting", "looking_at_viewer", "smile"]) +``` + +### Scenario: Specific art style + +``` +# Find copyright tags for a franchise +search_tags("genshin", category="copyright", limit=5) +→ genshin_impact, … + +# Find character from that franchise +search_tags("hu_tao", category="character", limit=3) +→ hu_tao_(genshin_impact), … +``` + +### Scenario: Quality boosting tags + +``` +# Find commonly used meta/quality tags +search_tags("quality", category="meta", limit=5) +→ best_quality, high_quality, … + +search_tags("res", category="meta", limit=5) +→ highres, absurdres, ultra-high_res, … +``` + +### Scenario: Unknown misspelling + +``` +# You typed "haor" instead of "hair" +suggest_tags("haor", limit=5) +→ [] (no prefix match) + +# Try a broader search +search_tags("long hair") +→ long_hair, long_hair_between_eyes, wavy_hair, … +``` + +--- + +## Troubleshooting + +### "invalid" tags that should be valid + +The database contains only tags with **≥10 posts**. Tags with fewer posts are intentionally excluded as they are likely misspellings, very niche, or one-off annotations. + +If a tag you expect to be valid shows as invalid: +1. Try `suggest_tags` to find a close variant +2. Use `search_tags` to explore the tag space +3. The tag may genuinely have <10 posts — use a broader synonym instead + +### Server not responding + +Check the MCP server is running and the `db/tags.db` file exists: + +```bash +# Local +python src/server.py + +# Docker +docker run --rm -i danbooru-mcp:latest +``` + +Environment variable override: +```bash +DANBOORU_TAGS_DB=/custom/path/tags.db python src/server.py +``` + +### Database needs rebuilding / updating + +Re-run the scraper (it's resumable): + +```bash +# Refresh all tags +python scripts/scrape_tags.py --no-resume + +# Update changed tags only (re-scrapes from scratch, stops at ≥10 posts boundary) +python scripts/scrape_tags.py +``` + +Then rebuild the Docker image: +```bash +docker build -f Dockerfile.prebuilt -t danbooru-mcp:latest . +``` diff --git a/models.py b/models.py index 50af65c..dd54ab6 100644 --- a/models.py +++ b/models.py @@ -99,10 +99,25 @@ class Detailer(db.Model): def __repr__(self): return f'' +class Checkpoint(db.Model): + id = db.Column(db.Integer, primary_key=True) + checkpoint_id = db.Column(db.String(255), unique=True, nullable=False) + slug = db.Column(db.String(255), unique=True, nullable=False) + name = db.Column(db.String(255), nullable=False) + checkpoint_path = db.Column(db.String(255), nullable=False) # e.g. "Illustrious/model.safetensors" + data = db.Column(db.JSON, nullable=True) + image_path = db.Column(db.String(255), nullable=True) + + def __repr__(self): + return f'' + class Settings(db.Model): id = db.Column(db.Integer, primary_key=True) + llm_provider = db.Column(db.String(50), default='openrouter') # 'openrouter', 'ollama', 'lmstudio' openrouter_api_key = db.Column(db.String(255), nullable=True) openrouter_model = db.Column(db.String(100), default='google/gemini-2.0-flash-001') + local_base_url = db.Column(db.String(255), nullable=True) + local_model = db.Column(db.String(100), nullable=True) def __repr__(self): return '' diff --git a/requirements.txt b/requirements.txt index 2a8ebfd..90412bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ Flask Flask-Session Flask-SQLAlchemy Pillow -requests \ No newline at end of file +requests +mcp \ No newline at end of file diff --git a/templates/actions/detail.html b/templates/actions/detail.html index 01811e6..d5df099 100644 --- a/templates/actions/detail.html +++ b/templates/actions/detail.html @@ -250,23 +250,37 @@ const clientId = 'action_detail_' + Math.random().toString(36).substring(2, 15); // ComfyUI WebSocket - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding Image", + "9": "Saving Image" + }; + let currentPromptId = null; let currentAction = null; socket.addEventListener('message', (event) => { - if (!currentPromptId) return; - const msg = JSON.parse(event.data); if (msg.type === 'status') { - const queueRemaining = msg.data.status.exec_info.queue_remaining; - if (queueRemaining > 0) { - progressLabel.textContent = `Queue position: ${queueRemaining}`; + if (!currentPromptId) { + const queueRemaining = msg.data.status.exec_info.queue_remaining; + if (queueRemaining > 0) { + progressLabel.textContent = `Queue position: ${queueRemaining}`; + } } } else if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; const value = msg.data.value; const max = msg.data.max; const percent = Math.round((value / max) * 100); @@ -274,10 +288,16 @@ progressBar.textContent = `${percent}%`; } else if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { // Execution finished via WebSocket console.log('Finished via WebSocket'); if (resolveCompletion) resolveCompletion(); + } else { + const nodeName = nodeNames[nodeId] || `Processing...`; + progressLabel.textContent = nodeName; } } }); @@ -344,6 +364,9 @@ currentPromptId = data.prompt_id; progressLabel.textContent = 'Queued...'; + progressBar.style.width = '100%'; + progressBar.textContent = 'Queued'; + progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); // Wait for completion (WebSocket or Polling) await waitForCompletion(currentPromptId); diff --git a/templates/actions/index.html b/templates/actions/index.html index 1c91e62..e3d7722 100644 --- a/templates/actions/index.html +++ b/templates/actions/index.html @@ -9,6 +9,10 @@
+
+ + +
Create New Action
@@ -19,11 +23,27 @@
-
Batch Generating Actions...
-
-
0%
+
+
Batch Generating Actions...
+ Starting... +
+ +
+ Overall Batch Progress +
+
+
+
+ +
+
+ + +
+
+
+
-

@@ -62,21 +82,58 @@ const batchBtn = document.getElementById('batch-generate-btn'); const regenAllBtn = document.getElementById('regenerate-all-btn'); const progressBar = document.getElementById('batch-progress-bar'); + const taskProgressBar = document.getElementById('task-progress-bar'); const container = document.getElementById('batch-progress-container'); const statusText = document.getElementById('batch-status-text'); + const nodeStatus = document.getElementById('batch-node-status'); const itemNameText = document.getElementById('current-item-name'); + const stepProgressText = document.getElementById('current-step-progress'); const clientId = 'actions_batch_' + Math.random().toString(36).substring(2, 15); - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding", + "9": "Saving" + }; + let currentPromptId = null; let resolveGeneration = null; socket.addEventListener('message', (event) => { const msg = JSON.parse(event.data); - if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + + if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; + const value = msg.data.value; + const max = msg.data.max; + const percent = Math.round((value / max) * 100); + stepProgressText.textContent = `${percent}%`; + taskProgressBar.style.width = `${percent}%`; + taskProgressBar.textContent = `${percent}%`; + taskProgressBar.classList.remove('progress-bar-striped', 'progress-bar-animated'); + } + else if (msg.type === 'executing') { + if (msg.data.prompt_id !== currentPromptId) return; + const nodeId = msg.data.node; + if (nodeId === null) { if (resolveGeneration) resolveGeneration(); + } else { + nodeStatus.textContent = nodeNames[nodeId] || `Processing...`; + stepProgressText.textContent = ""; + if (nodeId !== "3") { + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = nodeNames[nodeId] || 'Processing...'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + } } } }); @@ -116,12 +173,16 @@ let completed = 0; for (const item of missing) { - completed++; const percent = Math.round((completed / missing.length) * 100); progressBar.style.width = `${percent}%`; progressBar.textContent = `${percent}%`; - statusText.textContent = `Batch Generating Actions: ${completed} / ${missing.length}`; + statusText.textContent = `Batch Generating Actions: ${completed + 1} / ${missing.length}`; itemNameText.textContent = `Current: ${item.name}`; + nodeStatus.textContent = "Queuing..."; + + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = 'Queued'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); try { // Random character for action preview @@ -157,10 +218,17 @@ } catch (err) { console.error(`Failed for ${item.name}:`, err); } + completed++; } + progressBar.style.width = '100%'; + progressBar.textContent = '100%'; statusText.textContent = "Batch Action Generation Complete!"; itemNameText.textContent = ""; + nodeStatus.textContent = "Done"; + stepProgressText.textContent = ""; + taskProgressBar.style.width = '0%'; + taskProgressBar.textContent = ''; batchBtn.disabled = false; regenAllBtn.disabled = false; setTimeout(() => { container.classList.add('d-none'); }, 5000); diff --git a/templates/checkpoints/detail.html b/templates/checkpoints/detail.html new file mode 100644 index 0000000..fcb0f6a --- /dev/null +++ b/templates/checkpoints/detail.html @@ -0,0 +1,308 @@ +{% extends "layout.html" %} + +{% block content %} + + + +
+
+
+
+ {% if ckpt.image_path %} + {{ ckpt.name }} + {% else %} +
+ No Image Attached +
+ {% endif %} +
+
+ +
+ + +
+ + + +
+ +
+ + +
+ +
+ +
+
+
+ +
+ +
+
0%
+
+
+ + {% if preview_image %} +
+
+ Latest Preview +
+ +
+
+
+
+ Preview +
+
+
+ {% else %} +
+
+ Latest Preview +
+ +
+
+
+
+ Preview +
+
+
+ {% endif %} +
+ +
+
+
+

{{ ckpt.name }}

+
+ Back to Gallery +
+ +
+ {% set d = ckpt.data or {} %} + +
+
+ Checkpoint Info +
+
+
+
Name
+
{{ ckpt.name }}
+ +
Family
+
{{ ckpt.checkpoint_path.split('/')[0] }}
+ +
File
+
+ {{ ckpt.checkpoint_path }} +
+
+
+
+ +
+
+ Generation Settings +
+
+
+
Steps
+
{{ d.get('steps', 25) }}
+ +
CFG
+
{{ d.get('cfg', 5) }}
+ +
Sampler
+
{{ d.get('sampler_name', 'euler_ancestral') }}
+ +
VAE
+
+ {% if d.get('vae', 'integrated') == 'integrated' %} + Integrated + {% else %} + {{ d.get('vae') }} + {% endif %} +
+
+
+
+ +
+
+ Base Prompts +
+
+
+
Positive
+
{{ d.get('base_positive', '') or '--' }}
+ +
Negative
+
{{ d.get('base_negative', '') or '--' }}
+
+
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/templates/checkpoints/index.html b/templates/checkpoints/index.html new file mode 100644 index 0000000..c47a85f --- /dev/null +++ b/templates/checkpoints/index.html @@ -0,0 +1,227 @@ +{% extends "layout.html" %} + +{% block content %} +
+

Checkpoint Gallery

+
+ + +
+ +
+
+ + +
+
+ +
+
+
+ + +
+
+
+
Batch Generating Checkpoints...
+ Starting... +
+
+ Overall Batch Progress +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ +
+ {% for ckpt in checkpoints %} +
+
+
+ {% if ckpt.image_path %} + {{ ckpt.name }} + No Image + {% else %} + {{ ckpt.name }} + No Image + {% endif %} +
+
+
{{ ckpt.name }}
+
+ +
+
+ {% endfor %} +
+{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/templates/detail.html b/templates/detail.html index a696d1d..d8a7a09 100644 --- a/templates/detail.html +++ b/templates/detail.html @@ -227,23 +227,37 @@ const clientId = 'detail_view_' + Math.random().toString(36).substring(2, 15); // ComfyUI WebSocket - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding Image", + "9": "Saving Image" + }; + let currentPromptId = null; let currentAction = null; socket.addEventListener('message', (event) => { - if (!currentPromptId) return; - const msg = JSON.parse(event.data); if (msg.type === 'status') { - const queueRemaining = msg.data.status.exec_info.queue_remaining; - if (queueRemaining > 0) { - progressLabel.textContent = `Queue position: ${queueRemaining}`; + if (!currentPromptId) { + const queueRemaining = msg.data.status.exec_info.queue_remaining; + if (queueRemaining > 0) { + progressLabel.textContent = `Queue position: ${queueRemaining}`; + } } } else if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; const value = msg.data.value; const max = msg.data.max; const percent = Math.round((value / max) * 100); @@ -251,10 +265,16 @@ progressBar.textContent = `${percent}%`; } else if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { // Execution finished via WebSocket console.log('Finished via WebSocket'); if (resolveCompletion) resolveCompletion(); + } else { + const nodeName = nodeNames[nodeId] || `Processing...`; + progressLabel.textContent = nodeName; } } }); @@ -321,6 +341,9 @@ currentPromptId = data.prompt_id; progressLabel.textContent = 'Queued...'; + progressBar.style.width = '100%'; + progressBar.textContent = 'Queued'; + progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); // Wait for completion (WebSocket or Polling) await waitForCompletion(currentPromptId); diff --git a/templates/detailers/detail.html b/templates/detailers/detail.html index fb35923..145336d 100644 --- a/templates/detailers/detail.html +++ b/templates/detailers/detail.html @@ -198,23 +198,37 @@ const clientId = 'detailer_detail_' + Math.random().toString(36).substring(2, 15); // ComfyUI WebSocket - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding Image", + "9": "Saving Image" + }; + let currentPromptId = null; let currentAction = null; socket.addEventListener('message', (event) => { - if (!currentPromptId) return; - const msg = JSON.parse(event.data); if (msg.type === 'status') { - const queueRemaining = msg.data.status.exec_info.queue_remaining; - if (queueRemaining > 0) { - progressLabel.textContent = `Queue position: ${queueRemaining}`; + if (!currentPromptId) { + const queueRemaining = msg.data.status.exec_info.queue_remaining; + if (queueRemaining > 0) { + progressLabel.textContent = `Queue position: ${queueRemaining}`; + } } } else if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; const value = msg.data.value; const max = msg.data.max; const percent = Math.round((value / max) * 100); @@ -222,9 +236,16 @@ progressBar.textContent = `${percent}%`; } else if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { - // Execution finished + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { + // Execution finished via WebSocket + console.log('Finished via WebSocket'); if (resolveCompletion) resolveCompletion(); + } else { + const nodeName = nodeNames[nodeId] || `Processing...`; + progressLabel.textContent = nodeName; } } }); @@ -238,12 +259,13 @@ }; resolveCompletion = checkResolve; - // Fallback polling + // Fallback polling in case WebSocket is blocked (403) const pollInterval = setInterval(async () => { try { const resp = await fetch(`/check_status/${promptId}`); const data = await resp.json(); if (data.status === 'finished') { + console.log('Finished via Polling'); checkResolve(); } } catch (err) { console.error('Polling error:', err); } @@ -283,6 +305,10 @@ currentPromptId = data.prompt_id; progressLabel.textContent = 'Queued...'; + progressBar.style.width = '100%'; + progressBar.textContent = 'Queued'; + progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + await waitForCompletion(currentPromptId); finalizeGeneration(currentPromptId, currentAction); currentPromptId = null; diff --git a/templates/detailers/index.html b/templates/detailers/index.html index 593f953..0b7f411 100644 --- a/templates/detailers/index.html +++ b/templates/detailers/index.html @@ -9,6 +9,10 @@
+
+ + +
Create New Detailer
@@ -19,11 +23,27 @@
-
Batch Generating Detailers...
-
-
0%
+
+
Batch Generating Detailers...
+ Starting... +
+ +
+ Overall Batch Progress +
+
+
+
+ +
+
+ + +
+
+
+
-

@@ -64,21 +84,59 @@ const batchBtn = document.getElementById('batch-generate-btn'); const regenAllBtn = document.getElementById('regenerate-all-btn'); const progressBar = document.getElementById('batch-progress-bar'); + const taskProgressBar = document.getElementById('task-progress-bar'); const container = document.getElementById('batch-progress-container'); const statusText = document.getElementById('batch-status-text'); + const nodeStatus = document.getElementById('batch-node-status'); const detailerNameText = document.getElementById('current-detailer-name'); + const stepProgressText = document.getElementById('current-step-progress'); const clientId = 'detailers_batch_' + Math.random().toString(36).substring(2, 15); - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding", + "9": "Saving" + }; + let currentPromptId = null; let resolveGeneration = null; socket.addEventListener('message', (event) => { const msg = JSON.parse(event.data); - if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + + if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; + const value = msg.data.value; + const max = msg.data.max; + const percent = Math.round((value / max) * 100); + stepProgressText.textContent = `${percent}%`; + taskProgressBar.style.width = `${percent}%`; + taskProgressBar.textContent = `${percent}%`; + taskProgressBar.classList.remove('progress-bar-striped', 'progress-bar-animated'); + } + else if (msg.type === 'executing') { + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { if (resolveGeneration) resolveGeneration(); + } else { + nodeStatus.textContent = nodeNames[nodeId] || `Processing...`; + stepProgressText.textContent = ""; + if (nodeId !== "3") { + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = nodeNames[nodeId] || 'Processing...'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + } } } }); @@ -117,16 +175,20 @@ container.classList.remove('d-none'); let completed = 0; - for (const detailer of missing) { - completed++; + for (const item of missing) { const percent = Math.round((completed / missing.length) * 100); progressBar.style.width = `${percent}%`; progressBar.textContent = `${percent}%`; - statusText.textContent = `Batch Generating Detailers: ${completed} / ${missing.length}`; - detailerNameText.textContent = `Current: ${detailer.name}`; + statusText.textContent = `Batch Generating Detailers: ${completed + 1} / ${missing.length}`; + detailerNameText.textContent = `Current: ${item.name}`; + nodeStatus.textContent = "Queuing..."; + + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = 'Queued'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); try { - const genResp = await fetch(`/detailer/${detailer.slug}/generate`, { + const genResp = await fetch(`/detailer/${item.slug}/generate`, { method: 'POST', body: new URLSearchParams({ 'action': 'replace', @@ -140,15 +202,15 @@ await waitForCompletion(currentPromptId); - const finResp = await fetch(`/detailer/${detailer.slug}/finalize_generation/${currentPromptId}`, { + const finResp = await fetch(`/detailer/${item.slug}/finalize_generation/${currentPromptId}`, { method: 'POST', body: new URLSearchParams({ 'action': 'replace' }) }); const finData = await finResp.json(); if (finData.success) { - const img = document.getElementById(`img-${detailer.slug}`); - const noImgSpan = document.getElementById(`no-img-${detailer.slug}`); + const img = document.getElementById(`img-${item.slug}`); + const noImgSpan = document.getElementById(`no-img-${item.slug}`); if (img) { img.src = finData.image_url; img.classList.remove('d-none'); @@ -156,12 +218,19 @@ if (noImgSpan) noImgSpan.classList.add('d-none'); } } catch (err) { - console.error(`Failed for ${detailer.name}:`, err); + console.error(`Failed for ${item.name}:`, err); } + completed++; } + progressBar.style.width = '100%'; + progressBar.textContent = '100%'; statusText.textContent = "Batch Detailer Generation Complete!"; detailerNameText.textContent = ""; + nodeStatus.textContent = "Done"; + stepProgressText.textContent = ""; + taskProgressBar.style.width = '0%'; + taskProgressBar.textContent = ''; batchBtn.disabled = false; regenAllBtn.disabled = false; setTimeout(() => { container.classList.add('d-none'); }, 5000); diff --git a/templates/gallery.html b/templates/gallery.html new file mode 100644 index 0000000..f9fec8a --- /dev/null +++ b/templates/gallery.html @@ -0,0 +1,401 @@ +{% extends "layout.html" %} + +{% block content %} + + +
+

Gallery + {{ total }} image{{ 's' if total != 1 else '' }} +

+
+ + + +
+ + +
+ + +
+ + + {% if slug_options %} +
+ + +
+ {% else %} + + {% endif %} + + +
+ + +
+ + +
+ + +
+ + +
+ {% if category != 'all' %} + + {{ category | capitalize }} + × + + {% endif %} + {% if slug %} + + {{ slug }} + × + + {% endif %} +
+ + +
+ + + +{% if total > 0 %} +

+ Showing {{ (page - 1) * per_page + 1 }}–{% if page * per_page < total %}{{ page * per_page }}{% else %}{{ total }}{% endif %} of {{ total }} +

+{% endif %} + + +{% if images %} + + + +{% if total_pages > 1 %} + +{% endif %} + +{% else %} +
+
🖼️
+

No images found{% if category != 'all' %} in {{ category }}{% endif %}{% if slug %} for {{ slug }}{% endif %}.

+
+{% endif %} + + + + + + +{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/templates/generator.html b/templates/generator.html index 37c4b5f..84371bc 100644 --- a/templates/generator.html +++ b/templates/generator.html @@ -4,12 +4,37 @@
+
+ +
+
0%
+
+
+
Generator Settings
-
+ + + +
+ + + + +
+ + +
+
+ +
- +
+ + +
- + +
- +
+ + +
+
+ {% for item in cat_items %} + + {% else %} +

No {{ cat_label | lower }} found.

+ {% endfor %} +
+
+
+
+ {% endfor %} +
+
+ + +
+ +
+ + + + + + + + + +
+
+ + + × + + +
+
+ + +
+
+ +
+ + +
+
+ +
+
+ +
- +
- +
-
+
Result
-
+
{% if generated_image %}
- Generated Result + Generated Result
{% else %} -
+

Select settings and click Generate

+
+ Generated Result +
{% endif %}
- {% if generated_image %} -
{% endblock %} + +{% block scripts %} + + +{% endblock %} diff --git a/templates/index.html b/templates/index.html index bf1fb01..14daf0a 100644 --- a/templates/index.html +++ b/templates/index.html @@ -15,11 +15,27 @@
-
Batch Generating...
-
-
0%
+
+
Batch Generating...
+ Starting... +
+ +
+ Overall Batch Progress +
+
+
+
+ +
+
+ + +
+
+
+
-

@@ -58,21 +74,59 @@ const batchBtn = document.getElementById('batch-generate-btn'); const regenAllBtn = document.getElementById('regenerate-all-btn'); const progressBar = document.getElementById('batch-progress-bar'); + const taskProgressBar = document.getElementById('task-progress-bar'); const container = document.getElementById('batch-progress-container'); const statusText = document.getElementById('batch-status-text'); + const nodeStatus = document.getElementById('batch-node-status'); const charNameText = document.getElementById('current-char-name'); + const stepProgressText = document.getElementById('current-step-progress'); const clientId = 'gallery_batch_' + Math.random().toString(36).substring(2, 15); - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding", + "9": "Saving" + }; + let currentPromptId = null; let resolveGeneration = null; socket.addEventListener('message', (event) => { const msg = JSON.parse(event.data); - if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + + if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; + const value = msg.data.value; + const max = msg.data.max; + const percent = Math.round((value / max) * 100); + stepProgressText.textContent = `${percent}%`; + taskProgressBar.style.width = `${percent}%`; + taskProgressBar.textContent = `${percent}%`; + taskProgressBar.classList.remove('progress-bar-striped', 'progress-bar-animated'); + } + else if (msg.type === 'executing') { + if (msg.data.prompt_id !== currentPromptId) return; + const nodeId = msg.data.node; + if (nodeId === null) { if (resolveGeneration) resolveGeneration(); + } else { + nodeStatus.textContent = nodeNames[nodeId] || `Processing...`; + stepProgressText.textContent = ""; + // Reset task bar for new node if it's not sampling + if (nodeId !== "3") { + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = nodeNames[nodeId] || 'Processing...'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + } } } }); @@ -112,12 +166,16 @@ let completed = 0; for (const char of missing) { - completed++; const percent = Math.round((completed / missing.length) * 100); progressBar.style.width = `${percent}%`; progressBar.textContent = `${percent}%`; - statusText.textContent = `Batch Generating: ${completed} / ${missing.length}`; + statusText.textContent = `Batch Generating: ${completed + 1} / ${missing.length}`; charNameText.textContent = `Current: ${char.name}`; + nodeStatus.textContent = "Queuing..."; + + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = 'Queued'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); try { const genResp = await fetch(`/character/${char.slug}/generate`, { @@ -148,10 +206,17 @@ } catch (err) { console.error(`Failed for ${char.name}:`, err); } + completed++; } + progressBar.style.width = '100%'; + progressBar.textContent = '100%'; statusText.textContent = "Batch Complete!"; charNameText.textContent = ""; + nodeStatus.textContent = "Done"; + stepProgressText.textContent = ""; + taskProgressBar.style.width = '0%'; + taskProgressBar.textContent = ''; batchBtn.disabled = false; regenAllBtn.disabled = false; setTimeout(() => { container.classList.add('d-none'); }, 5000); diff --git a/templates/layout.html b/templates/layout.html index 7ddc753..845bb30 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -11,6 +11,7 @@ .character-card:hover { transform: scale(1.02); } .img-container { height: 300px; overflow: hidden; background-color: #dee2e6; display: flex; align-items: center; justify-content: center; } .img-container img { width: 100%; height: 100%; object-fit: cover; } + .progress-bar { transition: width 0.4s ease-in-out; } @@ -24,8 +25,10 @@ Styles Scenes Detailers + Checkpoints Create Character Generator + Gallery Settings
diff --git a/templates/outfits/detail.html b/templates/outfits/detail.html index 1bf1b8c..8fa6256 100644 --- a/templates/outfits/detail.html +++ b/templates/outfits/detail.html @@ -196,23 +196,37 @@ const clientId = 'outfit_detail_' + Math.random().toString(36).substring(2, 15); // ComfyUI WebSocket - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding Image", + "9": "Saving Image" + }; + let currentPromptId = null; let currentAction = null; socket.addEventListener('message', (event) => { - if (!currentPromptId) return; - const msg = JSON.parse(event.data); if (msg.type === 'status') { - const queueRemaining = msg.data.status.exec_info.queue_remaining; - if (queueRemaining > 0) { - progressLabel.textContent = `Queue position: ${queueRemaining}`; + if (!currentPromptId) { + const queueRemaining = msg.data.status.exec_info.queue_remaining; + if (queueRemaining > 0) { + progressLabel.textContent = `Queue position: ${queueRemaining}`; + } } } else if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; const value = msg.data.value; const max = msg.data.max; const percent = Math.round((value / max) * 100); @@ -220,10 +234,16 @@ progressBar.textContent = `${percent}%`; } else if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { // Execution finished via WebSocket console.log('Finished via WebSocket'); if (resolveCompletion) resolveCompletion(); + } else { + const nodeName = nodeNames[nodeId] || `Processing...`; + progressLabel.textContent = nodeName; } } }); @@ -290,6 +310,9 @@ currentPromptId = data.prompt_id; progressLabel.textContent = 'Queued...'; + progressBar.style.width = '100%'; + progressBar.textContent = 'Queued'; + progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); // Wait for completion (WebSocket or Polling) await waitForCompletion(currentPromptId); diff --git a/templates/outfits/index.html b/templates/outfits/index.html index 6fc5934..89319bd 100644 --- a/templates/outfits/index.html +++ b/templates/outfits/index.html @@ -16,11 +16,27 @@
-
Batch Generating Outfits...
-
-
0%
+
+
Batch Generating Outfits...
+ Starting... +
+ +
+ Overall Batch Progress +
+
+
+
+ +
+
+ + +
+
+
+
-

@@ -59,21 +75,58 @@ const batchBtn = document.getElementById('batch-generate-btn'); const regenAllBtn = document.getElementById('regenerate-all-btn'); const progressBar = document.getElementById('batch-progress-bar'); + const taskProgressBar = document.getElementById('task-progress-bar'); const container = document.getElementById('batch-progress-container'); const statusText = document.getElementById('batch-status-text'); + const nodeStatus = document.getElementById('batch-node-status'); const itemNameText = document.getElementById('current-item-name'); + const stepProgressText = document.getElementById('current-step-progress'); const clientId = 'outfits_batch_' + Math.random().toString(36).substring(2, 15); - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding", + "9": "Saving" + }; + let currentPromptId = null; let resolveGeneration = null; socket.addEventListener('message', (event) => { const msg = JSON.parse(event.data); - if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + + if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; + const value = msg.data.value; + const max = msg.data.max; + const percent = Math.round((value / max) * 100); + stepProgressText.textContent = `${percent}%`; + taskProgressBar.style.width = `${percent}%`; + taskProgressBar.textContent = `${percent}%`; + taskProgressBar.classList.remove('progress-bar-striped', 'progress-bar-animated'); + } + else if (msg.type === 'executing') { + if (msg.data.prompt_id !== currentPromptId) return; + const nodeId = msg.data.node; + if (nodeId === null) { if (resolveGeneration) resolveGeneration(); + } else { + nodeStatus.textContent = nodeNames[nodeId] || `Processing...`; + stepProgressText.textContent = ""; + if (nodeId !== "3") { + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = nodeNames[nodeId] || 'Processing...'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + } } } }); @@ -113,15 +166,18 @@ let completed = 0; for (const item of missing) { - completed++; const percent = Math.round((completed / missing.length) * 100); progressBar.style.width = `${percent}%`; progressBar.textContent = `${percent}%`; - statusText.textContent = `Batch Generating Outfits: ${completed} / ${missing.length}`; + statusText.textContent = `Batch Generating Outfits: ${completed + 1} / ${missing.length}`; itemNameText.textContent = `Current: ${item.name}`; + nodeStatus.textContent = "Queuing..."; + + taskProgressBar.style.width = '100%'; + taskProgressBar.textContent = 'Queued'; + taskProgressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); try { - // Random character for outfit preview const genResp = await fetch(`/outfit/${item.slug}/generate`, { method: 'POST', body: new URLSearchParams({ @@ -154,10 +210,17 @@ } catch (err) { console.error(`Failed for ${item.name}:`, err); } + completed++; } + progressBar.style.width = '100%'; + progressBar.textContent = '100%'; statusText.textContent = "Batch Outfit Generation Complete!"; itemNameText.textContent = ""; + nodeStatus.textContent = "Done"; + stepProgressText.textContent = ""; + taskProgressBar.style.width = '0%'; + taskProgressBar.textContent = ''; batchBtn.disabled = false; regenAllBtn.disabled = false; setTimeout(() => { container.classList.add('d-none'); }, 5000); diff --git a/templates/scenes/detail.html b/templates/scenes/detail.html index a3de143..8c5f7da 100644 --- a/templates/scenes/detail.html +++ b/templates/scenes/detail.html @@ -212,23 +212,58 @@ } }); + // Generate a unique client ID const clientId = 'scene_detail_' + Math.random().toString(36).substring(2, 15); - const socket = new WebSocket(`ws://127.0.0.1:8188/ws?clientId=${clientId}`); + + // ComfyUI WebSocket + const socket = new WebSocket('{{ COMFYUI_WS_URL }}?clientId=' + clientId); + const nodeNames = { + "3": "Sampling", + "11": "Face Detailing", + "13": "Hand Detailing", + "4": "Loading Models", + "16": "Character LoRA", + "17": "Outfit LoRA", + "18": "Action LoRA", + "19": "Style/Detailer LoRA", + "8": "Decoding Image", + "9": "Saving Image" + }; + let currentPromptId = null; let resolveCompletion = null; socket.addEventListener('message', (event) => { - if (!currentPromptId) return; const msg = JSON.parse(event.data); - if (msg.type === 'progress') { - const percent = Math.round((msg.data.value / msg.data.max) * 100); + + if (msg.type === 'status') { + if (!currentPromptId) { + const queueRemaining = msg.data.status.exec_info.queue_remaining; + if (queueRemaining > 0) { + progressLabel.textContent = `Queue position: ${queueRemaining}`; + } + } + } + else if (msg.type === 'progress') { + if (msg.data.prompt_id !== currentPromptId) return; + const value = msg.data.value; + const max = msg.data.max; + const percent = Math.round((value / max) * 100); progressBar.style.width = `${percent}%`; progressBar.textContent = `${percent}%`; } else if (msg.type === 'executing') { - if (msg.data.node === null && msg.data.prompt_id === currentPromptId) { + if (msg.data.prompt_id !== currentPromptId) return; + + const nodeId = msg.data.node; + if (nodeId === null) { + // Execution finished via WebSocket + console.log('Finished via WebSocket'); if (resolveCompletion) resolveCompletion(); + } else { + const nodeName = nodeNames[nodeId] || `Processing...`; + progressLabel.textContent = nodeName; } } }); @@ -240,12 +275,17 @@ resolve(); }; resolveCompletion = checkResolve; + + // Fallback polling in case WebSocket is blocked (403) const pollInterval = setInterval(async () => { try { const resp = await fetch(`/check_status/${promptId}`); const data = await resp.json(); - if (data.status === 'finished') checkResolve(); - } catch (err) {} + if (data.status === 'finished') { + console.log('Finished via Polling'); + checkResolve(); + } + } catch (err) { console.error('Polling error:', err); } }, 2000); }); } @@ -253,6 +293,7 @@ form.addEventListener('submit', async (e) => { const submitter = e.submitter; if (!submitter || submitter.value !== 'preview') return; + e.preventDefault(); const formData = new FormData(form); @@ -262,7 +303,7 @@ progressContainer.classList.remove('d-none'); progressBar.style.width = '0%'; progressBar.textContent = '0%'; - progressLabel.textContent = 'Queued...'; + progressLabel.textContent = 'Starting...'; try { const response = await fetch(form.getAttribute('action'), { @@ -270,12 +311,30 @@ body: formData, headers: { 'X-Requested-With': 'XMLHttpRequest' } }); + const data = await response.json(); + if (data.error) { + alert('Error: ' + data.error); + progressContainer.classList.add('d-none'); + return; + } + currentPromptId = data.prompt_id; + progressLabel.textContent = 'Queued...'; + progressBar.style.width = '100%'; + progressBar.textContent = 'Queued'; + progressBar.classList.add('progress-bar-striped', 'progress-bar-animated'); + + // Wait for completion (WebSocket or Polling) await waitForCompletion(currentPromptId); + + // Finalize finalizeGeneration(currentPromptId); + currentPromptId = null; + } catch (err) { console.error(err); + alert('Request failed'); progressContainer.classList.add('d-none'); } }); @@ -289,19 +348,33 @@ try { const response = await fetch(url, { method: 'POST', body: formData }); const data = await response.json(); + if (data.success) { + // Update preview image previewImg.src = data.image_url; if (previewCard) previewCard.classList.remove('d-none'); - document.getElementById('replace-cover-btn').disabled = false; + + const replaceBtn = document.getElementById('replace-cover-btn'); + if (replaceBtn) { + replaceBtn.disabled = false; + const form = replaceBtn.closest('form'); + if (form) { + form.action = `/scene/{{ scene.slug }}/replace_cover_from_preview`; + } + } + } else { + alert('Save failed: ' + data.error); } } catch (err) { console.error(err); + alert('Finalize request failed'); } finally { progressContainer.classList.add('d-none'); } } }); + // Image modal function function showImage(src) { document.getElementById('modalImage').src = src; } diff --git a/templates/scenes/index.html b/templates/scenes/index.html index ef07e5b..d2cc9ad 100644 --- a/templates/scenes/index.html +++ b/templates/scenes/index.html @@ -5,9 +5,14 @@

Scene Gallery

+
+
+ + +
Create New Scene
@@ -18,11 +23,27 @@
-
Batch Generating Scenes...
-
-
0%
+
+
Batch Generating Scenes...
+ Starting... +
+ +
+ Overall Batch Progress +
+
+
+
+ +
+
+ + +
+
+
+
-

@@ -61,22 +82,60 @@ {% endblock %} diff --git a/templates/settings.html b/templates/settings.html index e32bd3a..ac98553 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -4,31 +4,77 @@
-
-
Application Settings
+
+
+
Application Settings
+ LLM Configuration +
-
LLM Configuration (OpenRouter)
- -
- -
- - -
-
Required for AI text generation features.
-
- -
- - + + + -
Click "Connect" above to load the latest available models.
+
Choose where your AI text generation requests are processed.
-
- +
+ + +
+
OpenRouter Configuration
+
+ +
+ + +
+
Get your key at openrouter.ai
+
+ +
+ + +
+
+ + +
+
Local LLM Configuration
+
+ +
+ + +
+
+ Ollama default: http://localhost:11434/v1
+ LMStudio default: http://localhost:1234/v1 +
+
+ +
+ + +
Ensure your local LLM server is running and API is enabled.
+
+
+ +
+
@@ -41,54 +87,108 @@ {% block scripts %}