Merge pull request 'Added style browser.' (#4) from style-browser into master
Reviewed-on: #4
This commit is contained in:
@@ -1,43 +1,51 @@
|
|||||||
# Feature Development Guide: Gallery Pages & Character Integration
|
# Feature Development Guide: Gallery Pages & Character Integration
|
||||||
|
|
||||||
This guide outlines the architectural patterns and best practices developed during the implementation of the **Actions** and **Outfits** galleries. Use this as a blueprint for adding similar features (e.g., "Scenes", "Props", "Effects").
|
This guide outlines the architectural patterns and best practices developed during the implementation of the **Actions**, **Outfits**, and **Styles** galleries. Use this as a blueprint for adding similar features (e.g., "Scenes", "Props", "Effects").
|
||||||
|
|
||||||
## 1. Data Model & Persistence
|
## 1. Data Model & Persistence
|
||||||
- **Database Model:** Add a new class in `models.py`. Include `default_fields` (JSON) to support persistent prompt selections.
|
- **Database Model:** Add a new class in `models.py`. Include `default_fields` (JSON) to support persistent prompt selections.
|
||||||
- **JSON Sync:** Implement a `sync_[feature]()` function in `app.py` to keep the SQLite database in sync with the `data/[feature]/*.json` files.
|
- **JSON Sync:** Implement a `sync_[feature]()` function in `app.py` to keep the SQLite database in sync with the `data/[feature]/*.json` files.
|
||||||
- **Slugs:** Use URL-safe slugs generated from the ID for clean routing.
|
- **Slugs:** Use URL-safe slugs generated from the ID for clean routing.
|
||||||
|
|
||||||
## 2. Triple LoRA Chaining
|
## 2. Quadruple LoRA Chaining
|
||||||
Our workflow supports chaining three distinct LoRAs from specific directories:
|
Our workflow supports chaining up to four distinct LoRAs from specific directories:
|
||||||
1. **Character:** `Illustrious/Looks/` (Node 16)
|
1. **Character:** `Illustrious/Looks/` (Node 16)
|
||||||
2. **Outfit:** `Illustrious/Clothing/` (Node 17)
|
2. **Outfit:** `Illustrious/Clothing/` (Node 17)
|
||||||
3. **Action/Feature:** `Illustrious/Poses/` (Node 18)
|
3. **Action:** `Illustrious/Poses/` (Node 18)
|
||||||
|
4. **Style:** `Illustrious/Styles/` (Node 19)
|
||||||
|
|
||||||
**Implementation Detail:**
|
**Implementation Detail:**
|
||||||
In `_prepare_workflow`, LoRAs must be chained sequentially. If a previous LoRA is missing, the next one must "reach back" to the Checkpoint (Node 4) or the last valid node in the chain to maintain the model/CLIP connection.
|
In `_prepare_workflow`, LoRAs must be chained sequentially. If a previous LoRA is missing, the next one must "reach back" to the Checkpoint (Node 4) or the last valid node in the chain to maintain the model/CLIP connection. Node 19 is the terminal LoRA loader before terminal consumers (KSampler, Detailers).
|
||||||
|
|
||||||
## 3. Adetailer Routing
|
## 3. Style Prompt Construction
|
||||||
|
Artistic styles follow specific formatting rules in the `build_prompt` engine:
|
||||||
|
- **Artist Attribution:** Artist names are prefixed with "by " (e.g., "by Sabu").
|
||||||
|
- **Artistic Styles:** Raw descriptive style tags (e.g., "watercolor painting") are appended to the prompt.
|
||||||
|
- **Priority:** Style tags are applied after identity and wardrobe tags but before trigger words.
|
||||||
|
|
||||||
|
## 4. Adetailer Routing
|
||||||
To improve generation quality, route specific JSON sub-fields to targeted Adetailers:
|
To improve generation quality, route specific JSON sub-fields to targeted Adetailers:
|
||||||
- **Face Detailer (Node 14):** Receives `character_name`, `expression`, and action-specific `head`/`eyes` tags.
|
- **Face Detailer (Node 14):** Receives `character_name`, `expression`, and action-specific `head`/`eyes` tags.
|
||||||
- **Hand Detailer (Node 15):** Receives priority hand tags (Wardrobe Gloves > Wardrobe Hands > Identity Hands) and action-specific `arms`/`hands` tags.
|
- **Hand Detailer (Node 15):** Receives priority hand tags (Wardrobe Gloves > Wardrobe Hands > Identity Hands) and action-specific `arms`/`hands` tags.
|
||||||
|
|
||||||
## 4. character-Integrated Previews
|
## 5. Character-Integrated Previews
|
||||||
The "Killer Feature" is previewing a standalone item (like an Action or Outfit) on a specific character.
|
The "Killer Feature" is previewing a standalone item (like an Action, Outfit, or Style) on a specific character.
|
||||||
|
|
||||||
**Logic Flow:**
|
**Logic Flow:**
|
||||||
1. **Merge Data:** Copy `character.data`.
|
1. **Merge Data:** Copy `character.data`.
|
||||||
2. **Override/Merge:** Replace character `defaults` with feature-specific tags (e.g., Action pose overrides Character pose).
|
2. **Override/Merge:** Replace character `defaults` with feature-specific tags (e.g., Action pose overrides Character pose).
|
||||||
3. **Context Injection:** Append character-specific styles (e.g., `[primary_color] simple background`) to the main prompt.
|
3. **Context Injection:** Append character-specific styles (e.g., `[primary_color] simple background`) to the main prompt.
|
||||||
4. **Auto-Selection:** When a character is selected, ensure their `identity` and `wardrobe` fields are automatically included in the prompt, even if the feature page has its own manual checkboxes.
|
4. **Auto-Selection:** When a character is selected, ensure their essential identity and active wardrobe fields are automatically included in the prompt.
|
||||||
|
|
||||||
## 5. UI/UX Patterns
|
## 6. UI/UX Patterns
|
||||||
- **Selection Boxes:** Use checkboxes next to field labels to allow users to toggle specific tags.
|
- **Selection Boxes:** Use checkboxes next to field labels to allow users to toggle specific tags.
|
||||||
- **Default Selection:** Implement a "Save as Default Selection" button that persists the current checkbox state to the database.
|
- **Default Selection:** Implement a "Save as Default Selection" button that persists the current checkbox state to the database.
|
||||||
- **Session State:** Store the last selected character and field preferences in the Flask `session` to provide a seamless experience when navigating between items.
|
- **Session State:** Store the last selected character and field preferences in the Flask `session` to provide a seamless experience.
|
||||||
- **AJAX Generation:** Use the WebSocket + Polling hybrid pattern in the frontend to show real-time progress bars without page reloads.
|
- **AJAX Generation:** Use the WebSocket + Polling hybrid pattern in the frontend to show real-time progress bars without page reloads.
|
||||||
|
|
||||||
## 6. Directory Isolation
|
## 7. Directory Isolation
|
||||||
Always isolate LoRAs by purpose to prevent dropdown clutter:
|
Always isolate LoRAs by purpose to prevent dropdown clutter:
|
||||||
- `get_available_loras()` -> Characters
|
- `get_available_loras()` -> Characters
|
||||||
- `get_available_clothing_loras()` -> Outfits
|
- `get_available_clothing_loras()` -> Outfits
|
||||||
- `get_available_action_loras()` -> Actions/Poses
|
- `get_available_action_loras()` -> Actions/Poses
|
||||||
|
- `get_available_style_loras()` -> Styles
|
||||||
|
|||||||
725
app.py
725
app.py
@@ -5,8 +5,9 @@ import re
|
|||||||
import requests
|
import requests
|
||||||
import random
|
import random
|
||||||
from flask import Flask, render_template, request, redirect, url_for, flash, session
|
from flask import Flask, render_template, request, redirect, url_for, flash, session
|
||||||
|
from flask_session import Session
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
from models import db, Character, Settings, Outfit, Action
|
from models import db, Character, Settings, Outfit, Action, Style
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
||||||
@@ -16,12 +17,19 @@ app.config['SECRET_KEY'] = 'dev-key-123'
|
|||||||
app.config['CHARACTERS_DIR'] = 'data/characters'
|
app.config['CHARACTERS_DIR'] = 'data/characters'
|
||||||
app.config['CLOTHING_DIR'] = 'data/clothing'
|
app.config['CLOTHING_DIR'] = 'data/clothing'
|
||||||
app.config['ACTIONS_DIR'] = 'data/actions'
|
app.config['ACTIONS_DIR'] = 'data/actions'
|
||||||
|
app.config['STYLES_DIR'] = 'data/styles'
|
||||||
app.config['COMFYUI_URL'] = 'http://127.0.0.1:8188'
|
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['ILLUSTRIOUS_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Illustrious/'
|
||||||
app.config['NOOB_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Noob/'
|
app.config['NOOB_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Noob/'
|
||||||
app.config['LORA_DIR'] = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Looks/'
|
app.config['LORA_DIR'] = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Looks/'
|
||||||
|
|
||||||
|
# Server-side session configuration to avoid cookie size limits
|
||||||
|
app.config['SESSION_TYPE'] = 'filesystem'
|
||||||
|
app.config['SESSION_FILE_DIR'] = os.path.join(app.config['UPLOAD_FOLDER'], '../flask_session')
|
||||||
|
app.config['SESSION_PERMANENT'] = False
|
||||||
|
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
|
Session(app)
|
||||||
|
|
||||||
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
|
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
|
||||||
|
|
||||||
@@ -54,6 +62,16 @@ def get_available_action_loras():
|
|||||||
loras.append(f"Illustrious/Poses/{f}")
|
loras.append(f"Illustrious/Poses/{f}")
|
||||||
return sorted(loras)
|
return sorted(loras)
|
||||||
|
|
||||||
|
def get_available_style_loras():
|
||||||
|
"""Get LoRAs from the Styles directory for style LoRAs."""
|
||||||
|
styles_lora_dir = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Styles/'
|
||||||
|
loras = []
|
||||||
|
if os.path.exists(styles_lora_dir):
|
||||||
|
for f in os.listdir(styles_lora_dir):
|
||||||
|
if f.endswith('.safetensors'):
|
||||||
|
loras.append(f"Illustrious/Styles/{f}")
|
||||||
|
return sorted(loras)
|
||||||
|
|
||||||
def get_available_checkpoints():
|
def get_available_checkpoints():
|
||||||
checkpoints = []
|
checkpoints = []
|
||||||
|
|
||||||
@@ -99,6 +117,7 @@ def build_prompt(data, selected_fields=None, default_fields=None, active_outfit=
|
|||||||
|
|
||||||
defaults = data.get('defaults', {})
|
defaults = data.get('defaults', {})
|
||||||
action_data = data.get('action', {})
|
action_data = data.get('action', {})
|
||||||
|
style_data = data.get('style', {})
|
||||||
|
|
||||||
# Pre-calculate Hand/Glove priority
|
# Pre-calculate Hand/Glove priority
|
||||||
# Priority: wardrobe gloves > wardrobe hands (outfit) > identity hands (character)
|
# Priority: wardrobe gloves > wardrobe hands (outfit) > identity hands (character)
|
||||||
@@ -137,9 +156,16 @@ def build_prompt(data, selected_fields=None, default_fields=None, active_outfit=
|
|||||||
if val and is_selected('wardrobe', key):
|
if val and is_selected('wardrobe', key):
|
||||||
parts.append(val)
|
parts.append(val)
|
||||||
|
|
||||||
style = data.get('styles', {}).get('aesthetic')
|
# Standard character styles
|
||||||
if style and is_selected('styles', 'aesthetic'):
|
char_aesthetic = data.get('styles', {}).get('aesthetic')
|
||||||
parts.append(f"{style} style")
|
if char_aesthetic and is_selected('styles', 'aesthetic'):
|
||||||
|
parts.append(f"{char_aesthetic} style")
|
||||||
|
|
||||||
|
# New Styles Gallery logic
|
||||||
|
if style_data.get('artist_name') and is_selected('style', 'artist_name'):
|
||||||
|
parts.append(f"by {style_data['artist_name']}")
|
||||||
|
if style_data.get('artistic_style') and is_selected('style', 'artistic_style'):
|
||||||
|
parts.append(style_data['artistic_style'])
|
||||||
|
|
||||||
tags = data.get('tags', [])
|
tags = data.get('tags', [])
|
||||||
if tags and is_selected('special', 'tags'):
|
if tags and is_selected('special', 'tags'):
|
||||||
@@ -365,6 +391,63 @@ def sync_actions():
|
|||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
def sync_styles():
|
||||||
|
if not os.path.exists(app.config['STYLES_DIR']):
|
||||||
|
return
|
||||||
|
|
||||||
|
current_ids = []
|
||||||
|
|
||||||
|
for filename in os.listdir(app.config['STYLES_DIR']):
|
||||||
|
if filename.endswith('.json'):
|
||||||
|
file_path = os.path.join(app.config['STYLES_DIR'], filename)
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
style_id = data.get('style_id') or filename.replace('.json', '')
|
||||||
|
|
||||||
|
current_ids.append(style_id)
|
||||||
|
|
||||||
|
# Generate URL-safe slug
|
||||||
|
slug = re.sub(r'[^a-zA-Z0-9_]', '', style_id)
|
||||||
|
|
||||||
|
# Check if style already exists
|
||||||
|
style = Style.query.filter_by(style_id=style_id).first()
|
||||||
|
name = data.get('style_name', style_id.replace('_', ' ').title())
|
||||||
|
|
||||||
|
if style:
|
||||||
|
style.data = data
|
||||||
|
style.name = name
|
||||||
|
style.slug = slug
|
||||||
|
style.filename = filename
|
||||||
|
|
||||||
|
# Check if cover image still exists
|
||||||
|
if style.image_path:
|
||||||
|
full_img_path = os.path.join(app.config['UPLOAD_FOLDER'], style.image_path)
|
||||||
|
if not os.path.exists(full_img_path):
|
||||||
|
print(f"Image missing for {style.name}, clearing path.")
|
||||||
|
style.image_path = None
|
||||||
|
|
||||||
|
flag_modified(style, "data")
|
||||||
|
else:
|
||||||
|
new_style = Style(
|
||||||
|
style_id=style_id,
|
||||||
|
slug=slug,
|
||||||
|
filename=filename,
|
||||||
|
name=name,
|
||||||
|
data=data
|
||||||
|
)
|
||||||
|
db.session.add(new_style)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error importing style {filename}: {e}")
|
||||||
|
|
||||||
|
# Remove styles that are no longer in the folder
|
||||||
|
all_styles = Style.query.all()
|
||||||
|
for style in all_styles:
|
||||||
|
if style.style_id not in current_ids:
|
||||||
|
db.session.delete(style)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
def call_llm(prompt, system_prompt="You are a creative assistant."):
|
def call_llm(prompt, system_prompt="You are a creative assistant."):
|
||||||
settings = Settings.query.first()
|
settings = Settings.query.first()
|
||||||
if not settings or not settings.openrouter_api_key:
|
if not settings or not settings.openrouter_api_key:
|
||||||
@@ -955,6 +1038,7 @@ def finalize_generation(slug, prompt_id):
|
|||||||
# Handle actions - always save as preview
|
# Handle actions - always save as preview
|
||||||
relative_path = f"characters/{slug}/{filename}"
|
relative_path = f"characters/{slug}/{filename}"
|
||||||
session[f'preview_{slug}'] = relative_path
|
session[f'preview_{slug}'] = relative_path
|
||||||
|
session.modified = True # Ensure session is saved for JSON response
|
||||||
|
|
||||||
# If action is 'replace', also update the character's cover image immediately
|
# If action is 'replace', also update the character's cover image immediately
|
||||||
if action == 'replace':
|
if action == 'replace':
|
||||||
@@ -982,7 +1066,7 @@ def replace_cover_from_preview(slug):
|
|||||||
|
|
||||||
return redirect(url_for('detail', slug=slug))
|
return redirect(url_for('detail', slug=slug))
|
||||||
|
|
||||||
def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_negative=None, outfit=None, action=None):
|
def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_negative=None, outfit=None, action=None, style=None):
|
||||||
# 1. Update prompts using replacement to preserve embeddings
|
# 1. Update prompts using replacement to preserve embeddings
|
||||||
workflow["6"]["inputs"]["text"] = workflow["6"]["inputs"]["text"].replace("{{POSITIVE_PROMPT}}", prompts["main"])
|
workflow["6"]["inputs"]["text"] = workflow["6"]["inputs"]["text"].replace("{{POSITIVE_PROMPT}}", prompts["main"])
|
||||||
|
|
||||||
@@ -1007,7 +1091,7 @@ def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_nega
|
|||||||
if checkpoint:
|
if checkpoint:
|
||||||
workflow["4"]["inputs"]["ckpt_name"] = checkpoint
|
workflow["4"]["inputs"]["ckpt_name"] = checkpoint
|
||||||
|
|
||||||
# 3. Handle LoRAs - Node 16 for character, Node 17 for outfit, Node 18 for action
|
# 3. Handle LoRAs - Node 16 for character, Node 17 for outfit, Node 18 for action, Node 19 for style
|
||||||
# Start with direct checkpoint connections
|
# Start with direct checkpoint connections
|
||||||
model_source = ["4", 0]
|
model_source = ["4", 0]
|
||||||
clip_source = ["4", 1]
|
clip_source = ["4", 1]
|
||||||
@@ -1056,6 +1140,21 @@ def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_nega
|
|||||||
clip_source = ["18", 1]
|
clip_source = ["18", 1]
|
||||||
print(f"Action LoRA: {action_lora_name} @ {action_lora_data.get('lora_weight', 1.0)}")
|
print(f"Action LoRA: {action_lora_name} @ {action_lora_data.get('lora_weight', 1.0)}")
|
||||||
|
|
||||||
|
# Style LoRA (Node 19) - chains from previous LoRA or checkpoint
|
||||||
|
style_lora_data = style.data.get('lora', {}) if style else {}
|
||||||
|
style_lora_name = style_lora_data.get('lora_name')
|
||||||
|
|
||||||
|
if style_lora_name and "19" in workflow:
|
||||||
|
workflow["19"]["inputs"]["lora_name"] = style_lora_name
|
||||||
|
workflow["19"]["inputs"]["strength_model"] = style_lora_data.get('lora_weight', 1.0)
|
||||||
|
workflow["19"]["inputs"]["strength_clip"] = style_lora_data.get('lora_weight', 1.0)
|
||||||
|
# Chain from previous source
|
||||||
|
workflow["19"]["inputs"]["model"] = model_source
|
||||||
|
workflow["19"]["inputs"]["clip"] = clip_source
|
||||||
|
model_source = ["19", 0]
|
||||||
|
clip_source = ["19", 1]
|
||||||
|
print(f"Style LoRA: {style_lora_name} @ {style_lora_data.get('lora_weight', 1.0)}")
|
||||||
|
|
||||||
# Apply connections to all model/clip consumers
|
# Apply connections to all model/clip consumers
|
||||||
workflow["3"]["inputs"]["model"] = model_source
|
workflow["3"]["inputs"]["model"] = model_source
|
||||||
workflow["11"]["inputs"]["model"] = model_source
|
workflow["11"]["inputs"]["model"] = model_source
|
||||||
@@ -1224,6 +1323,32 @@ def save_defaults(slug):
|
|||||||
flash('Default prompt selection saved for this character!')
|
flash('Default prompt selection saved for this character!')
|
||||||
return redirect(url_for('detail', slug=slug))
|
return redirect(url_for('detail', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/get_missing_outfits')
|
||||||
|
def get_missing_outfits():
|
||||||
|
missing = Outfit.query.filter((Outfit.image_path == None) | (Outfit.image_path == '')).all()
|
||||||
|
return {'missing': [{'slug': o.slug, 'name': o.name} for o in missing]}
|
||||||
|
|
||||||
|
@app.route('/clear_all_outfit_covers', methods=['POST'])
|
||||||
|
def clear_all_outfit_covers():
|
||||||
|
outfits = Outfit.query.all()
|
||||||
|
for outfit in outfits:
|
||||||
|
outfit.image_path = None
|
||||||
|
db.session.commit()
|
||||||
|
return {'success': True}
|
||||||
|
|
||||||
|
@app.route('/get_missing_actions')
|
||||||
|
def get_missing_actions():
|
||||||
|
missing = Action.query.filter((Action.image_path == None) | (Action.image_path == '')).all()
|
||||||
|
return {'missing': [{'slug': a.slug, 'name': a.name} for a in missing]}
|
||||||
|
|
||||||
|
@app.route('/clear_all_action_covers', methods=['POST'])
|
||||||
|
def clear_all_action_covers():
|
||||||
|
actions = Action.query.all()
|
||||||
|
for action in actions:
|
||||||
|
action.image_path = None
|
||||||
|
db.session.commit()
|
||||||
|
return {'success': True}
|
||||||
|
|
||||||
# ============ OUTFIT ROUTES ============
|
# ============ OUTFIT ROUTES ============
|
||||||
|
|
||||||
@app.route('/outfits')
|
@app.route('/outfits')
|
||||||
@@ -1483,6 +1608,7 @@ def finalize_outfit_generation(slug, prompt_id):
|
|||||||
# Always save as preview
|
# Always save as preview
|
||||||
relative_path = f"outfits/{slug}/{filename}"
|
relative_path = f"outfits/{slug}/{filename}"
|
||||||
session[f'preview_outfit_{slug}'] = relative_path
|
session[f'preview_outfit_{slug}'] = relative_path
|
||||||
|
session.modified = True # Ensure session is saved for JSON response
|
||||||
|
|
||||||
return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')}
|
return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')}
|
||||||
|
|
||||||
@@ -1705,63 +1831,6 @@ def clone_outfit(slug):
|
|||||||
flash(f'Outfit cloned as "{new_id}"!')
|
flash(f'Outfit cloned as "{new_id}"!')
|
||||||
return redirect(url_for('outfit_detail', slug=new_slug))
|
return redirect(url_for('outfit_detail', slug=new_slug))
|
||||||
|
|
||||||
def sync_actions():
|
|
||||||
if not os.path.exists(app.config['ACTIONS_DIR']):
|
|
||||||
return
|
|
||||||
|
|
||||||
current_ids = []
|
|
||||||
|
|
||||||
for filename in os.listdir(app.config['ACTIONS_DIR']):
|
|
||||||
if filename.endswith('.json'):
|
|
||||||
file_path = os.path.join(app.config['ACTIONS_DIR'], filename)
|
|
||||||
try:
|
|
||||||
with open(file_path, 'r') as f:
|
|
||||||
data = json.load(f)
|
|
||||||
action_id = data.get('action_id') or filename.replace('.json', '')
|
|
||||||
|
|
||||||
current_ids.append(action_id)
|
|
||||||
|
|
||||||
# Generate URL-safe slug
|
|
||||||
slug = re.sub(r'[^a-zA-Z0-9_]', '', action_id)
|
|
||||||
|
|
||||||
# Check if action already exists
|
|
||||||
action = Action.query.filter_by(action_id=action_id).first()
|
|
||||||
name = data.get('action_name', action_id.replace('_', ' ').title())
|
|
||||||
|
|
||||||
if action:
|
|
||||||
action.data = data
|
|
||||||
action.name = name
|
|
||||||
action.slug = slug
|
|
||||||
action.filename = filename
|
|
||||||
|
|
||||||
# Check if cover image still exists
|
|
||||||
if action.image_path:
|
|
||||||
full_img_path = os.path.join(app.config['UPLOAD_FOLDER'], action.image_path)
|
|
||||||
if not os.path.exists(full_img_path):
|
|
||||||
print(f"Image missing for {action.name}, clearing path.")
|
|
||||||
action.image_path = None
|
|
||||||
|
|
||||||
flag_modified(action, "data")
|
|
||||||
else:
|
|
||||||
new_action = Action(
|
|
||||||
action_id=action_id,
|
|
||||||
slug=slug,
|
|
||||||
filename=filename,
|
|
||||||
name=name,
|
|
||||||
data=data
|
|
||||||
)
|
|
||||||
db.session.add(new_action)
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error importing action {filename}: {e}")
|
|
||||||
|
|
||||||
# Remove actions that are no longer in the folder
|
|
||||||
all_actions = Action.query.all()
|
|
||||||
for action in all_actions:
|
|
||||||
if action.action_id not in current_ids:
|
|
||||||
db.session.delete(action)
|
|
||||||
|
|
||||||
db.session.commit()
|
|
||||||
|
|
||||||
# ============ ACTION ROUTES ============
|
# ============ ACTION ROUTES ============
|
||||||
|
|
||||||
@app.route('/actions')
|
@app.route('/actions')
|
||||||
@@ -2070,6 +2139,7 @@ def finalize_action_generation(slug, prompt_id):
|
|||||||
# Always save as preview
|
# Always save as preview
|
||||||
relative_path = f"actions/{slug}/{filename}"
|
relative_path = f"actions/{slug}/{filename}"
|
||||||
session[f'preview_action_{slug}'] = relative_path
|
session[f'preview_action_{slug}'] = relative_path
|
||||||
|
session.modified = True # Ensure session is saved for JSON response
|
||||||
|
|
||||||
return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')}
|
return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')}
|
||||||
|
|
||||||
@@ -2237,6 +2307,534 @@ def clone_action(slug):
|
|||||||
flash(f'Action cloned as "{new_id}"!')
|
flash(f'Action cloned as "{new_id}"!')
|
||||||
return redirect(url_for('action_detail', slug=new_slug))
|
return redirect(url_for('action_detail', slug=new_slug))
|
||||||
|
|
||||||
|
# ============ STYLE ROUTES ============
|
||||||
|
|
||||||
|
@app.route('/styles')
|
||||||
|
def styles_index():
|
||||||
|
styles = Style.query.order_by(Style.name).all()
|
||||||
|
return render_template('styles/index.html', styles=styles)
|
||||||
|
|
||||||
|
@app.route('/styles/rescan', methods=['POST'])
|
||||||
|
def rescan_styles():
|
||||||
|
sync_styles()
|
||||||
|
flash('Database synced with style files.')
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>')
|
||||||
|
def style_detail(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
characters = Character.query.order_by(Character.name).all()
|
||||||
|
|
||||||
|
# Load state from session
|
||||||
|
preferences = session.get(f'prefs_style_{slug}')
|
||||||
|
preview_image = session.get(f'preview_style_{slug}')
|
||||||
|
selected_character = session.get(f'char_style_{slug}')
|
||||||
|
|
||||||
|
return render_template('styles/detail.html', style=style, characters=characters,
|
||||||
|
preferences=preferences, preview_image=preview_image,
|
||||||
|
selected_character=selected_character)
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/edit', methods=['GET', 'POST'])
|
||||||
|
def edit_style(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
loras = get_available_style_loras()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
try:
|
||||||
|
# 1. Update basic fields
|
||||||
|
style.name = request.form.get('style_name')
|
||||||
|
|
||||||
|
# 2. Rebuild the data dictionary
|
||||||
|
new_data = style.data.copy()
|
||||||
|
new_data['style_name'] = style.name
|
||||||
|
|
||||||
|
# Update style section
|
||||||
|
if 'style' in new_data:
|
||||||
|
for key in new_data['style'].keys():
|
||||||
|
form_key = f"style_{key}"
|
||||||
|
if form_key in request.form:
|
||||||
|
new_data['style'][key] = request.form.get(form_key)
|
||||||
|
|
||||||
|
# Update lora section
|
||||||
|
if 'lora' in new_data:
|
||||||
|
for key in new_data['lora'].keys():
|
||||||
|
form_key = f"lora_{key}"
|
||||||
|
if form_key in request.form:
|
||||||
|
val = request.form.get(form_key)
|
||||||
|
if key == 'lora_weight':
|
||||||
|
try: val = float(val)
|
||||||
|
except: val = 1.0
|
||||||
|
new_data['lora'][key] = val
|
||||||
|
|
||||||
|
style.data = new_data
|
||||||
|
flag_modified(style, "data")
|
||||||
|
|
||||||
|
# 3. Write back to JSON file
|
||||||
|
style_file = style.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', style.style_id)}.json"
|
||||||
|
file_path = os.path.join(app.config['STYLES_DIR'], style_file)
|
||||||
|
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(new_data, f, indent=2)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
flash('Style updated successfully!')
|
||||||
|
return redirect(url_for('style_detail', slug=slug))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Edit error: {e}")
|
||||||
|
flash(f"Error saving changes: {str(e)}")
|
||||||
|
|
||||||
|
return render_template('styles/edit.html', style=style, loras=loras)
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/upload', methods=['POST'])
|
||||||
|
def upload_style_image(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
|
||||||
|
if 'image' not in request.files:
|
||||||
|
flash('No file part')
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
file = request.files['image']
|
||||||
|
if file.filename == '':
|
||||||
|
flash('No selected file')
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
if file and allowed_file(file.filename):
|
||||||
|
# Create style subfolder
|
||||||
|
style_folder = os.path.join(app.config['UPLOAD_FOLDER'], f"styles/{slug}")
|
||||||
|
os.makedirs(style_folder, exist_ok=True)
|
||||||
|
|
||||||
|
filename = secure_filename(file.filename)
|
||||||
|
file_path = os.path.join(style_folder, filename)
|
||||||
|
file.save(file_path)
|
||||||
|
|
||||||
|
# Store relative path in DB
|
||||||
|
style.image_path = f"styles/{slug}/{filename}"
|
||||||
|
db.session.commit()
|
||||||
|
flash('Image uploaded successfully!')
|
||||||
|
|
||||||
|
return redirect(url_for('style_detail', slug=slug))
|
||||||
|
|
||||||
|
def _queue_style_generation(style_obj, character=None, selected_fields=None, client_id=None):
|
||||||
|
if character:
|
||||||
|
combined_data = character.data.copy()
|
||||||
|
combined_data['character_id'] = character.character_id
|
||||||
|
combined_data['style'] = style_obj.data.get('style', {})
|
||||||
|
|
||||||
|
# Merge style lora triggers if present
|
||||||
|
style_lora = style_obj.data.get('lora', {})
|
||||||
|
if style_lora.get('lora_triggers'):
|
||||||
|
if 'lora' not in combined_data: combined_data['lora'] = {}
|
||||||
|
combined_data['lora']['lora_triggers'] = f"{combined_data['lora'].get('lora_triggers', '')}, {style_lora['lora_triggers']}"
|
||||||
|
|
||||||
|
# Merge character identity and wardrobe fields into selected_fields
|
||||||
|
if selected_fields:
|
||||||
|
# Add character identity fields to selection if not already present
|
||||||
|
for key in ['base_specs', 'hair', 'eyes', 'hands', 'arms', 'torso', 'pelvis', 'legs', 'feet', 'extra']:
|
||||||
|
if character.data.get('identity', {}).get(key):
|
||||||
|
field_key = f'identity::{key}'
|
||||||
|
if field_key not in selected_fields:
|
||||||
|
selected_fields.append(field_key)
|
||||||
|
|
||||||
|
# Always include character name
|
||||||
|
if 'special::name' not in selected_fields:
|
||||||
|
selected_fields.append('special::name')
|
||||||
|
|
||||||
|
# Add active wardrobe fields
|
||||||
|
wardrobe = character.get_active_wardrobe()
|
||||||
|
for key in ['full_body', 'headwear', 'top', 'bottom', 'legwear', 'footwear', 'hands', 'gloves', 'accessories']:
|
||||||
|
if wardrobe.get(key):
|
||||||
|
field_key = f'wardrobe::{key}'
|
||||||
|
if field_key not in selected_fields:
|
||||||
|
selected_fields.append(field_key)
|
||||||
|
else:
|
||||||
|
# Auto-include essential character fields
|
||||||
|
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')
|
||||||
|
|
||||||
|
# Add active wardrobe
|
||||||
|
wardrobe = character.get_active_wardrobe()
|
||||||
|
for key in ['full_body', 'top', 'bottom']:
|
||||||
|
if wardrobe.get(key):
|
||||||
|
selected_fields.append(f'wardrobe::{key}')
|
||||||
|
|
||||||
|
# Add style fields
|
||||||
|
selected_fields.extend(['style::artist_name', 'style::artistic_style', 'lora::lora_triggers'])
|
||||||
|
|
||||||
|
default_fields = style_obj.default_fields
|
||||||
|
active_outfit = character.active_outfit
|
||||||
|
else:
|
||||||
|
combined_data = {
|
||||||
|
'character_id': style_obj.style_id,
|
||||||
|
'style': style_obj.data.get('style', {}),
|
||||||
|
'lora': style_obj.data.get('lora', {}),
|
||||||
|
'tags': style_obj.data.get('tags', [])
|
||||||
|
}
|
||||||
|
if not selected_fields:
|
||||||
|
selected_fields = ['style::artist_name', 'style::artistic_style', 'lora::lora_triggers']
|
||||||
|
default_fields = style_obj.default_fields
|
||||||
|
active_outfit = 'default'
|
||||||
|
|
||||||
|
with open('comfy_workflow.json', 'r') as f:
|
||||||
|
workflow = json.load(f)
|
||||||
|
|
||||||
|
prompts = build_prompt(combined_data, selected_fields, default_fields, active_outfit=active_outfit)
|
||||||
|
|
||||||
|
if character:
|
||||||
|
primary_color = character.data.get('styles', {}).get('primary_color', '')
|
||||||
|
if primary_color:
|
||||||
|
prompts["main"] = f"{prompts['main']}, {primary_color} simple background"
|
||||||
|
else:
|
||||||
|
prompts["main"] = f"{prompts['main']}, simple background"
|
||||||
|
else:
|
||||||
|
prompts["main"] = f"{prompts['main']}, simple background"
|
||||||
|
|
||||||
|
workflow = _prepare_workflow(workflow, character, prompts, style=style_obj)
|
||||||
|
return queue_prompt(workflow, client_id=client_id)
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/generate', methods=['POST'])
|
||||||
|
def generate_style_image(slug):
|
||||||
|
style_obj = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Get action type
|
||||||
|
action = request.form.get('action', 'preview')
|
||||||
|
client_id = request.form.get('client_id')
|
||||||
|
|
||||||
|
# Get selected fields
|
||||||
|
selected_fields = request.form.getlist('include_field')
|
||||||
|
|
||||||
|
# Get selected character (if any)
|
||||||
|
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()
|
||||||
|
|
||||||
|
# Save preferences
|
||||||
|
session[f'char_style_{slug}'] = character_slug
|
||||||
|
session[f'prefs_style_{slug}'] = selected_fields
|
||||||
|
|
||||||
|
# Queue generation using helper
|
||||||
|
prompt_response = _queue_style_generation(style_obj, character, selected_fields, 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('style_detail', slug=slug))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"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('style_detail', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/finalize_generation/<prompt_id>', methods=['POST'])
|
||||||
|
def finalize_style_generation(slug, prompt_id):
|
||||||
|
style_obj = Style.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'])
|
||||||
|
|
||||||
|
style_folder = os.path.join(app.config['UPLOAD_FOLDER'], f"styles/{slug}")
|
||||||
|
os.makedirs(style_folder, exist_ok=True)
|
||||||
|
|
||||||
|
filename = f"gen_{int(time.time())}.png"
|
||||||
|
file_path = os.path.join(style_folder, filename)
|
||||||
|
with open(file_path, 'wb') as f:
|
||||||
|
f.write(image_data)
|
||||||
|
|
||||||
|
relative_path = f"styles/{slug}/{filename}"
|
||||||
|
session[f'preview_style_{slug}'] = relative_path
|
||||||
|
session.modified = True # Ensure session is saved for JSON response
|
||||||
|
|
||||||
|
# If action is 'replace', also update the style's cover image immediately
|
||||||
|
if action == 'replace':
|
||||||
|
style_obj.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 error: {e}")
|
||||||
|
return {'error': str(e)}, 500
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/save_defaults', methods=['POST'])
|
||||||
|
def save_style_defaults(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
selected_fields = request.form.getlist('include_field')
|
||||||
|
style.default_fields = selected_fields
|
||||||
|
db.session.commit()
|
||||||
|
flash('Default prompt selection saved for this style!')
|
||||||
|
return redirect(url_for('style_detail', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/replace_cover_from_preview', methods=['POST'])
|
||||||
|
def replace_style_cover_from_preview(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
preview_path = session.get(f'preview_style_{slug}')
|
||||||
|
|
||||||
|
if preview_path:
|
||||||
|
style.image_path = preview_path
|
||||||
|
db.session.commit()
|
||||||
|
flash('Cover image updated from preview!')
|
||||||
|
else:
|
||||||
|
flash('No preview image available', 'error')
|
||||||
|
|
||||||
|
return redirect(url_for('style_detail', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/get_missing_styles')
|
||||||
|
def get_missing_styles():
|
||||||
|
missing = Style.query.filter((Style.image_path == None) | (Style.image_path == '')).all()
|
||||||
|
return {'missing': [{'slug': s.slug, 'name': s.name} for s in missing]}
|
||||||
|
|
||||||
|
@app.route('/clear_all_style_covers', methods=['POST'])
|
||||||
|
def clear_all_style_covers():
|
||||||
|
styles = Style.query.all()
|
||||||
|
for style in styles:
|
||||||
|
style.image_path = None
|
||||||
|
db.session.commit()
|
||||||
|
return {'success': True}
|
||||||
|
|
||||||
|
@app.route('/styles/generate_missing', methods=['POST'])
|
||||||
|
def generate_missing_styles():
|
||||||
|
def get_missing_count():
|
||||||
|
return Style.query.filter((Style.image_path == None) | (Style.image_path == '')).count()
|
||||||
|
|
||||||
|
if get_missing_count() == 0:
|
||||||
|
flash("No styles missing cover images.")
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
# Get all characters once to pick from
|
||||||
|
all_characters = Character.query.all()
|
||||||
|
if not all_characters:
|
||||||
|
flash("No characters available to preview styles with.", "error")
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
success_count = 0
|
||||||
|
|
||||||
|
while get_missing_count() > 0:
|
||||||
|
style_obj = Style.query.filter((Style.image_path == None) | (Style.image_path == '')).order_by(Style.name).first()
|
||||||
|
if not style_obj: break
|
||||||
|
|
||||||
|
# Pick a random character for each style for variety
|
||||||
|
character = random.choice(all_characters)
|
||||||
|
|
||||||
|
style_slug = style_obj.slug
|
||||||
|
try:
|
||||||
|
print(f"Batch generating style: {style_obj.name} with character {character.name}")
|
||||||
|
prompt_response = _queue_style_generation(style_obj, character=character)
|
||||||
|
prompt_id = prompt_response['prompt_id']
|
||||||
|
|
||||||
|
max_retries = 120
|
||||||
|
while max_retries > 0:
|
||||||
|
history = get_history(prompt_id)
|
||||||
|
if prompt_id in history:
|
||||||
|
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'])
|
||||||
|
|
||||||
|
style_folder = os.path.join(app.config['UPLOAD_FOLDER'], f"styles/{style_slug}")
|
||||||
|
os.makedirs(style_folder, exist_ok=True)
|
||||||
|
filename = f"gen_{int(time.time())}.png"
|
||||||
|
file_path = os.path.join(style_folder, filename)
|
||||||
|
with open(file_path, 'wb') as f:
|
||||||
|
f.write(image_data)
|
||||||
|
|
||||||
|
style_to_update = Style.query.filter_by(slug=style_slug).first()
|
||||||
|
if style_to_update:
|
||||||
|
style_to_update.image_path = f"styles/{style_slug}/{filename}"
|
||||||
|
db.session.commit()
|
||||||
|
success_count += 1
|
||||||
|
break
|
||||||
|
break
|
||||||
|
time.sleep(2)
|
||||||
|
max_retries -= 1
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error generating for style {style_obj.name}: {e}")
|
||||||
|
db.session.rollback()
|
||||||
|
|
||||||
|
flash(f"Batch style generation complete. Generated {success_count} images.")
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
@app.route('/styles/bulk_create', methods=['POST'])
|
||||||
|
def bulk_create_styles_from_loras():
|
||||||
|
styles_lora_dir = '/mnt/alexander/AITools/Image Models/lora/Illustrious/Styles/'
|
||||||
|
if not os.path.exists(styles_lora_dir):
|
||||||
|
flash('Styles LoRA directory not found.', 'error')
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
created_count = 0
|
||||||
|
skipped_count = 0
|
||||||
|
|
||||||
|
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):
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(json_path, 'w') as f:
|
||||||
|
json.dump(style_data, f, indent=2)
|
||||||
|
created_count += 1
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error creating style for {filename}: {e}")
|
||||||
|
|
||||||
|
if created_count > 0:
|
||||||
|
sync_styles()
|
||||||
|
flash(f'Successfully created {created_count} new styles from LoRAs. (Skipped {skipped_count} existing)')
|
||||||
|
else:
|
||||||
|
flash(f'No new styles created. {skipped_count} existing styles found.')
|
||||||
|
|
||||||
|
return redirect(url_for('styles_index'))
|
||||||
|
|
||||||
|
@app.route('/style/create', methods=['GET', 'POST'])
|
||||||
|
def create_style():
|
||||||
|
if request.method == 'POST':
|
||||||
|
name = request.form.get('name')
|
||||||
|
slug = request.form.get('filename', '').strip()
|
||||||
|
|
||||||
|
if not slug:
|
||||||
|
slug = re.sub(r'[^a-zA-Z0-9]+', '_', name.lower()).strip('_')
|
||||||
|
|
||||||
|
safe_slug = re.sub(r'[^a-zA-Z0-9_]', '', slug)
|
||||||
|
if not safe_slug:
|
||||||
|
safe_slug = 'style'
|
||||||
|
|
||||||
|
base_slug = safe_slug
|
||||||
|
counter = 1
|
||||||
|
while os.path.exists(os.path.join(app.config['STYLES_DIR'], f"{safe_slug}.json")):
|
||||||
|
safe_slug = f"{base_slug}_{counter}"
|
||||||
|
counter += 1
|
||||||
|
|
||||||
|
style_data = {
|
||||||
|
"style_id": safe_slug,
|
||||||
|
"style_name": name,
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
file_path = os.path.join(app.config['STYLES_DIR'], f"{safe_slug}.json")
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(style_data, f, indent=2)
|
||||||
|
|
||||||
|
new_style = Style(
|
||||||
|
style_id=safe_slug, slug=safe_slug, filename=f"{safe_slug}.json",
|
||||||
|
name=name, data=style_data
|
||||||
|
)
|
||||||
|
db.session.add(new_style)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
flash('Style created successfully!')
|
||||||
|
return redirect(url_for('style_detail', slug=safe_slug))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Save error: {e}")
|
||||||
|
flash(f"Failed to create style: {e}")
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
return render_template('styles/create.html')
|
||||||
|
|
||||||
|
@app.route('/style/<path:slug>/clone', methods=['POST'])
|
||||||
|
def clone_style(slug):
|
||||||
|
style = Style.query.filter_by(slug=slug).first_or_404()
|
||||||
|
|
||||||
|
base_id = style.style_id
|
||||||
|
import re
|
||||||
|
match = re.match(r'^(.+?)_(\d+)$', base_id)
|
||||||
|
if match:
|
||||||
|
base_name = match.group(1)
|
||||||
|
current_num = int(match.group(2))
|
||||||
|
else:
|
||||||
|
base_name = base_id
|
||||||
|
current_num = 1
|
||||||
|
|
||||||
|
next_num = current_num + 1
|
||||||
|
while True:
|
||||||
|
new_id = f"{base_name}_{next_num:02d}"
|
||||||
|
new_filename = f"{new_id}.json"
|
||||||
|
new_path = os.path.join(app.config['STYLES_DIR'], new_filename)
|
||||||
|
if not os.path.exists(new_path):
|
||||||
|
break
|
||||||
|
next_num += 1
|
||||||
|
|
||||||
|
new_data = style.data.copy()
|
||||||
|
new_data['style_id'] = new_id
|
||||||
|
new_data['style_name'] = f"{style.name} (Copy)"
|
||||||
|
|
||||||
|
with open(new_path, 'w') as f:
|
||||||
|
json.dump(new_data, f, indent=2)
|
||||||
|
|
||||||
|
new_slug = re.sub(r'[^a-zA-Z0-9_]', '', new_id)
|
||||||
|
new_style = Style(
|
||||||
|
style_id=new_id, slug=new_slug, filename=new_filename,
|
||||||
|
name=new_data['style_name'], data=new_data
|
||||||
|
)
|
||||||
|
db.session.add(new_style)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
flash(f'Style cloned as "{new_id}"!')
|
||||||
|
return redirect(url_for('style_detail', slug=new_slug))
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
|
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
|
||||||
@@ -2269,4 +2867,5 @@ if __name__ == '__main__':
|
|||||||
sync_characters()
|
sync_characters()
|
||||||
sync_outfits()
|
sync_outfits()
|
||||||
sync_actions()
|
sync_actions()
|
||||||
|
sync_styles()
|
||||||
app.run(debug=True, port=5000)
|
app.run(debug=True, port=5000)
|
||||||
|
|||||||
@@ -189,5 +189,15 @@
|
|||||||
"clip": ["17", 1]
|
"clip": ["17", 1]
|
||||||
},
|
},
|
||||||
"class_type": "LoraLoader"
|
"class_type": "LoraLoader"
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "",
|
||||||
|
"strength_model": 1.0,
|
||||||
|
"strength_clip": 1.0,
|
||||||
|
"model": ["18", 0],
|
||||||
|
"clip": ["18", 1]
|
||||||
|
},
|
||||||
|
"class_type": "LoraLoader"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
data/styles/1233916_shdmn_belle.json
Normal file
13
data/styles/1233916_shdmn_belle.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "1233916_shdmn_belle",
|
||||||
|
"style_name": "Shadman Belle",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "shadman",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/1233916_shdmn-belle.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "1233916_shdmn-belle"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "3dstyle_v5_lyco_naieps075_came_cosine_1224b_0_06_6432conv3216_three_tags_final",
|
||||||
|
"style_name": "3D Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/3DStyle V5 Lyco NAIEps075 Came Cosine 1224b 0.06 6432conv3216 three tags final.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "3DStyle V5 Lyco NAIEps075 Came Cosine 1224b 0.06 6432conv3216 three tags final"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/3dvisualart1llust.json
Normal file
13
data/styles/3dvisualart1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "3dvisualart1llust",
|
||||||
|
"style_name": "3D Visual Art",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/3DVisualArt1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "3DVisualArt1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/748cmsdxl.json
Normal file
13
data/styles/748cmsdxl.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "748cmsdxl",
|
||||||
|
"style_name": "748cm",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "748cm",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/748cmSDXL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "748cm"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/748cmxl_il_lokr_v6311p_1321893.json
Normal file
13
data/styles/748cmxl_il_lokr_v6311p_1321893.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "748cmxl_il_lokr_v6311p_1321893",
|
||||||
|
"style_name": "748cm",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "748cm",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/748cmXL_il_lokr_V6311P_1321893.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": "748cmXL_il_lokr_V6311P_1321893"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/7b_style.json
Normal file
13
data/styles/7b_style.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "7b_style",
|
||||||
|
"style_name": "7B Dream",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "7b_Dream",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/7b-style.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "7b-style"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/__.json
Normal file
13
data/styles/__.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "__",
|
||||||
|
"style_name": "Ichika",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/\u58f1\u73c2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "\u58f1\u73c2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/____18.json
Normal file
13
data/styles/____18.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "____18",
|
||||||
|
"style_name": "Yuanfuji Okito 18",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/\u8881\u85e4\u6c96\u4eba18.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "\u8881\u85e4\u6c96\u4eba18"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_jukusei_kakuzatou__sugarbt___assorted_doujin_style_blend_illustrious",
|
||||||
|
"style_name": "Assorted Doujin Style Blend",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[Jukusei Kakuzatou (sugarBt)] Assorted Doujin Style Blend Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Jukusei Kakuzatou (sugarBt)] Assorted Doujin Style Blend Illustrious"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_pastime774__unique_job_tanetsuke_oji_san_o_kakutoku_shimashita_manga_style_illustrious",
|
||||||
|
"style_name": "Unique Job Tanetsuke Oji San O Kakutoku Shimashita Manga Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "pastime774",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[pastime774] Unique Job Tanetsuke Oji-san o Kakutoku shimashita Manga Style Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[pastime774] Unique Job Tanetsuke Oji-san o Kakutoku shimashita Manga Style Illustrious"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_reinaldo_quintero__reiq___artist_style_illustrious",
|
||||||
|
"style_name": " Reinaldo Quintero Reiq Artist Style Illustrious",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "reiq",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[Reinaldo Quintero (REIQ)] Artist Style Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Reinaldo Quintero (REIQ)] Artist Style Illustrious"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/_style__destijl__illustrious_xl_.json
Normal file
13
data/styles/_style__destijl__illustrious_xl_.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_style__destijl__illustrious_xl_",
|
||||||
|
"style_name": "Destijl",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[Style] Destijl [Illustrious-XL].safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Style] Destijl [Illustrious-XL]"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/_style__mosouko__illustrious_xl_.json
Normal file
13
data/styles/_style__mosouko__illustrious_xl_.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_style__mosouko__illustrious_xl_",
|
||||||
|
"style_name": "Mosouko",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[Style] Mosouko [Illustrious-XL].safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Style] Mosouko [Illustrious-XL]"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/_style__supeku__illustrious_xl_2_0_.json
Normal file
13
data/styles/_style__supeku__illustrious_xl_2_0_.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "_style__supeku__illustrious_xl_2_0_",
|
||||||
|
"style_name": "Supeku",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "supeku",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/[Style] Supeku [Illustrious-XL 2.0].safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Style] Supeku [Illustrious-XL 2.0]"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/afkarenaillustrious.json
Normal file
13
data/styles/afkarenaillustrious.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "afkarenaillustrious",
|
||||||
|
"style_name": "AFK Arena Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "afk_(series)"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/afkArenaIllustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "afkArenaIllustrious"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/ai_________style_illustrious_goofy.json
Normal file
13
data/styles/ai_________style_illustrious_goofy.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "ai_________style_illustrious_goofy",
|
||||||
|
"style_name": "Ai Style Goofy",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/AI\u30a4\u30e9\u30b9\u30c8\u304a\u3058\u3055\u3093_style_illustrious_goofy.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "AI\u30a4\u30e9\u30b9\u30c8\u304a\u3058\u3055\u3093_style_illustrious_goofy"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/ai_styles_collection_rouwei_vpred_rc3_v5.json
Normal file
13
data/styles/ai_styles_collection_rouwei_vpred_rc3_v5.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "ai_styles_collection_rouwei_vpred_rc3_v5",
|
||||||
|
"style_name": "Ai Styles Collection Rouwei Vpred Rc3 V5",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ai_styles_collection_rouwei_vpred-rc3_v5.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ai_styles_collection_rouwei_vpred-rc3_v5"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/aidmamj6_1_v0_5_il.json
Normal file
13
data/styles/aidmamj6_1_v0_5_il.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "aidmamj6_1_v0_5_il",
|
||||||
|
"style_name": "Aidmamj6 1 V0 5 Il",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/aidmaMJ6.1_v0.5_IL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "aidmaMJ6.1_v0.5_IL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/akinunishimura_style_12.json
Normal file
13
data/styles/akinunishimura_style_12.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "akinunishimura_style_12",
|
||||||
|
"style_name": "Akinunishimura Style 12",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/AKinuNishimura_Style-12.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "AKinuNishimura_Style-12"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/alensv6_000050.json
Normal file
13
data/styles/alensv6_000050.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "alensv6_000050",
|
||||||
|
"style_name": "Alensv6 000050",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/alensv6-000050.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "alensv6-000050"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/alyx_style_il_1386139.json
Normal file
13
data/styles/alyx_style_il_1386139.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "alyx_style_il_1386139",
|
||||||
|
"style_name": "Alyx Style Il 1386139",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ALYX_style_IL_1386139.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ALYX_style_IL_1386139"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/anime_artistic_2.json
Normal file
13
data/styles/anime_artistic_2.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "anime_artistic_2",
|
||||||
|
"style_name": "Anime Artistic 2",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Anime_artistic_2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Anime_artistic_2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/animefigure_ixl.json
Normal file
13
data/styles/animefigure_ixl.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "animefigure_ixl",
|
||||||
|
"style_name": "Animefigure Ixl",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/AnimeFigure_IXL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "AnimeFigure_IXL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/artnouveau2illustrious_1464859.json
Normal file
13
data/styles/artnouveau2illustrious_1464859.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "artnouveau2illustrious_1464859",
|
||||||
|
"style_name": "Art Nouveau",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "art nouveau"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ArtNouveau2Illustrious_1464859.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ArtNouveau2Illustrious_1464859"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/artnoveaumj7illustrious_1738799.json
Normal file
13
data/styles/artnoveaumj7illustrious_1738799.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "artnoveaumj7illustrious_1738799",
|
||||||
|
"style_name": "Art Noveau",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "art nouveau"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ArtNoveauMJ7Illustrious_1738799.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ArtNoveauMJ7Illustrious_1738799"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/asf3_style_12.json
Normal file
13
data/styles/asf3_style_12.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "asf3_style_12",
|
||||||
|
"style_name": "Asf Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "asf",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ASF3_style-12.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ASF3_style-12"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/atrex_style_12v2rev.json
Normal file
13
data/styles/atrex_style_12v2rev.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "atrex_style_12v2rev",
|
||||||
|
"style_name": "Atrex Style 12V2Rev",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ATRex_style-12V2Rev.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ATRex_style-12V2Rev"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/bckiwi_3d_style_il_2_7_rank16_fp16.json
Normal file
13
data/styles/bckiwi_3d_style_il_2_7_rank16_fp16.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "bckiwi_3d_style_il_2_7_rank16_fp16",
|
||||||
|
"style_name": "Bckiwi 3D Style Il 2 7 Rank16 Fp16",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/BCkiwi_3D_style_IL_2.7_rank16_fp16.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "BCkiwi_3D_style_IL_2.7_rank16_fp16"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/blacklight_graffiti_style_illustriousxl.json
Normal file
13
data/styles/blacklight_graffiti_style_illustriousxl.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "blacklight_graffiti_style_illustriousxl",
|
||||||
|
"style_name": "Blacklight Graffiti Style Illustriousxl",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Blacklight_Graffiti_Style_IllustriousXL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Blacklight_Graffiti_Style_IllustriousXL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/bleedman_v2.json
Normal file
13
data/styles/bleedman_v2.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "bleedman_v2",
|
||||||
|
"style_name": "Bleedman V2",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Bleedman_v2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Bleedman_v2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/blossombreeze1llust.json
Normal file
13
data/styles/blossombreeze1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "blossombreeze1llust",
|
||||||
|
"style_name": "Blossombreeze1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/BlossomBreeze1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "BlossomBreeze1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/bonsoirdude_sc4_z_16.json
Normal file
13
data/styles/bonsoirdude_sc4_z_16.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "bonsoirdude_sc4_z_16",
|
||||||
|
"style_name": "Bonsoirdude Sc4 Z 16",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/bonsoirdude-sc4-z-16.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "bonsoirdude-sc4-z-16"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/brushwork1llust.json
Normal file
13
data/styles/brushwork1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "brushwork1llust",
|
||||||
|
"style_name": "Brushwork",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Brushwork1llust.safetensors",
|
||||||
|
"lora_weight": 0.95,
|
||||||
|
"lora_triggers": "Brushwork1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/characterdoll_illust_v1.json
Normal file
13
data/styles/characterdoll_illust_v1.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "characterdoll_illust_v1",
|
||||||
|
"style_name": "Character Doll",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/characterdoll_Illust_v1.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "characterdoll_Illust_v1"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/charavxace.json
Normal file
13
data/styles/charavxace.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "charavxace",
|
||||||
|
"style_name": "Charavxace",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/charavxace.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "charavxace"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/checkpoint_e26_s312.json
Normal file
13
data/styles/checkpoint_e26_s312.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "checkpoint_e26_s312",
|
||||||
|
"style_name": "Checkpoint E26 S312",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/checkpoint-e26_s312.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "checkpoint-e26_s312"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/chinomaron_il.json
Normal file
13
data/styles/chinomaron_il.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "chinomaron_il",
|
||||||
|
"style_name": "Chinomaron Il",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/chinomaron_IL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "chinomaron_IL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/chxrrygxg_v1_illustrious_ty_lee_.json
Normal file
13
data/styles/chxrrygxg_v1_illustrious_ty_lee_.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "chxrrygxg_v1_illustrious_ty_lee_",
|
||||||
|
"style_name": "Chxrrygxg V1 Illustrious Ty Lee ",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/chxrrygxg_v1-illustrious-ty_lee .safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "chxrrygxg_v1-illustrious-ty_lee "
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/citronkurostyle_ixl_1735726.json
Normal file
13
data/styles/citronkurostyle_ixl_1735726.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "citronkurostyle_ixl_1735726",
|
||||||
|
"style_name": "Citronkurostyle Ixl 1735726",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/CitronKuroStyle_IXL_1735726.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "CitronKuroStyle_IXL_1735726"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/ck_nc_cyberpunk_il_000011.json
Normal file
13
data/styles/ck_nc_cyberpunk_il_000011.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "ck_nc_cyberpunk_il_000011",
|
||||||
|
"style_name": "Ck Nc Cyberpunk Il 000011",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/ck-nc-cyberpunk-IL-000011.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "ck-nc-cyberpunk-IL-000011"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cleanlinework1llust.json
Normal file
13
data/styles/cleanlinework1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cleanlinework1llust",
|
||||||
|
"style_name": "Cleanlinework1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/CleanLinework1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "CleanLinework1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/couturecraze_ixl_1412740.json
Normal file
13
data/styles/couturecraze_ixl_1412740.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "couturecraze_ixl_1412740",
|
||||||
|
"style_name": "Couturecraze Ixl 1412740",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/CoutureCraze_IXL_1412740.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "CoutureCraze_IXL_1412740"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/crt_tv_game_style_illustriousxl_000031.json
Normal file
13
data/styles/crt_tv_game_style_illustriousxl_000031.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "crt_tv_game_style_illustriousxl_000031",
|
||||||
|
"style_name": "Crt Tv Game Style Illustriousxl 000031",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/crt_tv_game_style_illustriousXL-000031.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "crt_tv_game_style_illustriousXL-000031, scanlines, pixel art"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cryostylev4.json
Normal file
13
data/styles/cryostylev4.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cryostylev4",
|
||||||
|
"style_name": "Cryostylev4",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cryostylev4.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cryostylev4"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cum_on_ero_figur.json
Normal file
13
data/styles/cum_on_ero_figur.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cum_on_ero_figur",
|
||||||
|
"style_name": "Cum On Ero Figur",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "cum_on_ero_figur, figurine, (cum:1.2)"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cum_on_ero_figur.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "cum on figure, figurine"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cum_on_figure_pvc.json
Normal file
13
data/styles/cum_on_figure_pvc.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cum_on_figure_pvc",
|
||||||
|
"style_name": "Cum On Figure Pvc",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "(cum:1.2), figurine"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cum_on_figure_pvc.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cum_on_figure_pvc,"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cunny_000024.json
Normal file
13
data/styles/cunny_000024.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cunny_000024",
|
||||||
|
"style_name": "Cunny 000024",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cunny-000024.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "cunny-000024"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/curestyle1llust_1552410.json
Normal file
13
data/styles/curestyle1llust_1552410.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "curestyle1llust_1552410",
|
||||||
|
"style_name": "Curestyle1Llust 1552410",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Curestyle1llust_1552410.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Curestyle1llust_1552410"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cutesexyrobutts_style_illustrious_goofy.json
Normal file
13
data/styles/cutesexyrobutts_style_illustrious_goofy.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cutesexyrobutts_style_illustrious_goofy",
|
||||||
|
"style_name": "Cutesexyrobutts Style Illustrious Goofy",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "cutesexyrobutts",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cutesexyrobutts_style_illustrious_goofy.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cutesexyrobutts_style_illustrious_goofy"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cyber_sijren.json
Normal file
13
data/styles/cyber_sijren.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cyber_sijren",
|
||||||
|
"style_name": "Cyber Sijren",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/cyber-sijren.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cyber-sijren"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/cyborggirl2llust.json
Normal file
13
data/styles/cyborggirl2llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "cyborggirl2llust",
|
||||||
|
"style_name": "Cyborggirl2Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/CyborgGirl2llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "CyborgGirl2llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/d_art_ill.json
Normal file
13
data/styles/d_art_ill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "d_art_ill",
|
||||||
|
"style_name": "D Art Ill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/d-art_ill.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "d-art_ill"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/dabaitunaitang.json
Normal file
13
data/styles/dabaitunaitang.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "dabaitunaitang",
|
||||||
|
"style_name": "Dabaitunaitang",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/dabaitunaitang.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "dabaitunaitang"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/dark_ghibli.json
Normal file
13
data/styles/dark_ghibli.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "dark_ghibli",
|
||||||
|
"style_name": "Dark Ghibli",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Dark_Ghibli.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Dark_Ghibli"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/dark_niji_style_il_v1_0.json
Normal file
13
data/styles/dark_niji_style_il_v1_0.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "dark_niji_style_il_v1_0",
|
||||||
|
"style_name": "Dark Niji Style Il V1 0",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/dark_Niji_style_IL_v1.0.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "dark_Niji_style_IL_v1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/darkaesthetic2llust.json
Normal file
13
data/styles/darkaesthetic2llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "darkaesthetic2llust",
|
||||||
|
"style_name": "Darkaesthetic2Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "dark"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/DarkAesthetic2llust.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "DarkAesthetic2llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/david_nakayamaill.json
Normal file
13
data/styles/david_nakayamaill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "david_nakayamaill",
|
||||||
|
"style_name": "David Nakayamaill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/david_nakayamaILL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "david_nakayamaILL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/detailedpixelartill.json
Normal file
13
data/styles/detailedpixelartill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "detailedpixelartill",
|
||||||
|
"style_name": "Detailedpixelartill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/DetailedPixelArtILL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "DetailedPixelArtILL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/digitalink1llust.json
Normal file
13
data/styles/digitalink1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "digitalink1llust",
|
||||||
|
"style_name": "Digitalink1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/DigitalInk1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "DigitalInk1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/dittochadblora02clscmimiccwr3adafix.json
Normal file
13
data/styles/dittochadblora02clscmimiccwr3adafix.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "dittochadblora02clscmimiccwr3adafix",
|
||||||
|
"style_name": "Dittochadblora02Clscmimiccwr3Adafix",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/DittochadBlora02CLScMimicCWR3AdaFix.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "DittochadBlora02CLScMimicCWR3AdaFix"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/doodlelotill.json
Normal file
13
data/styles/doodlelotill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "doodlelotill",
|
||||||
|
"style_name": "Doodlelotill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/DoodlelotILL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "DoodlelotILL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/double_daggers_style.json
Normal file
13
data/styles/double_daggers_style.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "double_daggers_style",
|
||||||
|
"style_name": "Double Daggers Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Double_Daggers_Style.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Double_Daggers_Style"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/dreamlike1llust.json
Normal file
13
data/styles/dreamlike1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "dreamlike1llust",
|
||||||
|
"style_name": "Dreamlike1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Dreamlike1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Dreamlike1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/e_girl_pfp_style.json
Normal file
13
data/styles/e_girl_pfp_style.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "e_girl_pfp_style",
|
||||||
|
"style_name": "E Girl Pfp Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/E-Girl_PFP_Style.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "E-Girl_PFP_Style"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/eerieartwork1llust_1516294.json
Normal file
13
data/styles/eerieartwork1llust_1516294.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "eerieartwork1llust_1516294",
|
||||||
|
"style_name": "Eerieartwork1Llust 1516294",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/EerieArtwork1llust_1516294.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "EerieArtwork1llust_1516294"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/egyptian_pdxl_000008_440469.json
Normal file
13
data/styles/egyptian_pdxl_000008_440469.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "egyptian_pdxl_000008_440469",
|
||||||
|
"style_name": "Egyptian Pdxl 000008 440469",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Egyptian_PDXL-000008_440469.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Egyptian_PDXL-000008_440469"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/erotic_style_2_r2.json
Normal file
13
data/styles/erotic_style_2_r2.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "erotic_style_2_r2",
|
||||||
|
"style_name": "Erotic Style 2 R2",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Erotic_style_2_r2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Erotic_style_2_r2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/erotic_style_3.json
Normal file
13
data/styles/erotic_style_3.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "erotic_style_3",
|
||||||
|
"style_name": "Erotic Style 3",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Erotic_style_3.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Erotic_style_3"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/ethereal1llust.json
Normal file
13
data/styles/ethereal1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "ethereal1llust",
|
||||||
|
"style_name": "Ethereal1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Ethereal1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Ethereal1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/etherealmist1llust.json
Normal file
13
data/styles/etherealmist1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "etherealmist1llust",
|
||||||
|
"style_name": "Ethereal Mist",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "ethereal"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/EtherealMist1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "EtherealMist1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/fairymge2_000008.json
Normal file
13
data/styles/fairymge2_000008.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "fairymge2_000008",
|
||||||
|
"style_name": "Fairymge2 000008",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/fairymge2-000008.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "fairymge2-000008"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/famo3dxl_nbvp1_lokr_v6311pz.json
Normal file
13
data/styles/famo3dxl_nbvp1_lokr_v6311pz.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "famo3dxl_nbvp1_lokr_v6311pz",
|
||||||
|
"style_name": "Famo3Dxl Nbvp1 Lokr V6311Pz",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/famo3dXL_NBVP1_lokr_V6311PZ.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "famo3dXL_NBVP1_lokr_V6311PZ"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/fantasiastyle_illustrious_byjaneb.json
Normal file
13
data/styles/fantasiastyle_illustrious_byjaneb.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "fantasiastyle_illustrious_byjaneb",
|
||||||
|
"style_name": "Fantasiastyle Illustrious Byjaneb",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/fantasiaStyle_illustrious_byJaneB.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "fantasiaStyle_illustrious_byJaneB"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/fantasyart1llust_1556627.json
Normal file
13
data/styles/fantasyart1llust_1556627.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "fantasyart1llust_1556627",
|
||||||
|
"style_name": "Fantasyart1Llust 1556627",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/FantasyArt1llust_1556627.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "FantasyArt1llust_1556627"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/fellatrix_slim_build___femdom_style.json
Normal file
13
data/styles/fellatrix_slim_build___femdom_style.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "fellatrix_slim_build___femdom_style",
|
||||||
|
"style_name": "Fellatrix Slim Build Femdom Style",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Fellatrix_Slim_Build_-_Femdom_Style.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Fellatrix_Slim_Build_-_Femdom_Style"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/fellatrix_style_ponyil.json
Normal file
13
data/styles/fellatrix_style_ponyil.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "fellatrix_style_ponyil",
|
||||||
|
"style_name": "Fellatrix Style Ponyil",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "fellatrix",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Fellatrix_Style_PonyIL.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Fellatrix_Style_PonyIL"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/ff7_portraits_illus_fp.json
Normal file
13
data/styles/ff7_portraits_illus_fp.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "ff7_portraits_illus_fp",
|
||||||
|
"style_name": "FF7 Portraits",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": "ff7, portrait"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/FF7-Portraits-illus_Fp.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "FF7-Portraits-illus_Fp"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/flhours_ill.json
Normal file
13
data/styles/flhours_ill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "flhours_ill",
|
||||||
|
"style_name": "Flhours Ill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/flhours_ill.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "flhours_ill"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/flim13_000011.json
Normal file
13
data/styles/flim13_000011.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "flim13_000011",
|
||||||
|
"style_name": "Flim13",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "flim13",
|
||||||
|
"artistic_style": "3d"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Flim13-000011.safetensors",
|
||||||
|
"lora_weight": 0.95,
|
||||||
|
"lora_triggers": "Flim13-000011"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/flowerxl_artstyle.json
Normal file
13
data/styles/flowerxl_artstyle.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "flowerxl_artstyle",
|
||||||
|
"style_name": "Flowerxl Artstyle",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/FlowerXL Artstyle.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "FlowerXL Artstyle"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/frumblebee_style_ill.json
Normal file
13
data/styles/frumblebee_style_ill.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "frumblebee_style_ill",
|
||||||
|
"style_name": "Frumblebee Style Ill",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Frumblebee_Style_ill.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Frumblebee_Style_ill"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/futurism1llust_1549997.json
Normal file
13
data/styles/futurism1llust_1549997.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "futurism1llust_1549997",
|
||||||
|
"style_name": "Futurism1Llust 1549997",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Futurism1llust_1549997.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Futurism1llust_1549997"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/giga.json
Normal file
13
data/styles/giga.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "giga",
|
||||||
|
"style_name": "Giga",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/giga.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "giga"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/glossillus.json
Normal file
13
data/styles/glossillus.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "glossillus",
|
||||||
|
"style_name": "Glossillus",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/glossILLUS.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "glossILLUS"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/glossline_illustrious.json
Normal file
13
data/styles/glossline_illustrious.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "glossline_illustrious",
|
||||||
|
"style_name": "Glossline Illustrious",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Glossline_Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Glossline_Illustrious"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/glossy_western_art_style___for_ezekkiell.json
Normal file
13
data/styles/glossy_western_art_style___for_ezekkiell.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "glossy_western_art_style___for_ezekkiell",
|
||||||
|
"style_name": "Glossy Western Art Style For Ezekkiell",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Glossy_Western_Art_Style_-_for_Ezekkiell.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Glossy_Western_Art_Style_-_for_Ezekkiell"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/goo_il_v1_aeromoia.json
Normal file
13
data/styles/goo_il_v1_aeromoia.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "goo_il_v1_aeromoia",
|
||||||
|
"style_name": "Goo Il V1 Aeromoia",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Goo-IL-V1_Aeromoia.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Goo-IL-V1_Aeromoia"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/granblue_fantasy___heles.json
Normal file
13
data/styles/granblue_fantasy___heles.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "granblue_fantasy___heles",
|
||||||
|
"style_name": "Granblue Fantasy Heles",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Granblue_Fantasy_-_Heles.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Granblue_Fantasy_-_Heles"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/granblue_noob.json
Normal file
13
data/styles/granblue_noob.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "granblue_noob",
|
||||||
|
"style_name": "Granblue Noob",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/granblue-noob.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "granblue-noob"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/hearthstone_artstyle.json
Normal file
13
data/styles/hearthstone_artstyle.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "hearthstone_artstyle",
|
||||||
|
"style_name": "Hearthstone Artstyle",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/Hearthstone-ArtStyle.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Hearthstone-ArtStyle"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/herrscheragga2025_cutetoon_il_v2.json
Normal file
13
data/styles/herrscheragga2025_cutetoon_il_v2.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "herrscheragga2025_cutetoon_il_v2",
|
||||||
|
"style_name": "Herrscheragga2025 Cutetoon Il V2",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/HerrscherAGGA2025_CuteToon-IL_V2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "HerrscherAGGA2025_CuteToon-IL_V2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/hidream_flat_color_v2.json
Normal file
13
data/styles/hidream_flat_color_v2.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "hidream_flat_color_v2",
|
||||||
|
"style_name": "Hidream Flat Color V2",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/hidream_flat_color_v2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "hidream_flat_color_v2"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/highpoly1llust.json
Normal file
13
data/styles/highpoly1llust.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "highpoly1llust",
|
||||||
|
"style_name": "Highpoly1Llust",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/HighPoly1llust.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "HighPoly1llust"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/holographiccolor_000009.json
Normal file
13
data/styles/holographiccolor_000009.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "holographiccolor_000009",
|
||||||
|
"style_name": "Holographiccolor 000009",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/holographiccolor-000009.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "holographiccolor-000009"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/hornyconceptart_000011.json
Normal file
13
data/styles/hornyconceptart_000011.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "hornyconceptart_000011",
|
||||||
|
"style_name": "Hornyconceptart 000011",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/HornyConceptArt-000011.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "Hornyconceptart-000011,concept art"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/hornyconceptartv1_1_000009.json
Normal file
13
data/styles/hornyconceptartv1_1_000009.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "hornyconceptartv1_1_000009",
|
||||||
|
"style_name": "Hornyconceptartv1 1 000009",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/HornyConceptArtV1.1-000009.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "HornyConceptArtV1.1-000009"
|
||||||
|
}
|
||||||
|
}
|
||||||
13
data/styles/hornypixelartstylev1.json
Normal file
13
data/styles/hornypixelartstylev1.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"style_id": "hornypixelartstylev1",
|
||||||
|
"style_name": "Hornypixelartstylev1",
|
||||||
|
"style": {
|
||||||
|
"artist_name": "",
|
||||||
|
"artistic_style": ""
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Styles/HornyPixelArtStyleV1.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "HornyPixelArtStyleV1"
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user