Merge pull request 'Expanded generation options. Multiple outfits support.' (#1) from expanded-generation into master
Reviewed-on: #1
This commit is contained in:
434
app.py
434
app.py
@@ -6,7 +6,7 @@ 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 werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
from models import db, Character
|
from models import db, Character, Settings
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
||||||
@@ -17,11 +17,21 @@ app.config['CHARACTERS_DIR'] = 'characters'
|
|||||||
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/'
|
||||||
|
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
|
|
||||||
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
|
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
|
||||||
|
|
||||||
|
def get_available_loras():
|
||||||
|
loras = []
|
||||||
|
if os.path.exists(app.config['LORA_DIR']):
|
||||||
|
for f in os.listdir(app.config['LORA_DIR']):
|
||||||
|
if f.endswith('.safetensors'):
|
||||||
|
# Using the format seen in character JSONs
|
||||||
|
loras.append(f"Illustrious/Looks/{f}")
|
||||||
|
return sorted(loras)
|
||||||
|
|
||||||
def get_available_checkpoints():
|
def get_available_checkpoints():
|
||||||
checkpoints = []
|
checkpoints = []
|
||||||
|
|
||||||
@@ -42,7 +52,7 @@ def get_available_checkpoints():
|
|||||||
def allowed_file(filename):
|
def allowed_file(filename):
|
||||||
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
||||||
|
|
||||||
def build_prompt(data, selected_fields=None, default_fields=None):
|
def build_prompt(data, selected_fields=None, default_fields=None, active_outfit='default'):
|
||||||
def is_selected(section, key):
|
def is_selected(section, key):
|
||||||
# Priority:
|
# Priority:
|
||||||
# 1. Manual selection from form (if list is not empty)
|
# 1. Manual selection from form (if list is not empty)
|
||||||
@@ -55,7 +65,17 @@ def build_prompt(data, selected_fields=None, default_fields=None):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
identity = data.get('identity', {})
|
identity = data.get('identity', {})
|
||||||
wardrobe = data.get('wardrobe', {})
|
|
||||||
|
# Get wardrobe - handle both new nested format and legacy flat format
|
||||||
|
wardrobe_data = data.get('wardrobe', {})
|
||||||
|
if 'default' in wardrobe_data and isinstance(wardrobe_data.get('default'), dict):
|
||||||
|
# New nested format - get active outfit
|
||||||
|
wardrobe = wardrobe_data.get(active_outfit or 'default', wardrobe_data.get('default', {}))
|
||||||
|
else:
|
||||||
|
# Legacy flat format
|
||||||
|
wardrobe = wardrobe_data
|
||||||
|
|
||||||
|
defaults = data.get('defaults', {})
|
||||||
|
|
||||||
# Pre-calculate Hand/Glove priority
|
# Pre-calculate Hand/Glove priority
|
||||||
hand_val = ""
|
hand_val = ""
|
||||||
@@ -71,16 +91,22 @@ def build_prompt(data, selected_fields=None, default_fields=None):
|
|||||||
if char_tag and is_selected('special', 'name'):
|
if char_tag and is_selected('special', 'name'):
|
||||||
parts.append(char_tag)
|
parts.append(char_tag)
|
||||||
|
|
||||||
for key in ['base_specs', 'hair', 'eyes', 'expression', 'distinguishing_marks']:
|
for key in ['base_specs', 'hair', 'eyes', 'extra']:
|
||||||
val = identity.get(key)
|
val = identity.get(key)
|
||||||
if val and is_selected('identity', key):
|
if val and is_selected('identity', key):
|
||||||
parts.append(val)
|
parts.append(val)
|
||||||
|
|
||||||
|
# Add defaults (expression, pose, scene)
|
||||||
|
for key in ['expression', 'pose', 'scene']:
|
||||||
|
val = defaults.get(key)
|
||||||
|
if val and is_selected('defaults', key):
|
||||||
|
parts.append(val)
|
||||||
|
|
||||||
# Add hand priority value to main prompt
|
# Add hand priority value to main prompt
|
||||||
if hand_val:
|
if hand_val:
|
||||||
parts.append(hand_val)
|
parts.append(hand_val)
|
||||||
|
|
||||||
for key in ['outer_layer', 'inner_layer', 'lower_body', 'footwear', 'accessories']:
|
for key in ['top', 'headwear', 'legwear', 'footwear', 'accessories']:
|
||||||
val = wardrobe.get(key)
|
val = wardrobe.get(key)
|
||||||
if val and is_selected('wardrobe', key):
|
if val and is_selected('wardrobe', key):
|
||||||
parts.append(val)
|
parts.append(val)
|
||||||
@@ -101,7 +127,7 @@ def build_prompt(data, selected_fields=None, default_fields=None):
|
|||||||
face_parts = []
|
face_parts = []
|
||||||
if char_tag and is_selected('special', 'name'): face_parts.append(char_tag)
|
if char_tag and is_selected('special', 'name'): face_parts.append(char_tag)
|
||||||
if identity.get('eyes') and is_selected('identity', 'eyes'): face_parts.append(identity.get('eyes'))
|
if identity.get('eyes') and is_selected('identity', 'eyes'): face_parts.append(identity.get('eyes'))
|
||||||
if identity.get('expression') and is_selected('identity', 'expression'): face_parts.append(identity.get('expression'))
|
if defaults.get('expression') and is_selected('defaults', 'expression'): face_parts.append(defaults.get('expression'))
|
||||||
|
|
||||||
# 3. Hand Prompt: Hand value (Gloves or Hands)
|
# 3. Hand Prompt: Hand value (Gloves or Hands)
|
||||||
hand_parts = [hand_val] if hand_val else []
|
hand_parts = [hand_val] if hand_val else []
|
||||||
@@ -160,6 +186,7 @@ def sync_characters():
|
|||||||
character.data = data
|
character.data = data
|
||||||
character.name = name
|
character.name = name
|
||||||
character.slug = slug
|
character.slug = slug
|
||||||
|
character.filename = filename
|
||||||
|
|
||||||
# Check if cover image still exists
|
# Check if cover image still exists
|
||||||
if character.image_path:
|
if character.image_path:
|
||||||
@@ -174,6 +201,7 @@ def sync_characters():
|
|||||||
new_char = Character(
|
new_char = Character(
|
||||||
character_id=char_id,
|
character_id=char_id,
|
||||||
slug=slug,
|
slug=slug,
|
||||||
|
filename=filename,
|
||||||
name=name,
|
name=name,
|
||||||
data=data
|
data=data
|
||||||
)
|
)
|
||||||
@@ -189,6 +217,66 @@ def sync_characters():
|
|||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
def call_llm(prompt, system_prompt="You are a creative assistant."):
|
||||||
|
settings = Settings.query.first()
|
||||||
|
if not settings or not settings.openrouter_api_key:
|
||||||
|
raise ValueError("OpenRouter API Key not configured. Please configure it in Settings.")
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"Bearer {settings.openrouter_api_key}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
data = {
|
||||||
|
"model": settings.openrouter_model or 'google/gemini-2.0-flash-001',
|
||||||
|
"messages": [
|
||||||
|
{"role": "system", "content": system_prompt},
|
||||||
|
{"role": "user", "content": prompt}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, json=data)
|
||||||
|
response.raise_for_status()
|
||||||
|
result = response.json()
|
||||||
|
return result['choices'][0]['message']['content']
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
raise RuntimeError(f"LLM API request failed: {str(e)}") from e
|
||||||
|
except (KeyError, IndexError) as e:
|
||||||
|
raise RuntimeError(f"Unexpected LLM response format: {str(e)}") from e
|
||||||
|
|
||||||
|
@app.route('/get_openrouter_models', methods=['POST'])
|
||||||
|
def get_openrouter_models():
|
||||||
|
api_key = request.form.get('api_key')
|
||||||
|
if not api_key:
|
||||||
|
return {'error': 'API key is required'}, 400
|
||||||
|
|
||||||
|
headers = {"Authorization": f"Bearer {api_key}"}
|
||||||
|
try:
|
||||||
|
response = requests.get("https://openrouter.ai/api/v1/models", headers=headers)
|
||||||
|
response.raise_for_status()
|
||||||
|
models = response.json().get('data', [])
|
||||||
|
# Return simplified list of models
|
||||||
|
return {'models': [{'id': m['id'], 'name': m.get('name', m['id'])} for m in models]}
|
||||||
|
except Exception as e:
|
||||||
|
return {'error': str(e)}, 500
|
||||||
|
|
||||||
|
@app.route('/settings', methods=['GET', 'POST'])
|
||||||
|
def settings():
|
||||||
|
settings = Settings.query.first()
|
||||||
|
if not settings:
|
||||||
|
settings = Settings()
|
||||||
|
db.session.add(settings)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
settings.openrouter_api_key = request.form.get('api_key')
|
||||||
|
settings.openrouter_model = request.form.get('model')
|
||||||
|
db.session.commit()
|
||||||
|
flash('Settings updated successfully!')
|
||||||
|
return redirect(url_for('settings'))
|
||||||
|
|
||||||
|
return render_template('settings.html', settings=settings)
|
||||||
|
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
def index():
|
def index():
|
||||||
characters = Character.query.order_by(Character.name).all()
|
characters = Character.query.order_by(Character.name).all()
|
||||||
@@ -278,6 +366,323 @@ def detail(slug):
|
|||||||
|
|
||||||
return render_template('detail.html', character=character, preferences=preferences, preview_image=preview_image)
|
return render_template('detail.html', character=character, preferences=preferences, preview_image=preview_image)
|
||||||
|
|
||||||
|
@app.route('/create', methods=['GET', 'POST'])
|
||||||
|
def create_character():
|
||||||
|
if request.method == 'POST':
|
||||||
|
name = request.form.get('name')
|
||||||
|
slug = request.form.get('filename')
|
||||||
|
prompt = request.form.get('prompt')
|
||||||
|
|
||||||
|
# Validate slug
|
||||||
|
safe_slug = re.sub(r'[^a-zA-Z0-9_]', '', slug)
|
||||||
|
if not safe_slug:
|
||||||
|
flash("Invalid filename.")
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
# Check if exists
|
||||||
|
if os.path.exists(os.path.join(app.config['CHARACTERS_DIR'], f"{safe_slug}.json")):
|
||||||
|
flash("Character with this filename already exists.")
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
# Generate JSON with LLM
|
||||||
|
system_prompt = """You are a JSON generator. output ONLY valid JSON matching this exact structure. Do not wrap in markdown blocks.
|
||||||
|
Structure:
|
||||||
|
{
|
||||||
|
"character_id": "WILL_BE_REPLACED",
|
||||||
|
"character_name": "WILL_BE_REPLACED",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "string (e.g. 1girl, build, skin)",
|
||||||
|
"hair": "string",
|
||||||
|
"eyes": "string",
|
||||||
|
"hands": "string",
|
||||||
|
"arms": "string",
|
||||||
|
"torso": "string",
|
||||||
|
"pelvis": "string",
|
||||||
|
"legs": "string",
|
||||||
|
"feet": "string",
|
||||||
|
"extra": "string"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"headwear": "string",
|
||||||
|
"top": "string",
|
||||||
|
"legwear": "string",
|
||||||
|
"footwear": "string",
|
||||||
|
"hands": "string",
|
||||||
|
"accessories": "string"
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "string",
|
||||||
|
"primary_color": "string",
|
||||||
|
"secondary_color": "string",
|
||||||
|
"tertiary_color": "string"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": ""
|
||||||
|
},
|
||||||
|
"tags": ["string", "string"]
|
||||||
|
}
|
||||||
|
Fill the fields based on the user's description. Use Danbooru-style tags for the values (e.g. 'long hair', 'blue eyes'). Keep values concise. Leave defaults fields empty."""
|
||||||
|
|
||||||
|
try:
|
||||||
|
llm_response = call_llm(f"Create a character profile for '{name}' based on this description: {prompt}", system_prompt)
|
||||||
|
|
||||||
|
# Clean response (remove markdown if present)
|
||||||
|
clean_json = llm_response.replace('```json', '').replace('```', '').strip()
|
||||||
|
char_data = json.loads(clean_json)
|
||||||
|
|
||||||
|
# Enforce IDs
|
||||||
|
char_data['character_id'] = safe_slug
|
||||||
|
char_data['character_name'] = name
|
||||||
|
|
||||||
|
# Save file
|
||||||
|
file_path = os.path.join(app.config['CHARACTERS_DIR'], f"{safe_slug}.json")
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(char_data, f, indent=2)
|
||||||
|
|
||||||
|
# Add to DB
|
||||||
|
new_char = Character(
|
||||||
|
character_id=safe_slug,
|
||||||
|
slug=safe_slug,
|
||||||
|
filename=f"{safe_slug}.json",
|
||||||
|
name=name,
|
||||||
|
data=char_data
|
||||||
|
)
|
||||||
|
db.session.add(new_char)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
flash('Character created successfully!')
|
||||||
|
return redirect(url_for('detail', slug=safe_slug))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"LLM/Save error: {e}")
|
||||||
|
flash(f"Failed to create character: {e}")
|
||||||
|
return redirect(request.url)
|
||||||
|
|
||||||
|
return render_template('create.html')
|
||||||
|
|
||||||
|
@app.route('/character/<path:slug>/edit', methods=['GET', 'POST'])
|
||||||
|
def edit_character(slug):
|
||||||
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
|
loras = get_available_loras()
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
try:
|
||||||
|
# 1. Update basic fields
|
||||||
|
character.name = request.form.get('character_name')
|
||||||
|
|
||||||
|
# 2. Rebuild the data dictionary
|
||||||
|
new_data = character.data.copy()
|
||||||
|
new_data['character_name'] = character.name
|
||||||
|
|
||||||
|
# Update nested sections (non-wardrobe)
|
||||||
|
for section in ['identity', 'defaults', 'styles', 'lora']:
|
||||||
|
if section in new_data:
|
||||||
|
for key in new_data[section]:
|
||||||
|
form_key = f"{section}_{key}"
|
||||||
|
if form_key in request.form:
|
||||||
|
val = request.form.get(form_key)
|
||||||
|
# Handle numeric weight
|
||||||
|
if key == 'lora_weight':
|
||||||
|
try: val = float(val)
|
||||||
|
except: val = 1.0
|
||||||
|
new_data[section][key] = val
|
||||||
|
|
||||||
|
# Handle wardrobe - support both nested and flat formats
|
||||||
|
wardrobe = new_data.get('wardrobe', {})
|
||||||
|
if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict):
|
||||||
|
# New nested format - update each outfit
|
||||||
|
for outfit_name in wardrobe.keys():
|
||||||
|
for key in wardrobe[outfit_name].keys():
|
||||||
|
form_key = f"wardrobe_{outfit_name}_{key}"
|
||||||
|
if form_key in request.form:
|
||||||
|
wardrobe[outfit_name][key] = request.form.get(form_key)
|
||||||
|
new_data['wardrobe'] = wardrobe
|
||||||
|
else:
|
||||||
|
# Legacy flat format
|
||||||
|
if 'wardrobe' in new_data:
|
||||||
|
for key in new_data['wardrobe'].keys():
|
||||||
|
form_key = f"wardrobe_{key}"
|
||||||
|
if form_key in request.form:
|
||||||
|
new_data['wardrobe'][key] = request.form.get(form_key)
|
||||||
|
|
||||||
|
# Update Tags (comma separated string to list)
|
||||||
|
tags_raw = request.form.get('tags', '')
|
||||||
|
new_data['tags'] = [t.strip() for f in tags_raw.split(',') for t in [f.strip()] if t]
|
||||||
|
|
||||||
|
character.data = new_data
|
||||||
|
flag_modified(character, "data")
|
||||||
|
|
||||||
|
# 3. Write back to JSON file
|
||||||
|
# Use the filename we stored during sync, or fallback to a sanitized ID
|
||||||
|
char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json"
|
||||||
|
file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file)
|
||||||
|
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(new_data, f, indent=2)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
flash('Character profile updated successfully!')
|
||||||
|
return redirect(url_for('detail', slug=slug))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Edit error: {e}")
|
||||||
|
flash(f"Error saving changes: {str(e)}")
|
||||||
|
|
||||||
|
return render_template('edit.html', character=character, loras=loras)
|
||||||
|
|
||||||
|
@app.route('/character/<path:slug>/outfit/switch', methods=['POST'])
|
||||||
|
def switch_outfit(slug):
|
||||||
|
"""Switch the active outfit for a character."""
|
||||||
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
|
outfit_name = request.form.get('outfit', 'default')
|
||||||
|
|
||||||
|
# Validate outfit exists
|
||||||
|
available_outfits = character.get_available_outfits()
|
||||||
|
if outfit_name in available_outfits:
|
||||||
|
character.active_outfit = outfit_name
|
||||||
|
db.session.commit()
|
||||||
|
flash(f'Switched to "{outfit_name}" outfit.')
|
||||||
|
else:
|
||||||
|
flash(f'Outfit "{outfit_name}" not found.', 'error')
|
||||||
|
|
||||||
|
return redirect(url_for('detail', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/character/<path:slug>/outfit/add', methods=['POST'])
|
||||||
|
def add_outfit(slug):
|
||||||
|
"""Add a new outfit to a character."""
|
||||||
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
|
outfit_name = request.form.get('outfit_name', '').strip()
|
||||||
|
|
||||||
|
if not outfit_name:
|
||||||
|
flash('Outfit name cannot be empty.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
# Sanitize outfit name for use as key
|
||||||
|
safe_name = re.sub(r'[^a-zA-Z0-9_]', '_', outfit_name.lower())
|
||||||
|
|
||||||
|
# Get wardrobe data
|
||||||
|
wardrobe = character.data.get('wardrobe', {})
|
||||||
|
|
||||||
|
# Ensure wardrobe is in new nested format
|
||||||
|
if 'default' not in wardrobe or not isinstance(wardrobe.get('default'), dict):
|
||||||
|
# Convert legacy format
|
||||||
|
wardrobe = {'default': wardrobe}
|
||||||
|
|
||||||
|
# Check if outfit already exists
|
||||||
|
if safe_name in wardrobe:
|
||||||
|
flash(f'Outfit "{safe_name}" already exists.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
# Create new outfit (copy from default as template)
|
||||||
|
default_outfit = wardrobe.get('default', {
|
||||||
|
'headwear': '', 'top': '', 'legwear': '',
|
||||||
|
'footwear': '', 'hands': '', 'accessories': ''
|
||||||
|
})
|
||||||
|
wardrobe[safe_name] = default_outfit.copy()
|
||||||
|
|
||||||
|
# Update character data
|
||||||
|
character.data['wardrobe'] = wardrobe
|
||||||
|
flag_modified(character, 'data')
|
||||||
|
|
||||||
|
# Save to JSON file
|
||||||
|
char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json"
|
||||||
|
file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file)
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(character.data, f, indent=2)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
flash(f'Added new outfit "{safe_name}".')
|
||||||
|
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/character/<path:slug>/outfit/delete', methods=['POST'])
|
||||||
|
def delete_outfit(slug):
|
||||||
|
"""Delete an outfit from a character."""
|
||||||
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
|
outfit_name = request.form.get('outfit', '')
|
||||||
|
|
||||||
|
wardrobe = character.data.get('wardrobe', {})
|
||||||
|
|
||||||
|
# Cannot delete default
|
||||||
|
if outfit_name == 'default':
|
||||||
|
flash('Cannot delete the default outfit.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
if outfit_name not in wardrobe:
|
||||||
|
flash(f'Outfit "{outfit_name}" not found.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
# Delete outfit
|
||||||
|
del wardrobe[outfit_name]
|
||||||
|
character.data['wardrobe'] = wardrobe
|
||||||
|
flag_modified(character, 'data')
|
||||||
|
|
||||||
|
# Switch active outfit if deleted was active
|
||||||
|
if character.active_outfit == outfit_name:
|
||||||
|
character.active_outfit = 'default'
|
||||||
|
|
||||||
|
# Save to JSON file
|
||||||
|
char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json"
|
||||||
|
file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file)
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(character.data, f, indent=2)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
flash(f'Deleted outfit "{outfit_name}".')
|
||||||
|
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
@app.route('/character/<path:slug>/outfit/rename', methods=['POST'])
|
||||||
|
def rename_outfit(slug):
|
||||||
|
"""Rename an outfit."""
|
||||||
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
|
old_name = request.form.get('old_name', '')
|
||||||
|
new_name = request.form.get('new_name', '').strip()
|
||||||
|
|
||||||
|
if not new_name:
|
||||||
|
flash('New name cannot be empty.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
# Sanitize new name
|
||||||
|
safe_name = re.sub(r'[^a-zA-Z0-9_]', '_', new_name.lower())
|
||||||
|
|
||||||
|
wardrobe = character.data.get('wardrobe', {})
|
||||||
|
|
||||||
|
if old_name not in wardrobe:
|
||||||
|
flash(f'Outfit "{old_name}" not found.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
if safe_name in wardrobe and safe_name != old_name:
|
||||||
|
flash(f'Outfit "{safe_name}" already exists.', 'error')
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
|
# Rename (copy to new key, delete old)
|
||||||
|
wardrobe[safe_name] = wardrobe.pop(old_name)
|
||||||
|
character.data['wardrobe'] = wardrobe
|
||||||
|
flag_modified(character, 'data')
|
||||||
|
|
||||||
|
# Update active outfit if renamed was active
|
||||||
|
if character.active_outfit == old_name:
|
||||||
|
character.active_outfit = safe_name
|
||||||
|
|
||||||
|
# Save to JSON file
|
||||||
|
char_file = character.filename or f"{re.sub(r'[^a-zA-Z0-9_]', '', character.character_id)}.json"
|
||||||
|
file_path = os.path.join(app.config['CHARACTERS_DIR'], char_file)
|
||||||
|
with open(file_path, 'w') as f:
|
||||||
|
json.dump(character.data, f, indent=2)
|
||||||
|
|
||||||
|
db.session.commit()
|
||||||
|
flash(f'Renamed outfit "{old_name}" to "{safe_name}".')
|
||||||
|
|
||||||
|
return redirect(url_for('edit_character', slug=slug))
|
||||||
|
|
||||||
@app.route('/character/<path:slug>/upload', methods=['POST'])
|
@app.route('/character/<path:slug>/upload', methods=['POST'])
|
||||||
def upload_image(slug):
|
def upload_image(slug):
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
character = Character.query.filter_by(slug=slug).first_or_404()
|
||||||
@@ -416,8 +821,8 @@ def _queue_generation(character, action='preview', selected_fields=None, client_
|
|||||||
with open('comfy_workflow.json', 'r') as f:
|
with open('comfy_workflow.json', 'r') as f:
|
||||||
workflow = json.load(f)
|
workflow = json.load(f)
|
||||||
|
|
||||||
# 2. Build prompts
|
# 2. Build prompts with active outfit
|
||||||
prompts = build_prompt(character.data, selected_fields, character.default_fields)
|
prompts = build_prompt(character.data, selected_fields, character.default_fields, character.active_outfit)
|
||||||
|
|
||||||
# 3. Prepare workflow
|
# 3. Prepare workflow
|
||||||
workflow = _prepare_workflow(workflow, character, prompts)
|
workflow = _prepare_workflow(workflow, character, prompts)
|
||||||
@@ -540,5 +945,18 @@ 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)
|
||||||
db.create_all()
|
db.create_all()
|
||||||
|
|
||||||
|
# Migration: Add active_outfit column if it doesn't exist
|
||||||
|
try:
|
||||||
|
from sqlalchemy import text
|
||||||
|
db.session.execute(text('ALTER TABLE character ADD COLUMN active_outfit VARCHAR(100) DEFAULT \'default\''))
|
||||||
|
db.session.commit()
|
||||||
|
print("Added active_outfit column to character table")
|
||||||
|
except Exception as e:
|
||||||
|
if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower():
|
||||||
|
print("active_outfit column already exists")
|
||||||
|
else:
|
||||||
|
print(f"Migration note: {e}")
|
||||||
|
|
||||||
sync_characters()
|
sync_characters()
|
||||||
app.run(debug=True, port=5000)
|
app.run(debug=True, port=5000)
|
||||||
|
|||||||
@@ -2,24 +2,38 @@
|
|||||||
"character_id": "aerith_gainsborough",
|
"character_id": "aerith_gainsborough",
|
||||||
"identity": {
|
"identity": {
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long brown hair, braided, pink ribbon",
|
"hair": "long brown hair, braided, ",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "cheerful expression",
|
|
||||||
"hands": "pink nails",
|
"hands": "pink nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": "pink hair ribbon"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "pink dress, red bolero jacket",
|
"headwear": "",
|
||||||
"lower_body": "long skirt",
|
"top": "pink dress, red bolero jacket",
|
||||||
"footwear": "brown boots",
|
"legwear": "long pink dress",
|
||||||
"gloves": "",
|
"footwear": "brown boots",
|
||||||
"accessories": "gold bracelets, flower basket"
|
"hands": "",
|
||||||
|
"accessories": "gold bracelets, flower basket"
|
||||||
|
},
|
||||||
|
"red_dress": {
|
||||||
|
"headwear": "red hair ribbons",
|
||||||
|
"top": "long dress, frilled dress, red dress",
|
||||||
|
"legwear": "long dress, frilled dress, red dress",
|
||||||
|
"footwear": "white high heels",
|
||||||
|
"hands": "red nails",
|
||||||
|
"accessories": "gold bracelets"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "floral, gentle, final fantasy style",
|
"aesthetic": "floral, gentle, final fantasy style",
|
||||||
@@ -28,11 +42,12 @@
|
|||||||
"tertiary_color": "brown"
|
"tertiary_color": "brown"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/Aerith.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 1.0,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"Final Fantasy VII"
|
"Final Fantasy VII"
|
||||||
]
|
],
|
||||||
|
"character_name": "Aerith Gainsborough"
|
||||||
}
|
}
|
||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "shoulder-length blonde hair, tucked behind one ear",
|
"hair": "shoulder-length blonde hair, tucked behind one ear",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "cool, indifferent expression",
|
|
||||||
"hands": "blue nails",
|
"hands": "blue nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "gold hoop earrings"
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black short-sleeved shirt",
|
"default": {
|
||||||
"outer_layer": "blue denim vest, 'RR' text on back",
|
"headwear": "black long sleeved shirt, striped sleeves",
|
||||||
"lower_body": "blue denim skirt, black leggings",
|
"top": "blue denim vest,",
|
||||||
"footwear": "brown boots",
|
"legwear": "blue denim skirt, black stockings",
|
||||||
"gloves": "",
|
"footwear": "brown boots",
|
||||||
"accessories": ""
|
"hands": "",
|
||||||
|
"accessories": "gold hoop earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "90s casual, anime, dragon ball style",
|
"aesthetic": "wasteland, mountains, anime, dragon ball style",
|
||||||
"primary_color": "blue",
|
"primary_color": "blue",
|
||||||
"secondary_color": "black",
|
"secondary_color": "black",
|
||||||
"tertiary_color": "white"
|
"tertiary_color": "white"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, small build, loli, fair skin",
|
"base_specs": "1girl, small build, loli, fair skin",
|
||||||
"hair": "short pink hair, two small horns (hair ornaments)",
|
"hair": "short pink hair, two small horns (hair ornaments)",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "smirk",
|
|
||||||
"hands": "pink nails",
|
"hands": "pink nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "flat chest",
|
"torso": "flat chest",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black Eden Academy uniform, gold trim",
|
"headwear": "",
|
||||||
"lower_body": "uniform skirt",
|
"top": "black Eden Academy uniform, gold trim",
|
||||||
"footwear": "black shoes, white socks",
|
"legwear": "uniform skirt",
|
||||||
"gloves": "",
|
"footwear": "black shoes, white socks",
|
||||||
"accessories": "black and gold hair cones"
|
"hands": "",
|
||||||
|
"accessories": "black and gold hair cones"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "cute, academic, spy x family style",
|
"aesthetic": "cute, academic, spy x family style",
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
"base_specs": "1girl, horse ears, horse tail, tall",
|
||||||
"hair": "long grey hair, wild hair",
|
"hair": "long grey hair, wild hair",
|
||||||
"eyes": "purple eyes, red framed glasses",
|
"eyes": "purple eyes, red framed glasses",
|
||||||
"expression": "thinking",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "tracen school uniform",
|
"headwear": "white shirt",
|
||||||
"lower_body": "pleated skirt",
|
"top": "tracen school uniform",
|
||||||
"footwear": "heeled shoes",
|
"legwear": "pleated skirt",
|
||||||
"gloves": "",
|
"footwear": "heeled shoes",
|
||||||
"accessories": ""
|
"hands": "",
|
||||||
|
"accessories": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "intellectual, cool",
|
"aesthetic": "library,intellectual,",
|
||||||
"primary_color": "maroon",
|
"primary_color": "maroon",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "grey"
|
"tertiary_color": "grey"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "turquoise hair, ponytail",
|
"hair": "turquoise hair, ponytail",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "energetic smile",
|
|
||||||
"hands": "turquoise nails",
|
"hands": "turquoise nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black playboy bunny",
|
"headwear": "",
|
||||||
"lower_body": "pantyhose",
|
"top": "black playboy bunny",
|
||||||
"footwear": "red high heels",
|
"legwear": "pantyhose",
|
||||||
"gloves": "detatched cuffs",
|
"footwear": "red high heels",
|
||||||
"accessories": "red hair ribbon, dragon radar"
|
"hands": "detatched cuffs",
|
||||||
|
"accessories": "red hair ribbon"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "retro-futuristic, anime, dragon ball style",
|
"aesthetic": "wasteland, anime, dragon ball style",
|
||||||
"primary_color": "pink",
|
"primary_color": "pink",
|
||||||
"secondary_color": "turquoise",
|
"secondary_color": "turquoise",
|
||||||
"tertiary_color": "purple"
|
"tertiary_color": "purple"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, curvaceous build, fair skin",
|
"base_specs": "1girl, curvaceous build, fair skin",
|
||||||
"hair": "long wavy lavender hair, hair covering one eye",
|
"hair": "long wavy lavender hair, hair covering one eye",
|
||||||
"eyes": "purple eyes",
|
"eyes": "purple eyes",
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "purple nails",
|
"hands": "purple nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "black headband with horns"
|
"extra": "black headband with horns"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black armor, cleavage",
|
"headwear": "",
|
||||||
"lower_body": "black leggings, armored plates",
|
"top": "black armor, cleavage",
|
||||||
"footwear": "black armored boots",
|
"legwear": "black leggings, armored plates",
|
||||||
"gloves": "",
|
"footwear": "black armored boots",
|
||||||
"accessories": "purple cape, large axe"
|
"hands": "",
|
||||||
|
"accessories": "purple cape, large axe"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "dark fantasy, gothic, fire emblem style",
|
"aesthetic": "dark fantasy, gothic, fire emblem style",
|
||||||
|
|||||||
45
characters/camilla_(fire_emblem).json
Normal file
45
characters/camilla_(fire_emblem).json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"character_id": "camilla_(fire_emblem)",
|
||||||
|
"character_name": "Camilla Nohr",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "1girl, curvaceous build, fair skin",
|
||||||
|
"hair": "long wavy lavender hair, hair covering one eye",
|
||||||
|
"eyes": "purple eyes",
|
||||||
|
"hands": "purple nails",
|
||||||
|
"arms": "",
|
||||||
|
"torso": "large breasts",
|
||||||
|
"pelvis": "",
|
||||||
|
"legs": "",
|
||||||
|
"feet": "",
|
||||||
|
"extra": "black tiara"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "belt between breasts",
|
||||||
|
"top": "black armor, gold trim, cleavage",
|
||||||
|
"legwear": "purple sash, pelvic curtain, black panties",
|
||||||
|
"footwear": "black armored thigh boots",
|
||||||
|
"hands": "purple velvet gloves",
|
||||||
|
"accessories": "purple cape, large axe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "battlefield,night,gothic, fire emblem style",
|
||||||
|
"primary_color": "black",
|
||||||
|
"secondary_color": "gold",
|
||||||
|
"tertiary_color": "purple"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Looks/fecamilla-illu-nvwls-v2.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": ""
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"Fire Emblem"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, muscular build, fair skin",
|
"base_specs": "1girl, muscular build, fair skin",
|
||||||
"hair": "long blonde hair, twin braids",
|
"hair": "long blonde hair, twin braids",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "serious look",
|
|
||||||
"hands": "green nails",
|
"hands": "green nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "scar on left cheek, green camouflage paint on legs"
|
"extra": "scar on left cheek, green camouflage paint on legs"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "green high-leg leotard",
|
"headwear": "",
|
||||||
"lower_body": "bare legs",
|
"top": "green high-leg leotard",
|
||||||
"footwear": "black combat boots, green socks",
|
"legwear": "bare legs",
|
||||||
"gloves": "red gauntlets",
|
"footwear": "black combat boots, green socks",
|
||||||
"accessories": "red beret"
|
"hands": "red gauntlets",
|
||||||
|
"accessories": "red beret"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "military, athletic, street fighter style",
|
"aesthetic": "aurora,above valley,stone bridge, street fighter style",
|
||||||
"primary_color": "green",
|
"primary_color": "green",
|
||||||
"secondary_color": "red",
|
"secondary_color": "red",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, muscular build, fair skin, asian",
|
"base_specs": "1girl, muscular build, fair skin, asian",
|
||||||
"hair": "black hair, hair buns",
|
"hair": "black hair, hair buns",
|
||||||
"eyes": "brown eyes",
|
"eyes": "brown eyes",
|
||||||
"expression": "determined smile",
|
|
||||||
"hands": "blue nails",
|
"hands": "blue nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "thick thighs",
|
"legs": "thick thighs",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "blue qipao, gold embroidery, white accents",
|
"headwear": "",
|
||||||
"lower_body": "brown tights",
|
"top": "blue qipao, gold embroidery, white accents, puffy shoulders",
|
||||||
"footwear": "white combat boots",
|
"legwear": "brown tights",
|
||||||
"gloves": "",
|
"footwear": "white lace-up boots",
|
||||||
"accessories": "white hair ribbons, spiked bracelets"
|
"hands": "",
|
||||||
|
"accessories": "white hair ribbons, spiked bracelets"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "chinese style",
|
"aesthetic": "chinese style, market,",
|
||||||
"primary_color": "blue",
|
"primary_color": "blue",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, athletic build",
|
"base_specs": "1girl, athletic build",
|
||||||
"hair": "ashen grey hair, messy bun",
|
"hair": "ashen grey hair, messy bun",
|
||||||
"eyes": "emerald green eyes, mascara",
|
"eyes": "emerald green eyes, mascara",
|
||||||
"expression": "determined look",
|
|
||||||
"hands": "green nails",
|
"hands": "green nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "scar over eye"
|
"extra": "scar over eye"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white blouse",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "white blouse",
|
||||||
"lower_body": "brown leather trousers",
|
"top": "",
|
||||||
"footwear": "brown leather boots",
|
"legwear": "brown leather trousers",
|
||||||
"gloves": "brown leather gloves",
|
"footwear": "brown leather boots",
|
||||||
"accessories": "silver sword on back, witcher medallion"
|
"hands": "brown leather gloves",
|
||||||
|
"accessories": "silver sword on back, witcher medallion"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gritty, fantasy, witcher style",
|
"aesthetic": "gritty, fantasy, witcher style",
|
||||||
|
|||||||
@@ -4,36 +4,43 @@
|
|||||||
"identity": {
|
"identity": {
|
||||||
"base_specs": "1girl, milf, gyaru, tall",
|
"base_specs": "1girl, milf, gyaru, tall",
|
||||||
"hair": "blonde hair, long hair",
|
"hair": "blonde hair, long hair",
|
||||||
"eyes": "sharp eyes",
|
"eyes": "sharp eyes, black eyes, white pupil,",
|
||||||
"expression": "smirk, sharp teeth",
|
|
||||||
"hands": "painted nails",
|
"hands": "painted nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "very large breasts",
|
"torso": "very large breasts",
|
||||||
"pelvis": "wide hips",
|
"pelvis": "wide hips",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "painted nails",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "biege sweater, cleavage",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "cleavage",
|
||||||
"lower_body": "pencil skirt",
|
"top": "light brown sweater, ",
|
||||||
"footwear": "high heels",
|
"legwear": "black skirt",
|
||||||
"gloves": "",
|
"footwear": "red high heels",
|
||||||
"accessories": "necklace, rings"
|
"hands": "",
|
||||||
|
"accessories": "necklace, rings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gyaru, milf, pink leopard print",
|
"aesthetic": "living room",
|
||||||
"primary_color": "pink",
|
"primary_color": "pink",
|
||||||
"secondary_color": "black",
|
"secondary_color": "black",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "Illustrious/Looks/Gyaru_mom_Flim13_IL_V1.safetensors",
|
"lora_name": "Illustrious/Looks/Gyaru_mom_Flim13_IL_V1.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"Original","flim13"
|
"Original",
|
||||||
|
"flim13"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
"base_specs": "1girl, horse ears, horse tail, tall",
|
||||||
"hair": "blonde hair, wavy hair",
|
"hair": "blonde hair, wavy hair",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "confident expression",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "tracen school uniform",
|
"headwear": "white shirt",
|
||||||
"lower_body": "pleated skirt",
|
"top": "tracen school uniform",
|
||||||
"footwear": "heeled shoes",
|
"legwear": "pleated skirt",
|
||||||
"gloves": "",
|
"footwear": "heeled shoes",
|
||||||
"accessories": "choker, earrings"
|
"hands": "",
|
||||||
|
"accessories": "choker, earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fashionable, model",
|
"aesthetic": "shopping,modeling,school yard",
|
||||||
"primary_color": "gold",
|
"primary_color": "gold",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
"base_specs": "1girl, horse ears, horse tail, tall",
|
||||||
"hair": "grey hair, short hair",
|
"hair": "grey hair, short hair",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "crazy expression, grin",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "tracen school uniform",
|
"headwear": "white shirt",
|
||||||
"lower_body": "pleated skirt",
|
"top": "tracen school uniform",
|
||||||
"footwear": "heeled shoes",
|
"legwear": "pleated skirt",
|
||||||
"gloves": "",
|
"footwear": "heeled shoes",
|
||||||
"accessories": "ear covers, hat"
|
"hands": "",
|
||||||
|
"accessories": "ear covers, hat"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "energetic, sporty",
|
"aesthetic": "horse race track,energetic, sporty",
|
||||||
"primary_color": "red",
|
"primary_color": "red",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long turquoise hair, twin tails, floor-length",
|
"hair": "long turquoise hair, twin tails, floor-length",
|
||||||
"eyes": "turquoise eyes",
|
"eyes": "turquoise eyes",
|
||||||
"expression": "cheerful smile",
|
|
||||||
"hands": "turquoise nails",
|
"hands": "turquoise nails",
|
||||||
"arms": "01 tattoo on left shoulder",
|
"arms": "01 tattoo on left shoulder",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "grey sleeveless shirt, turquoise tie",
|
"headwear": "",
|
||||||
"lower_body": "grey miniskirt, turquoise trim",
|
"top": "grey sleeveless shirt, turquoise tie",
|
||||||
"footwear": "black thigh-high boots, turquoise trim",
|
"legwear": "grey miniskirt, turquoise trim",
|
||||||
"gloves": "black arm warmers, turquoise trim",
|
"footwear": "black thigh-high boots, turquoise trim",
|
||||||
"accessories": "hair ornament, headset"
|
"hands": "black arm warmers, turquoise trim",
|
||||||
|
"accessories": "hair ornament, headset"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "vocaloid, futuristic, anime style",
|
"aesthetic": "concert, stage, vocaloid, futuristic, anime style",
|
||||||
"primary_color": "teal",
|
"primary_color": "teal",
|
||||||
"secondary_color": "grey",
|
"secondary_color": "grey",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
47
characters/jasmine_disney.json
Normal file
47
characters/jasmine_disney.json
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"character_id": "jasmine_disney",
|
||||||
|
"character_name": "Jasmine",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "1girl, dark skin, ",
|
||||||
|
"hair": "black hair, long hair, voluminous hair, banded hair, sectioned hair",
|
||||||
|
"eyes": "brown eyes, ",
|
||||||
|
"hands": "teal nails",
|
||||||
|
"arms": "",
|
||||||
|
"torso": "medium breasts",
|
||||||
|
"pelvis": "narrow waist",
|
||||||
|
"legs": "",
|
||||||
|
"feet": "",
|
||||||
|
"extra": "heavy eyeliner, winged eyeliner"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "teal crop top, tube top, off-shoulder, cleavage",
|
||||||
|
"top": "",
|
||||||
|
"legwear": "teal harem pants, baggy pants, sheer fabric",
|
||||||
|
"footwear": "gold shoes, curling toes, pointed shoes",
|
||||||
|
"hands": "",
|
||||||
|
"accessories": "gold hoop earrings, large gold necklace, blue headband, jewel on headband"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "desert palace, large fountain, arabian, disney, cartoon, vibrant, ferns",
|
||||||
|
"primary_color": "teal",
|
||||||
|
"secondary_color": "gold",
|
||||||
|
"tertiary_color": "black"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Looks/Jasmine-IL_V2.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": ""
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"Aladdin",
|
||||||
|
"princess",
|
||||||
|
"disney"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -2,34 +2,40 @@
|
|||||||
"character_id": "jessica_rabbit",
|
"character_id": "jessica_rabbit",
|
||||||
"character_name": "Jessica Rabbit",
|
"character_name": "Jessica Rabbit",
|
||||||
"identity": {
|
"identity": {
|
||||||
"base_specs": "1girl, voluptuous build, tall,",
|
"base_specs": "1girl, tall,",
|
||||||
"hair": "long red hair, side part, hair over one eye",
|
"hair": "long red hair, side part, hair over one eye",
|
||||||
"eyes": "green eyes, heavy makeup, purple eyeshadow",
|
"eyes": "green eyes, heavy makeup, purple eyeshadow",
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "purple elbow gloves",
|
"hands": "purple elbow gloves",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "narrow waist",
|
"pelvis": "very narrow waist",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "red lips"
|
"extra": "red lips"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "red sequin dress, strapless, high slit, backless",
|
"headwear": "",
|
||||||
"lower_body": "side_slit,",
|
"top": "red sequin dress, strapless, high slit, backless",
|
||||||
"footwear": "red high heels",
|
"legwear": "side slit,",
|
||||||
"gloves": "purple opera gloves",
|
"footwear": "red high heels",
|
||||||
"accessories": "gold earrings, glitter"
|
"hands": "purple opera gloves",
|
||||||
|
"accessories": "gold earrings, glitter"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "noir, cartoon, glamorous",
|
"aesthetic": "jazz club,noir,",
|
||||||
"primary_color": "red",
|
"primary_color": "red",
|
||||||
"secondary_color": "purple",
|
"secondary_color": "purple",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/JessicaRabbitXL_character-12-IL.safetensors",
|
||||||
"lora_weight": 0.8,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long magenta hair, curved back",
|
"hair": "long magenta hair, curved back",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "arrogant smirk",
|
|
||||||
"hands": "white nails",
|
"hands": "white nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "green earrings"
|
"extra": "green earrings"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black crop top",
|
"default": {
|
||||||
"outer_layer": "white Team Rocket uniform jacket, bare stomach, red R logo",
|
"headwear": "black crop top",
|
||||||
"lower_body": "white miniskirt",
|
"top": "white Team Rocket uniform jacket, bare stomach, red R logo",
|
||||||
"footwear": "black thigh-high boots",
|
"legwear": "white miniskirt",
|
||||||
"gloves": "black elbow gloves",
|
"footwear": "black thigh-high boots",
|
||||||
"accessories": "green earrings"
|
"hands": "black elbow gloves",
|
||||||
|
"accessories": "green earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "villainous, anime, pokemon style",
|
"aesthetic": "villainous, anime, pokemon style",
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, pale skin,",
|
"base_specs": "1girl, slender build, pale skin,",
|
||||||
"hair": "long aqua hair, twin braids, very long hair, bangs",
|
"hair": "long aqua hair, twin braids, very long hair, bangs",
|
||||||
"eyes": "pink eyes, ",
|
"eyes": "pink eyes, ",
|
||||||
"expression": "crazy eyes, crazy smile",
|
|
||||||
"hands": "black and pink nails",
|
"hands": "black and pink nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "flat chest,",
|
"torso": "flat chest,",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "cloud tattoo,"
|
"extra": "cloud tattoo,"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "pink and black bikini, asymmetrical_bikini ",
|
"headwear": "",
|
||||||
"lower_body": "pink shorts, single pink stocking",
|
"top": "pink and black bikini, asymmetrical_bikini ",
|
||||||
"footwear": "combat boots",
|
"legwear": "pink shorts, single pink stocking",
|
||||||
"gloves": "black fingerless gloves, fishnet elbow gloves,",
|
"footwear": "combat boots",
|
||||||
"accessories": "ammo belts, choker, bullet necklace,"
|
"hands": "black fingerless gloves, fishnet elbow gloves,",
|
||||||
|
"accessories": "ammo belts, choker, bullet necklace,"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "punk, chaotic,",
|
"aesthetic": "punk, chaotic,",
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, petite",
|
"base_specs": "1girl, petite",
|
||||||
"hair": "blonde hair, short hair, hair bow",
|
"hair": "blonde hair, short hair, hair bow",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "smile, energetic",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "detached sleeves",
|
"arms": "detached sleeves",
|
||||||
"torso": "flat chest",
|
"torso": "flat chest",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "leg warmers",
|
"legs": "leg warmers",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt, sailor collar",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "white shirt, sailor collar",
|
||||||
"lower_body": "black shorts, yellow belt",
|
"top": "",
|
||||||
"footwear": "white shoes",
|
"legwear": "black shorts, yellow belt",
|
||||||
"gloves": "",
|
"footwear": "white shoes",
|
||||||
"accessories": "headset, hair bow"
|
"hands": "",
|
||||||
|
"accessories": "headset, hair bow"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "vocaloid, cyber",
|
"aesthetic": "concert, stage, vocaloid, cyber",
|
||||||
"primary_color": "yellow",
|
"primary_color": "yellow",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long brown hair, half-ponytail, bangs",
|
"hair": "long brown hair, half-ponytail, bangs",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "determined smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "dark blue witch robes",
|
"headwear": "white shirt",
|
||||||
"lower_body": "dark blue skirt",
|
"top": "dark blue witch robes",
|
||||||
"footwear": "brown boots, white socks",
|
"legwear": "dark blue skirt",
|
||||||
"gloves": "",
|
"footwear": "brown boots, white socks",
|
||||||
"accessories": "pointed witch hat, brown belt, magic wand"
|
"hands": "",
|
||||||
|
"accessories": "pointed witch hat, brown belt, magic wand"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fantasy, magical girl, little witch academia style",
|
"aesthetic": "fantasy, magical girl, little witch academia style",
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin, fox ears",
|
"base_specs": "1girl, slender build, fair skin, fox ears",
|
||||||
"hair": "long blonde hair, flowing",
|
"hair": "long blonde hair, flowing",
|
||||||
"eyes": "yellow eyes",
|
"eyes": "yellow eyes",
|
||||||
"expression": "charming smile",
|
|
||||||
"hands": "silver nails",
|
"hands": "silver nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "whisker markings on cheeks, crystal tails"
|
"extra": "whisker markings on cheeks, crystal tails"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "silver crop top",
|
"default": {
|
||||||
"outer_layer": "white and silver jacket",
|
"headwear": "silver crop top",
|
||||||
"lower_body": "black leather shorts",
|
"top": "white and silver jacket",
|
||||||
"footwear": "black thigh-high boots",
|
"legwear": "black leather shorts",
|
||||||
"gloves": "",
|
"footwear": "black thigh-high boots",
|
||||||
"accessories": "crystal heart, silver jewelry"
|
"hands": "",
|
||||||
|
"accessories": "crystal heart, silver jewelry"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "pop star, mystical, k/da style",
|
"aesthetic": "pop star, mystical, k/da style",
|
||||||
@@ -34,6 +40,9 @@
|
|||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
"League of Legends",
|
||||||
|
"K/DA",
|
||||||
|
"KDA",
|
||||||
|
"K-Pop"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, athletic build, fair skin",
|
"base_specs": "1girl, athletic build, fair skin",
|
||||||
"hair": "long dark blue hair, blonde streaks, high ponytail",
|
"hair": "long dark blue hair, blonde streaks, high ponytail",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "cool, rebellious look",
|
|
||||||
"hands": "blue nails",
|
"hands": "blue nails",
|
||||||
"arms": "tattoos on arms",
|
"arms": "tattoos on arms",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black crop top",
|
"default": {
|
||||||
"outer_layer": "blue and silver motorcycle jacket",
|
"headwear": "black crop top",
|
||||||
"lower_body": "black leather pants",
|
"top": "blue and silver motorcycle jacket",
|
||||||
"footwear": "blue sneakers",
|
"legwear": "black leather pants",
|
||||||
"gloves": "black fingerless gloves",
|
"footwear": "blue sneakers",
|
||||||
"accessories": "kama and kunai"
|
"hands": "black fingerless gloves",
|
||||||
|
"accessories": "kama and kunai"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "pop star, street, k/da style",
|
"aesthetic": "pop star, street, k/da style",
|
||||||
@@ -34,6 +40,9 @@
|
|||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
"League of Legends",
|
||||||
|
"K/DA",
|
||||||
|
"KDA",
|
||||||
|
"K-Pop"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, curvaceous build, fair skin",
|
"base_specs": "1girl, curvaceous build, fair skin",
|
||||||
"hair": "light blue hair,",
|
"hair": "light blue hair,",
|
||||||
"eyes": "yellow glowing eyes, slit pupils",
|
"eyes": "yellow glowing eyes, slit pupils",
|
||||||
"expression": "seductive, confident look",
|
|
||||||
"hands": "metal claws",
|
"hands": "metal claws",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "two long lashers (shadow tendrils)"
|
"extra": "two long lashers (shadow tendrils)"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black leather bra",
|
"default": {
|
||||||
"outer_layer": "iridescent blue jacket, fur collar",
|
"headwear": "black leather bra",
|
||||||
"lower_body": "black leather skirt",
|
"top": "iridescent blue jacket, fur collar",
|
||||||
"footwear": "black high-heeled boots",
|
"legwear": "black leather skirt",
|
||||||
"gloves": "",
|
"footwear": "black high-heeled boots",
|
||||||
"accessories": "diamond earrings"
|
"hands": "",
|
||||||
|
"accessories": "diamond earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "pop star, glamorous, k/da style",
|
"aesthetic": "pop star, glamorous, k/da style",
|
||||||
@@ -34,6 +40,9 @@
|
|||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
"League of Legends",
|
||||||
|
"K/DA",
|
||||||
|
"KDA",
|
||||||
|
"K-Pop"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, athletic build, fair skin",
|
"base_specs": "1girl, athletic build, fair skin",
|
||||||
"hair": "long hair, purple hair, hair ornament, ponytail, green highlights",
|
"hair": "long hair, purple hair, hair ornament, ponytail, green highlights",
|
||||||
"eyes": "purple eyes",
|
"eyes": "purple eyes",
|
||||||
"expression": "focused expression",
|
|
||||||
"hands": "silver nails",
|
"hands": "silver nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "silver bodysuit",
|
"default": {
|
||||||
"outer_layer": "white and silver jacket",
|
"headwear": "silver bodysuit",
|
||||||
"lower_body": "silver leggings",
|
"top": "white and silver jacket",
|
||||||
"footwear": "silver high-heeled boots",
|
"legwear": "silver leggings",
|
||||||
"gloves": "",
|
"footwear": "silver high-heeled boots",
|
||||||
"accessories": "crystal shoulder pods"
|
"hands": "",
|
||||||
|
"accessories": "crystal shoulder pods"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "pop star, futuristic, k/da style",
|
"aesthetic": "pop star, futuristic, k/da style",
|
||||||
@@ -34,6 +40,9 @@
|
|||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
"League of Legends",
|
||||||
|
"K/DA",
|
||||||
|
"KDA",
|
||||||
|
"K-Pop"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender build, pale skin, asian",
|
"base_specs": "1girl, slender build, pale skin, asian",
|
||||||
"hair": "long dark purple hair, hime cut,",
|
"hair": "long dark purple hair, hime cut,",
|
||||||
"eyes": "dark purple eyes,",
|
"eyes": "dark purple eyes,",
|
||||||
"expression": "neutral expression, stoic, cat ears",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "black pantyhose",
|
"legs": "black pantyhose",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "itan private high school uniform, blazer, striped bow tie",
|
"headwear": "white shirt",
|
||||||
"lower_body": "plaid skirt",
|
"top": "itan private high school uniform, blazer, striped bow tie",
|
||||||
"footwear": "loafers",
|
"legwear": "plaid skirt",
|
||||||
"gloves": "",
|
"footwear": "loafers",
|
||||||
"accessories": ""
|
"hands": "",
|
||||||
|
"accessories": ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "anime, manga, clean lines",
|
"aesthetic": "blackboard,anime, manga, clean lines",
|
||||||
"primary_color": "purple",
|
"primary_color": "purple",
|
||||||
"secondary_color": "magenta",
|
"secondary_color": "magenta",
|
||||||
"tertiary_color": "white"
|
"tertiary_color": "white"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, athletic build,",
|
"base_specs": "1girl, athletic build,",
|
||||||
"hair": "long brown hair, single braid",
|
"hair": "long brown hair, single braid",
|
||||||
"eyes": "brown eyes",
|
"eyes": "brown eyes",
|
||||||
"expression": "light smile, raised eyebrow",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "teal tank top,",
|
"headwear": "",
|
||||||
"lower_body": "brown shorts",
|
"top": "teal tank top,",
|
||||||
"footwear": "brown combat boots, red laces",
|
"legwear": "brown shorts",
|
||||||
"gloves": "black fingerless gloves",
|
"footwear": "brown combat boots, red laces",
|
||||||
"accessories": "dual thigh pistol holsters, brown leatherbackpack, red circular sunglasses"
|
"hands": "black fingerless gloves",
|
||||||
|
"accessories": "dual thigh pistol holsters, brown leatherbackpack, red round sunglasses"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "adventure, retro, 90s style",
|
"aesthetic": "adventurer, ruins, retro, 90s style",
|
||||||
"primary_color": "teal",
|
"primary_color": "teal",
|
||||||
"secondary_color": "brown",
|
"secondary_color": "brown",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, tall, mature female",
|
"base_specs": "1girl, tall, mature female",
|
||||||
"hair": "brown hair, wavy hair, side ponytail",
|
"hair": "brown hair, wavy hair, side ponytail",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "detached sleeves",
|
"arms": "detached sleeves",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "wide hips",
|
"pelvis": "wide hips",
|
||||||
"legs": "black pantyhose",
|
"legs": "black pantyhose",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "beauty mark"
|
"extra": "beauty mark"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "purple dress, corset",
|
"default": {
|
||||||
"outer_layer": "purple shawl",
|
"headwear": "purple dress, corset",
|
||||||
"lower_body": "slit skirt",
|
"top": "purple shawl",
|
||||||
"footwear": "black heels",
|
"legwear": "slit skirt",
|
||||||
"gloves": "purple gloves",
|
"footwear": "black heels",
|
||||||
"accessories": "witch hat, rose, necklace"
|
"hands": "purple gloves",
|
||||||
|
"accessories": "witch hat, rose, necklace"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "genshin impact, witch, librarian",
|
"aesthetic": "library, genshin impact, witch",
|
||||||
"primary_color": "purple",
|
"primary_color": "purple",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
|
|||||||
@@ -5,32 +5,38 @@
|
|||||||
"base_specs": "1girl, curvaceous build, fair skin",
|
"base_specs": "1girl, curvaceous build, fair skin",
|
||||||
"hair": "long black hair, complex braids, hairpins",
|
"hair": "long black hair, complex braids, hairpins",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "thinking, raised eyebrow",
|
|
||||||
"hands": "black nails",
|
"hands": "black nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "dark purple lipstick"
|
"extra": "dark purple lipstick"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black corset",
|
"default": {
|
||||||
"outer_layer": "black fur-trimmed dress, many belts on front",
|
"headwear": "black corset",
|
||||||
"lower_body": "long skirt made of belts",
|
"top": "black fur-trimmed dress, many belts on front",
|
||||||
"footwear": "black boots",
|
"legwear": "long skirt made of belts",
|
||||||
"gloves": "",
|
"footwear": "black boots",
|
||||||
"accessories": "moogle doll, silver jewelry"
|
"hands": "",
|
||||||
|
"accessories": "moogle doll, silver jewelry"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gothic, ornate, final fantasy x style",
|
"aesthetic": "exotic flowers, gothic, ornate, final fantasy x style",
|
||||||
"primary_color": "black",
|
"primary_color": "black",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "purple"
|
"tertiary_color": "purple"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "Illustrious/Looks/Lulu DG illuLoRA_1337272.safetensors",
|
"lora_name": "Illustrious/Looks/Lulu DG illuLoRA_1337272.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.9,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
|||||||
@@ -5,32 +5,38 @@
|
|||||||
"base_specs": "1girl, curvaceous build, pink skin",
|
"base_specs": "1girl, curvaceous build, pink skin",
|
||||||
"hair": "long voluminous white hair",
|
"hair": "long voluminous white hair",
|
||||||
"eyes": "red eyes, black sclera",
|
"eyes": "red eyes, black sclera",
|
||||||
"expression": "evil smile",
|
|
||||||
"hands": "black claws, pink nails",
|
"hands": "black claws, pink nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "pink skin, long tail, pointy ears"
|
"extra": "pink skin, long tail, pointy ears"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black tube top",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "black tube top",
|
||||||
"lower_body": "white harem pants",
|
"top": "",
|
||||||
"footwear": "black and yellow boots",
|
"legwear": "white harem pants",
|
||||||
"gloves": "black sleeves",
|
"footwear": "black and yellow boots",
|
||||||
"accessories": "gold bracelets, gold neck ring, hoop earrings"
|
"hands": "black sleeves",
|
||||||
|
"accessories": "gold bracelets, gold neck ring, hoop earrings,pink donut"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "supernatural, anime, dragon ball style",
|
"aesthetic": "wasteland,pink ,anime, dragon ball style",
|
||||||
"primary_color": "pink",
|
"primary_color": "pink",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "gold"
|
"tertiary_color": "gold"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/Android_21v2.1.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin, asian",
|
"base_specs": "1girl, slender build, fair skin, asian",
|
||||||
"hair": "long blonde hair, pink tips",
|
"hair": "long blonde hair, pink tips",
|
||||||
"eyes": "pink eyes (contacts)",
|
"eyes": "pink eyes (contacts)",
|
||||||
"expression": "excited smile",
|
|
||||||
"hands": "long pink nails",
|
"hands": "long pink nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "piercings"
|
"extra": "piercings"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "white school shirt, loosely tied blue tie",
|
"headwear": "black bikini with yellow flower print",
|
||||||
"lower_body": "blue plaid miniskirt",
|
"top": "white school shirt, loosely tied blue tie",
|
||||||
"footwear": "black loafers, black socks",
|
"legwear": "blue plaid miniskirt",
|
||||||
"gloves": "",
|
"footwear": "black loafers, black socks",
|
||||||
"accessories": "choker, various bracelets"
|
"hands": "",
|
||||||
|
"accessories": "choker, colored bracelets"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gyaru, modern, anime style",
|
"aesthetic": "gyaru, modern, anime style, sewing machine",
|
||||||
"primary_color": "white",
|
"primary_color": "white",
|
||||||
"secondary_color": "blue",
|
"secondary_color": "blue",
|
||||||
"tertiary_color": "pink"
|
"tertiary_color": "pink"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, tall, mature female",
|
"base_specs": "1girl, tall, mature female",
|
||||||
"hair": "pink hair, long hair",
|
"hair": "pink hair, long hair",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "light smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "crop top, detached sleeves, gold trim",
|
"headwear": "",
|
||||||
"lower_body": "side slit, lace-up skirt",
|
"top": "crop top, detached sleeves, gold trim",
|
||||||
"footwear": "thinghighs, lace-up boots, gold boots, gold armlet",
|
"legwear": "side slit, lace-up skirt",
|
||||||
"gloves": "",
|
"footwear": "thinghighs, lace-up boots, gold boots, gold armlet",
|
||||||
"accessories": "headset"
|
"hands": "",
|
||||||
|
"accessories": "headset"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "vocaloid, elegant",
|
"aesthetic": "concert, stage,vocaloid, elegant",
|
||||||
"primary_color": "black",
|
"primary_color": "black",
|
||||||
"secondary_color": "gold",
|
"secondary_color": "gold",
|
||||||
"tertiary_color": "pink"
|
"tertiary_color": "pink"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, mature female",
|
"base_specs": "1girl, mature female",
|
||||||
"hair": "brown hair, short hair",
|
"hair": "brown hair, short hair",
|
||||||
"eyes": "brown eyes",
|
"eyes": "brown eyes",
|
||||||
"expression": "smile, confident",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "red crop top, sleeveless",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "red crop top, sleeveless",
|
||||||
"lower_body": "red skirt, mini skirt",
|
"top": "",
|
||||||
"footwear": "brown boots",
|
"legwear": "red skirt, mini skirt",
|
||||||
"gloves": "",
|
"footwear": "brown boots",
|
||||||
"accessories": "choker"
|
"hands": "",
|
||||||
|
"accessories": "choker"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "vocaloid, casual",
|
"aesthetic": "concert, stage, vocaloid, casual",
|
||||||
"primary_color": "red",
|
"primary_color": "red",
|
||||||
"secondary_color": "brown",
|
"secondary_color": "brown",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,32 +5,38 @@
|
|||||||
"base_specs": "1girl, athletic build, dark skin",
|
"base_specs": "1girl, athletic build, dark skin",
|
||||||
"hair": "long hair, light blue highlights",
|
"hair": "long hair, light blue highlights",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "confident smile",
|
|
||||||
"hands": "blue nails",
|
"hands": "blue nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "blue earrings"
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white and blue bikini top",
|
"default": {
|
||||||
"outer_layer": "gym uniform, number 049",
|
"headwear": "white crop top, blue trim",
|
||||||
"lower_body": "white and blue shorts",
|
"top": "gym uniform, number '049'",
|
||||||
"footwear": "blue and white sandals",
|
"legwear": "midriff, white and blue shorts, black trim",
|
||||||
"gloves": "",
|
"footwear": "white and blue sandals, orange trim",
|
||||||
"accessories": "wristband, life buoy, pokeball"
|
"hands": "fingerless gloves",
|
||||||
|
"accessories": "wristband, small life buoy, pokeball, gold hoop earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "sporty, aquatic, pokemon style",
|
"aesthetic": "arena,water,aquatic, pokemon style",
|
||||||
"primary_color": "blue",
|
"primary_color": "blue",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "orange"
|
"tertiary_color": "orange"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/NessaBeaIXL_v2.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, tall, mature female",
|
"base_specs": "1girl, tall, mature female",
|
||||||
"hair": "blonde hair, long hair, hair over one eye",
|
"hair": "blonde hair, long hair, hair over one eye",
|
||||||
"eyes": "blue eyes, sharp eyes",
|
"eyes": "blue eyes, sharp eyes",
|
||||||
"expression": "serious",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "thick lips"
|
"extra": "thick lips"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black shirt",
|
"default": {
|
||||||
"outer_layer": "blue military coat, fur collar",
|
"headwear": "black shirt",
|
||||||
"lower_body": "black pants",
|
"top": "blue military coat, fur collar",
|
||||||
"footwear": "black boots",
|
"legwear": "black pants",
|
||||||
"gloves": "black gloves",
|
"footwear": "black boots",
|
||||||
"accessories": "sword"
|
"hands": "black gloves",
|
||||||
|
"accessories": "sword"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "military, amestris uniform",
|
"aesthetic": "military, amestris uniform",
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long blonde hair, voluminous, crown",
|
"hair": "long blonde hair, voluminous, crown",
|
||||||
"eyes": "blue eyes, long eyelashes",
|
"eyes": "blue eyes, long eyelashes",
|
||||||
"expression": "gentle smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "pink lips, blue earrings"
|
"extra": "pink lips, blue earrings"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white petticoat",
|
"default": {
|
||||||
"outer_layer": "pink floor-length ball gown, puffy sleeves, dark pink panniers",
|
"headwear": "white petticoat",
|
||||||
"lower_body": "long skirt",
|
"top": "pink floor-length ball gown, puffy sleeves, dark pink panniers",
|
||||||
"footwear": "red high heels",
|
"legwear": "long skirt",
|
||||||
"gloves": "white opera gloves",
|
"footwear": "red high heels",
|
||||||
"accessories": "gold crown with red and blue jewels, blue brooch"
|
"hands": "white opera gloves",
|
||||||
|
"accessories": "gold crown with red and blue jewels, blue brooch"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "royal, whimsical, nintendo style",
|
"aesthetic": "royal, whimsical, nintendo style",
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin, pointed ears",
|
"base_specs": "1girl, slender build, fair skin, pointed ears",
|
||||||
"hair": "long blonde hair, braided, gold hair clips",
|
"hair": "long blonde hair, braided, gold hair clips",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "curious",
|
|
||||||
"hands": "gold nails",
|
"hands": "gold nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "tri-force symbol, elf ears"
|
"extra": "tri-force symbol, elf ears"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "blue tunic",
|
"default": {
|
||||||
"outer_layer": "blue champion's tunic, brown leather belts",
|
"headwear": "blue tunic",
|
||||||
"lower_body": "tan trousers",
|
"top": "blue champion's tunic, brown leather belts",
|
||||||
"footwear": "brown leather boots",
|
"legwear": "tan trousers",
|
||||||
"gloves": "brown fingerless gloves",
|
"footwear": "brown leather boots",
|
||||||
"accessories": "sheikah slate, gold jewelry"
|
"hands": "brown fingerless gloves",
|
||||||
|
"accessories": "sheikah slate, gold jewelry"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fantasy, adventurous, zelda style",
|
"aesthetic": "fantasy, adventurous, zelda style",
|
||||||
@@ -29,8 +35,8 @@
|
|||||||
"tertiary_color": "brown"
|
"tertiary_color": "brown"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/Zelda.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, petite, horse ears, horse tail",
|
"base_specs": "1girl, petite, horse ears, horse tail",
|
||||||
"hair": "long dark brown hair, bangs, hair over one eye",
|
"hair": "long dark brown hair, bangs, hair over one eye",
|
||||||
"eyes": "purple eyes",
|
"eyes": "purple eyes",
|
||||||
"expression": "shy expression",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white shirt",
|
"default": {
|
||||||
"outer_layer": "tracen school uniform",
|
"headwear": "white shirt",
|
||||||
"lower_body": "pleated skirt",
|
"top": "tracen school uniform",
|
||||||
"footwear": "heeled shoes",
|
"legwear": "pleated skirt",
|
||||||
"gloves": "",
|
"footwear": "heeled shoes",
|
||||||
"accessories": "blue rose, hair flower, small hat, dagger"
|
"hands": "",
|
||||||
|
"accessories": "blue rose, hair flower, small hat,"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gothic lolita, elegant",
|
"aesthetic": "outdoors,umbrella,rain,gothic lolita, elegant",
|
||||||
"primary_color": "purple",
|
"primary_color": "purple",
|
||||||
"secondary_color": "blue",
|
"secondary_color": "blue",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,31 +5,37 @@
|
|||||||
"base_specs": "1girl, young, dark skin, gerudo",
|
"base_specs": "1girl, young, dark skin, gerudo",
|
||||||
"hair": "short red hair, braided ponytail, gold hair ornament",
|
"hair": "short red hair, braided ponytail, gold hair ornament",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "serious",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "darkblue lipstick,"
|
"extra": "dark blue lipstick,"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black top, blue sash",
|
"headwear": "",
|
||||||
"lower_body": "black skirt, pelvic curtain,",
|
"top": "black top, gold trim",
|
||||||
"footwear": "gold high heels",
|
"legwear": "black sarong, pelvic curtain,",
|
||||||
"gloves": "",
|
"footwear": "black high heels, gold trim",
|
||||||
"accessories": "gold jewelry, earrings"
|
"hands": "",
|
||||||
|
"accessories": "gold jewelry, earrings,"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fantasy, desert, gerudo style",
|
"aesthetic": "lightning,fantasy, desert, gerudo, zelda style",
|
||||||
"primary_color": "gold",
|
"primary_color": "gold",
|
||||||
"secondary_color": "black",
|
"secondary_color": "black",
|
||||||
"tertiary_color": "red"
|
"tertiary_color": "red"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/RijuTotK_IXL_v3.safetensors",
|
||||||
"lora_weight": 0.8,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, tall, slender build, fair skin",
|
"base_specs": "1girl, tall, slender build, fair skin",
|
||||||
"hair": "long platinum blonde hair, side-swept bangs covering one eye",
|
"hair": "long platinum blonde hair, side-swept bangs covering one eye",
|
||||||
"eyes": "light blue eyes",
|
"eyes": "light blue eyes",
|
||||||
"expression": "serene expression",
|
|
||||||
"hands": "turquoise nails",
|
"hands": "turquoise nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "star-shaped earrings"
|
"extra": "star-shaped earrings"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "turquoise off-the-shoulder gown, silver trim",
|
"headwear": "",
|
||||||
"lower_body": "long skirt",
|
"top": "turquoise off-the-shoulder gown, silver trim",
|
||||||
"footwear": "silver high heels",
|
"legwear": "long skirt",
|
||||||
"gloves": "",
|
"footwear": "silver high heels",
|
||||||
"accessories": "silver crown with blue jewels, star wand, luma"
|
"hands": "",
|
||||||
|
"accessories": "silver crown with blue jewels, star wand, luma"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "celestial, elegant, nintendo style",
|
"aesthetic": "celestial, elegant, mario style, stars, night,",
|
||||||
"primary_color": "turquoise",
|
"primary_color": "turquoise",
|
||||||
"secondary_color": "silver",
|
"secondary_color": "silver",
|
||||||
"tertiary_color": "yellow"
|
"tertiary_color": "yellow"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, anthro, bat girl, white fur",
|
"base_specs": "1girl, anthro, bat girl, white fur",
|
||||||
"hair": "short white hair",
|
"hair": "short white hair",
|
||||||
"eyes": "teal eyes",
|
"eyes": "teal eyes",
|
||||||
"expression": "sly smirk",
|
|
||||||
"hands": "white gloves",
|
"hands": "white gloves",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "bat wings, eyeshadow"
|
"extra": "bat wings, eyeshadow"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black skin-tight jumpsuit, pink heart-shaped chest plate, bare shoulders, cleavage",
|
"headwear": "",
|
||||||
"lower_body": "jumpsuit",
|
"top": "black skin-tight jumpsuit, pink heart-shaped chest plate, bare shoulders, cleavage",
|
||||||
"footwear": "white boots, pink heart motifs",
|
"legwear": "jumpsuit",
|
||||||
"gloves": "white gloves, pink cuffs",
|
"footwear": "white boots, pink heart motifs",
|
||||||
"accessories": "blue eyeshadow"
|
"hands": "white gloves, pink cuffs",
|
||||||
|
"accessories": "blue eyeshadow"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "jewels, museum,sleek, spy, sonic style",
|
"aesthetic": "gems,jewels, sleek, spy, sonic style",
|
||||||
"primary_color": "white",
|
"primary_color": "white",
|
||||||
"secondary_color": "pink",
|
"secondary_color": "pink",
|
||||||
"tertiary_color": "black"
|
"tertiary_color": "black"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slim build,",
|
"base_specs": "1girl, slim build,",
|
||||||
"hair": "long teal hair, spiky, voluminous",
|
"hair": "long teal hair, spiky, voluminous",
|
||||||
"eyes": "golden eyes, cat-like pupils",
|
"eyes": "golden eyes, cat-like pupils",
|
||||||
"expression": "confident smirk",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "red gem on forehead,"
|
"extra": "red gem on forehead,"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "long white dress, plunging neckline, black belt",
|
"default": {
|
||||||
"outer_layer": "black and orange long sleeve jacket with purple trim,",
|
"headwear": "long white dress, plunging neckline, black belt",
|
||||||
"lower_body": "side_slit,, red trousers",
|
"top": "black and orange long sleeve jacket with purple trim,",
|
||||||
"footwear": "",
|
"legwear": "side_slit,, red trousers",
|
||||||
"gloves": "red gloves",
|
"footwear": "",
|
||||||
"accessories": "red gems, wristbands"
|
"hands": "red gloves",
|
||||||
|
"accessories": "red gems, wristbands"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "90s anime, sci-fi",
|
"aesthetic": "90s anime, sci-fi",
|
||||||
@@ -34,6 +40,7 @@
|
|||||||
"lora_triggers": "ryouko hakubi, space pirate"
|
"lora_triggers": "ryouko hakubi, space pirate"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"Tenchi Muyou!", "Tenchi Muyo!"
|
"Tenchi Muyou!",
|
||||||
|
"Tenchi Muyo!"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
49
characters/sam_totally_spies.json
Normal file
49
characters/sam_totally_spies.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"character_id": "sam_totally_spies",
|
||||||
|
"character_name": "Sam",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "1girl, slim body, fair skin",
|
||||||
|
"hair": "long hair, orange hair, wavy hair, loose hair",
|
||||||
|
"eyes": "green eyes",
|
||||||
|
"hands": "green nails",
|
||||||
|
"arms": "",
|
||||||
|
"torso": "small breasts",
|
||||||
|
"pelvis": "narrow hips",
|
||||||
|
"legs": "",
|
||||||
|
"feet": "",
|
||||||
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "green bodysuit, catsuit, skin tight",
|
||||||
|
"top": "",
|
||||||
|
"legwear": "",
|
||||||
|
"footwear": "heels ",
|
||||||
|
"hands": "green bodysuit",
|
||||||
|
"accessories": "silver belt, heart buckle"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "western cartoon, 2000s style, cel shaded, girly, hearts, pastel",
|
||||||
|
"primary_color": "green",
|
||||||
|
"secondary_color": "orange",
|
||||||
|
"tertiary_color": "silver"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": "sam (totally spies!), green bodysuit, orange hair"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"sam (totally spies!)",
|
||||||
|
"totally spies!",
|
||||||
|
"solo",
|
||||||
|
"western cartoon",
|
||||||
|
"spy"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, athletic build, fair skin",
|
"base_specs": "1girl, athletic build, fair skin",
|
||||||
"hair": "long blonde hair, ponytail",
|
"hair": "long blonde hair, ponytail",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "serious expression",
|
|
||||||
"hands": "blue nails",
|
"hands": "blue nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "beauty mark on chin"
|
"extra": "beauty mark on chin"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "blue skin-tight bodysuit, pink symbols",
|
"headwear": "",
|
||||||
"lower_body": "bodysuit",
|
"top": "blue skin-tight bodysuit, pink symbols",
|
||||||
"footwear": "blue high-heeled boots",
|
"legwear": "bodysuit",
|
||||||
"gloves": "zero suit",
|
"footwear": "blue high-heeled boots",
|
||||||
"accessories": "paralyzer pistol"
|
"hands": "zero suit",
|
||||||
|
"accessories": "paralyzer pistol"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "sci-fi, sleek, metroid style",
|
"aesthetic": "sci-fi, sleek, metroid style",
|
||||||
|
|||||||
@@ -5,32 +5,38 @@
|
|||||||
"base_specs": "1girl, loli, small build",
|
"base_specs": "1girl, loli, small build",
|
||||||
"hair": "blonde hair, short hair",
|
"hair": "blonde hair, short hair",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "flat chest",
|
"torso": "flat chest",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "grey t-shirt, white shirt",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "grey t-shirt, white shirt",
|
||||||
"lower_body": "blue jeans",
|
"top": "",
|
||||||
"footwear": "sneakers",
|
"legwear": "blue jeans",
|
||||||
"gloves": "",
|
"footwear": "sneakers",
|
||||||
"accessories": "wristwatch"
|
"hands": "",
|
||||||
|
"accessories": "wristwatch"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "casual, 2013 fashion",
|
"aesthetic": "casual, 2013 fashion, living room",
|
||||||
"primary_color": "grey",
|
"primary_color": "grey",
|
||||||
"secondary_color": "blue",
|
"secondary_color": "blue",
|
||||||
"tertiary_color": "white"
|
"tertiary_color": "white"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/Sarah_Miller_Illustrious.safetensors",
|
||||||
"lora_weight": 1.0,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
|||||||
51
characters/scarlet_ff7.json
Normal file
51
characters/scarlet_ff7.json
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"character_id": "scarlet_ff7",
|
||||||
|
"character_name": "Scarlet",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "1girl, mature female, voluptuous, ",
|
||||||
|
"hair": "blonde hair, wavy hair, short hair, swept back",
|
||||||
|
"eyes": "blue eyes, narrow eyes, eyeshadow",
|
||||||
|
"hands": "manicured nails, red nails",
|
||||||
|
"arms": "",
|
||||||
|
"torso": "large breasts, cleavage",
|
||||||
|
"pelvis": "curvy, wide hips",
|
||||||
|
"legs": "",
|
||||||
|
"feet": "",
|
||||||
|
"extra": "red lipstick, heavy makeup"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "",
|
||||||
|
"top": "red dress, formal dress, pencil dress, sleeveless, chest cutout",
|
||||||
|
"legwear": "long skirt, high slit, side slit,black stockings",
|
||||||
|
"footwear": "high heels, red heels, stiletto heels",
|
||||||
|
"hands": "",
|
||||||
|
"accessories": "jewelry, gold earrings, necklace"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "corporate, sci-fi, low lighting",
|
||||||
|
"primary_color": "red",
|
||||||
|
"secondary_color": "gold",
|
||||||
|
"tertiary_color": "black"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Looks/ffscarlet-illu-nvwls-v2.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": ""
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"final fantasy vii",
|
||||||
|
"shinra",
|
||||||
|
"antagonist",
|
||||||
|
"milf",
|
||||||
|
"red dress",
|
||||||
|
"blonde hair",
|
||||||
|
"smirk"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, dark skin, pointy ears",
|
"base_specs": "1girl, dark skin, pointy ears",
|
||||||
"hair": "purple hair, very long hair, ponytail",
|
"hair": "purple hair, very long hair, ponytail",
|
||||||
"eyes": "blue eyes",
|
"eyes": "blue eyes",
|
||||||
"expression": "smile, energetic",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "gold bracelets",
|
"arms": "gold bracelets",
|
||||||
"torso": "small breasts, perky breasts",
|
"torso": "small breasts, perky breasts",
|
||||||
"pelvis": "wide hips",
|
"pelvis": "wide hips",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "red bikini top, red harem pants, gold trim",
|
"headwear": "",
|
||||||
"lower_body": "",
|
"top": "red bikini top, red harem pants, gold trim",
|
||||||
"footwear": "gold shoes",
|
"legwear": "",
|
||||||
"gloves": "",
|
"footwear": "gold shoes",
|
||||||
"accessories": "gold tiara, hoop earrings"
|
"hands": "",
|
||||||
|
"accessories": "gold tiara, hoop earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "genie, dancer, arabian",
|
"aesthetic": "genie, dancer, arabian",
|
||||||
|
|||||||
46
characters/sorceress_dragons_crown.json
Normal file
46
characters/sorceress_dragons_crown.json
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"character_id": "sorceress_dragons_crown",
|
||||||
|
"character_name": "Sorceress",
|
||||||
|
"identity": {
|
||||||
|
"base_specs": "1girl, mature female,",
|
||||||
|
"hair": "long hair, red hair, wavy hair",
|
||||||
|
"eyes": "green eyes, ",
|
||||||
|
"hands": "painted nails",
|
||||||
|
"arms": "bare shoulders, sleeveless",
|
||||||
|
"torso": "huge breasts, cleavage, ",
|
||||||
|
"pelvis": "wide hips, ",
|
||||||
|
"legs": "thick thighs, ",
|
||||||
|
"feet": "",
|
||||||
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
|
},
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "white top",
|
||||||
|
"top": "black corset,, clothing cutout, low cut, witch hat",
|
||||||
|
"legwear": "skirt, high slit, side slit",
|
||||||
|
"footwear": "boots, ",
|
||||||
|
"hands": "",
|
||||||
|
"accessories": "staff, necklace, bracelets, jewelry, wooden staff"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"styles": {
|
||||||
|
"aesthetic": "fantasy, vanillaware, oil painting (style), exaggerated proportions",
|
||||||
|
"primary_color": "black",
|
||||||
|
"secondary_color": "purple",
|
||||||
|
"tertiary_color": "gold"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Looks/Sorceress iIlluLoRA DG.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": ""
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"dragon's crown",
|
||||||
|
"witch"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, lanky build, pale skin",
|
"base_specs": "1girl, lanky build, pale skin",
|
||||||
"hair": "light purple hair, hair covering one eye",
|
"hair": "light purple hair, hair covering one eye",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "deadpan expression",
|
|
||||||
"hands": "black nails",
|
"hands": "black nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "narrow waist",
|
"pelvis": "narrow waist",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "dark circles under eyes"
|
"extra": "dark circles under eyes"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "dark purple witch robes",
|
"headwear": "",
|
||||||
"lower_body": "long skirt with frayed edges",
|
"top": "dark purple witch robes",
|
||||||
"footwear": "brown boots",
|
"legwear": "long skirt with frayed edges",
|
||||||
"gloves": "",
|
"footwear": "brown boots",
|
||||||
"accessories": "pointed witch hat, potion bottle"
|
"hands": "",
|
||||||
|
"accessories": "pointed witch hat, potion bottle"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "gothic, whimsical, little witch academia style",
|
"aesthetic": "mushroom, gothic, whimsical, little witch academia style",
|
||||||
"primary_color": "purple",
|
"primary_color": "purple",
|
||||||
"secondary_color": "mauve",
|
"secondary_color": "mauve",
|
||||||
"tertiary_color": "green"
|
"tertiary_color": "green"
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, athletic build, fair skin",
|
"base_specs": "1girl, athletic build, fair skin",
|
||||||
"hair": "long black hair, tied end",
|
"hair": "long black hair, tied end",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "kind smile",
|
|
||||||
"hands": "dark red nails",
|
"hands": "dark red nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "black sports bra",
|
"default": {
|
||||||
"outer_layer": "white tank top, black suspenders",
|
"headwear": "black sports bra",
|
||||||
"lower_body": "black miniskirt",
|
"top": "white tank top, black suspenders",
|
||||||
"footwear": "red boots, black socks",
|
"legwear": "black miniskirt",
|
||||||
"gloves": "red fingerless gloves",
|
"footwear": "red boots, thigh high black socks",
|
||||||
"accessories": "silver earrings"
|
"hands": "red fingerless gloves",
|
||||||
|
"accessories": "silver earrings"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "urban, martial arts, final fantasy style",
|
"aesthetic": "martial arts, final fantasy style",
|
||||||
"primary_color": "white",
|
"primary_color": "white",
|
||||||
"secondary_color": "black",
|
"secondary_color": "black",
|
||||||
"tertiary_color": "red"
|
"tertiary_color": "red"
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "short spiky brown hair",
|
"hair": "short spiky brown hair",
|
||||||
"eyes": "brown eyes",
|
"eyes": "brown eyes",
|
||||||
"expression": "energetic smile",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "freckles"
|
"extra": "freckles"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "orange leggings",
|
"default": {
|
||||||
"outer_layer": "brown flight jacket, yellow vest",
|
"headwear": "orange leggings",
|
||||||
"lower_body": "orange leggings",
|
"top": "brown flight jacket, yellow vest",
|
||||||
"footwear": "white and orange sneakers",
|
"legwear": "orange leggings",
|
||||||
"gloves": "",
|
"footwear": "white and orange sneakers",
|
||||||
"accessories": "chronal accelerator, yellow goggles"
|
"hands": "",
|
||||||
|
"accessories": "chronal accelerator, yellow goggles"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "sci-fi, pilot, overwatch style",
|
"aesthetic": "sci-fi, pilot, overwatch style",
|
||||||
|
|||||||
@@ -5,31 +5,37 @@
|
|||||||
"base_specs": "1girl, tall, muscular, dark skin, gerudo",
|
"base_specs": "1girl, tall, muscular, dark skin, gerudo",
|
||||||
"hair": "long red hair, wild hair",
|
"hair": "long red hair, wild hair",
|
||||||
"eyes": "green eyes",
|
"eyes": "green eyes",
|
||||||
"expression": "confident",
|
|
||||||
"hands": "gold nails",
|
"hands": "gold nails",
|
||||||
"arms": "muscular arms",
|
"arms": "muscular arms",
|
||||||
"torso": "abs, mediumS breasts",
|
"torso": "abs, medium breasts",
|
||||||
"pelvis": "wide hips",
|
"pelvis": "wide hips",
|
||||||
"legs": "muscular legs",
|
"legs": "muscular legs",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "dark blue lipstick, gerudo markings"
|
"extra": "dark blue lipstick, gerudo markings"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "blue top, blue champion's skirt, green sash, green shoulder guards,",
|
"headwear": "",
|
||||||
"lower_body": "blue skirt",
|
"top": "blue top, green sash, green shoulder guards,",
|
||||||
"footwear": "gold heels",
|
"legwear": "blue sarong",
|
||||||
"gloves": "",
|
"footwear": "anklet, gold heels",
|
||||||
"accessories": "gold jewelry, scimitar"
|
"hands": "",
|
||||||
|
"accessories": "gold jewelry, scimitar"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fantasy, warrior, gerudo style",
|
"aesthetic": "oasis,desert ruins,fantasy, warrior, gerudo style",
|
||||||
"primary_color": "gold",
|
"primary_color": "gold",
|
||||||
"secondary_color": "blue",
|
"secondary_color": "blue",
|
||||||
"tertiary_color": "red"
|
"tertiary_color": "red"
|
||||||
},
|
},
|
||||||
"lora": {
|
"lora": {
|
||||||
"lora_name": "",
|
"lora_name": "Illustrious/Looks/Urbosa_-_The_Legend_of_Zelda_Illustrious.safetensors",
|
||||||
"lora_weight": 0.8,
|
"lora_weight": 0.8,
|
||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, blue skin",
|
"base_specs": "1girl, slender build, blue skin",
|
||||||
"hair": "long purple hair, ponytail",
|
"hair": "long purple hair, ponytail",
|
||||||
"eyes": "yellow eyes",
|
"eyes": "yellow eyes",
|
||||||
"expression": "cold expression",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "spider tattoo on arm",
|
"arms": "spider tattoo on arm",
|
||||||
"torso": "large breasts",
|
"torso": "large breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "blue skin"
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "purple tactical bodysuit, plunging neckline",
|
"headwear": "",
|
||||||
"lower_body": "bodysuit",
|
"top": "purple bodysuit, plunging neckline",
|
||||||
"footwear": "purple high-heeled boots",
|
"legwear": "bodysuit",
|
||||||
"gloves": "purple gauntlets",
|
"footwear": "purple high-heeled boots",
|
||||||
"accessories": "sniper visor, grappling hook"
|
"hands": "purple gauntlets",
|
||||||
|
"accessories": "sniper rifle, visor"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "sci-fi, assassin, overwatch style",
|
"aesthetic": "sci-fi, assassin, overwatch style",
|
||||||
|
|||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "long black hair, styled with gold headband",
|
"hair": "long black hair, styled with gold headband",
|
||||||
"eyes": "red eyes",
|
"eyes": "red eyes",
|
||||||
"expression": "gentle yet mysterious smile",
|
|
||||||
"hands": "black nails",
|
"hands": "black nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "medium breasts",
|
"torso": "medium breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black backless halter dress, red rose pattern inside",
|
"headwear": "",
|
||||||
"lower_body": "black thigh-high boots",
|
"top": "black backless halter dress, red rose pattern inside",
|
||||||
"footwear": "black boots",
|
"legwear": "black thigh-high boots",
|
||||||
"gloves": "black fingerless gloves",
|
"footwear": "black boots",
|
||||||
"accessories": "gold rose-themed headband, gold needle weapons"
|
"hands": "black fingerless gloves",
|
||||||
|
"accessories": "gold rose-themed headband, gold needle weapons"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "elegant, assassin, spy x family style",
|
"aesthetic": "elegant, assassin, spy x family style",
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, miqo'te, slender build, fair skin, cat ears",
|
"base_specs": "1girl, miqo'te, slender build, fair skin, cat ears",
|
||||||
"hair": "short white hair, bangs",
|
"hair": "short white hair, bangs",
|
||||||
"eyes": "blind, white eyes",
|
"eyes": "blind, white eyes",
|
||||||
"expression": "stoic expression",
|
|
||||||
"hands": "black nails",
|
"hands": "black nails",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "facial markings, cat tail"
|
"extra": "facial markings, cat tail"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "black sorceress robes, fur trim",
|
"headwear": "",
|
||||||
"lower_body": "long skirt",
|
"top": "black sorceress robes, fur trim",
|
||||||
"footwear": "black boots",
|
"legwear": "long skirt",
|
||||||
"gloves": "",
|
"footwear": "black boots",
|
||||||
"accessories": "wooden staff"
|
"hands": "",
|
||||||
|
"accessories": "wooden staff"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "magical, scholarly, final fantasy xiv style",
|
"aesthetic": "library, magical, scholarly, final fantasy xiv style",
|
||||||
"primary_color": "black",
|
"primary_color": "black",
|
||||||
"secondary_color": "white",
|
"secondary_color": "white",
|
||||||
"tertiary_color": "purple"
|
"tertiary_color": "purple"
|
||||||
@@ -34,6 +40,7 @@
|
|||||||
"lora_triggers": ""
|
"lora_triggers": ""
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"Final Fantasy XIV"
|
"Final Fantasy XIV",
|
||||||
|
"mi'qote"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5,22 +5,28 @@
|
|||||||
"base_specs": "1girl, slender build, fair skin",
|
"base_specs": "1girl, slender build, fair skin",
|
||||||
"hair": "short black hair, bob cut",
|
"hair": "short black hair, bob cut",
|
||||||
"eyes": "brown eyes",
|
"eyes": "brown eyes",
|
||||||
"expression": "playful grin",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "black sleeve on one arm",
|
"arms": "black sleeve on one arm",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": "headband"
|
"extra": "headband"
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "",
|
"default": {
|
||||||
"outer_layer": "green turtleneck sweater vest, midriff",
|
"headwear": "",
|
||||||
"lower_body": "beige shorts",
|
"top": "green turtleneck sweater vest, midriff",
|
||||||
"footwear": "boots, socks",
|
"legwear": "beige shorts",
|
||||||
"gloves": "fingerless glove on one hand, large gauntlet on one arm",
|
"footwear": "boots, socks",
|
||||||
"accessories": "shuriken"
|
"hands": "fingerless glove on one hand, large gauntlet on one arm",
|
||||||
|
"accessories": "shuriken"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "ninja, adventurer, final fantasy style",
|
"aesthetic": "ninja, adventurer, final fantasy style",
|
||||||
|
|||||||
@@ -5,25 +5,31 @@
|
|||||||
"base_specs": "1girl, slender, fair skin",
|
"base_specs": "1girl, slender, fair skin",
|
||||||
"hair": "short brown hair, bob cut",
|
"hair": "short brown hair, bob cut",
|
||||||
"eyes": "heterochromia, blue eye, green eye",
|
"eyes": "heterochromia, blue eye, green eye",
|
||||||
"expression": "gentle",
|
|
||||||
"hands": "",
|
"hands": "",
|
||||||
"arms": "",
|
"arms": "",
|
||||||
"torso": "small breasts",
|
"torso": "small breasts",
|
||||||
"pelvis": "",
|
"pelvis": "",
|
||||||
"legs": "",
|
"legs": "",
|
||||||
"feet": "",
|
"feet": "",
|
||||||
"distinguishing_marks": ""
|
"extra": ""
|
||||||
|
},
|
||||||
|
"defaults": {
|
||||||
|
"expression": "",
|
||||||
|
"pose": "",
|
||||||
|
"scene": ""
|
||||||
},
|
},
|
||||||
"wardrobe": {
|
"wardrobe": {
|
||||||
"inner_layer": "white kimono top, yellow obi",
|
"default": {
|
||||||
"outer_layer": "",
|
"headwear": "white kimono top, yellow obi",
|
||||||
"lower_body": "long blue skirt, floral pattern",
|
"top": "",
|
||||||
"footwear": "boots",
|
"legwear": "long blue skirt, floral pattern",
|
||||||
"gloves": "detached sleeves",
|
"footwear": "boots",
|
||||||
"accessories": "summoner staff, necklace"
|
"hands": "detached sleeves",
|
||||||
|
"accessories": "summoner staff, necklace"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"styles": {
|
"styles": {
|
||||||
"aesthetic": "fantasy, final fantasy x style",
|
"aesthetic": "sunset, pink sky, shrine maiden,fantasy, final fantasy x style",
|
||||||
"primary_color": "white",
|
"primary_color": "white",
|
||||||
"secondary_color": "blue",
|
"secondary_color": "blue",
|
||||||
"tertiary_color": "yellow"
|
"tertiary_color": "yellow"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ source "$VENV_DIR/bin/activate"
|
|||||||
if [ "$1" == "--clean" ]; then
|
if [ "$1" == "--clean" ]; then
|
||||||
echo "Performing clean start..."
|
echo "Performing clean start..."
|
||||||
echo "Removing database..."
|
echo "Removing database..."
|
||||||
rm -f database.db
|
rm -f database.db instance/database.db
|
||||||
echo "Clearing uploads..."
|
echo "Clearing uploads..."
|
||||||
rm -rf static/uploads/*
|
rm -rf static/uploads/*
|
||||||
fi
|
fi
|
||||||
|
|||||||
153
migrate_wardrobe.py
Normal file
153
migrate_wardrobe.py
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Migration script to convert wardrobe structure from flat to nested format.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
"wardrobe": {
|
||||||
|
"headwear": "...",
|
||||||
|
"top": "...",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
After:
|
||||||
|
"wardrobe": {
|
||||||
|
"default": {
|
||||||
|
"headwear": "...",
|
||||||
|
"top": "...",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
This enables multiple outfits per character.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_wardrobe(characters_dir: str = "characters", dry_run: bool = False):
|
||||||
|
"""
|
||||||
|
Migrate all character JSON files to the new wardrobe structure.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
characters_dir: Path to the directory containing character JSON files
|
||||||
|
dry_run: If True, only print what would be changed without modifying files
|
||||||
|
"""
|
||||||
|
characters_path = Path(characters_dir)
|
||||||
|
|
||||||
|
if not characters_path.exists():
|
||||||
|
print(f"Error: Directory '{characters_dir}' does not exist")
|
||||||
|
return
|
||||||
|
|
||||||
|
json_files = list(characters_path.glob("*.json"))
|
||||||
|
|
||||||
|
if not json_files:
|
||||||
|
print(f"No JSON files found in '{characters_dir}'")
|
||||||
|
return
|
||||||
|
|
||||||
|
migrated_count = 0
|
||||||
|
skipped_count = 0
|
||||||
|
error_count = 0
|
||||||
|
|
||||||
|
for json_file in json_files:
|
||||||
|
try:
|
||||||
|
with open(json_file, 'r', encoding='utf-8') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
# Check if character has a wardrobe
|
||||||
|
if 'wardrobe' not in data:
|
||||||
|
print(f" [SKIP] {json_file.name}: No wardrobe field")
|
||||||
|
skipped_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
wardrobe = data['wardrobe']
|
||||||
|
|
||||||
|
# Check if already migrated (wardrobe contains 'default' key with nested dict)
|
||||||
|
if 'default' in wardrobe and isinstance(wardrobe['default'], dict):
|
||||||
|
# Verify it's actually the new format (has wardrobe keys inside)
|
||||||
|
expected_keys = {'headwear', 'top', 'legwear', 'footwear', 'hands', 'accessories',
|
||||||
|
'inner_layer', 'outer_layer', 'lower_body', 'gloves'}
|
||||||
|
if any(key in wardrobe['default'] for key in expected_keys):
|
||||||
|
print(f" [SKIP] {json_file.name}: Already migrated")
|
||||||
|
skipped_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check if wardrobe is a flat structure (not already nested)
|
||||||
|
# A flat wardrobe has string values, a nested one has dict values
|
||||||
|
if not isinstance(wardrobe, dict):
|
||||||
|
print(f" [ERROR] {json_file.name}: Wardrobe is not a dictionary")
|
||||||
|
error_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check if any value is a dict (indicating partial migration or different structure)
|
||||||
|
has_nested_values = any(isinstance(v, dict) for v in wardrobe.values())
|
||||||
|
if has_nested_values:
|
||||||
|
print(f" [SKIP] {json_file.name}: Wardrobe has nested values, may already be migrated")
|
||||||
|
skipped_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Perform migration
|
||||||
|
new_wardrobe = {
|
||||||
|
"default": wardrobe
|
||||||
|
}
|
||||||
|
data['wardrobe'] = new_wardrobe
|
||||||
|
|
||||||
|
if dry_run:
|
||||||
|
print(f" [DRY-RUN] {json_file.name}: Would migrate wardrobe")
|
||||||
|
print(f" Old: {json.dumps(wardrobe, indent=2)[:100]}...")
|
||||||
|
print(f" New: {json.dumps(new_wardrobe, indent=2)[:100]}...")
|
||||||
|
else:
|
||||||
|
with open(json_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||||
|
print(f" [MIGRATED] {json_file.name}")
|
||||||
|
|
||||||
|
migrated_count += 1
|
||||||
|
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
print(f" [ERROR] {json_file.name}: Invalid JSON - {e}")
|
||||||
|
error_count += 1
|
||||||
|
except Exception as e:
|
||||||
|
print(f" [ERROR] {json_file.name}: {e}")
|
||||||
|
error_count += 1
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("=" * 50)
|
||||||
|
print(f"Migration complete:")
|
||||||
|
print(f" - Migrated: {migrated_count}")
|
||||||
|
print(f" - Skipped: {skipped_count}")
|
||||||
|
print(f" - Errors: {error_count}")
|
||||||
|
if dry_run:
|
||||||
|
print()
|
||||||
|
print("This was a dry run. No files were modified.")
|
||||||
|
print("Run with --execute to apply changes.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Migrate character wardrobe structure to support multiple outfits"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--execute",
|
||||||
|
action="store_true",
|
||||||
|
help="Actually modify files (default is dry-run)"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--dir",
|
||||||
|
default="characters",
|
||||||
|
help="Directory containing character JSON files (default: characters)"
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
print("=" * 50)
|
||||||
|
print("Wardrobe Migration Script")
|
||||||
|
print("=" * 50)
|
||||||
|
print(f"Directory: {args.dir}")
|
||||||
|
print(f"Mode: {'EXECUTE' if args.execute else 'DRY-RUN'}")
|
||||||
|
print("=" * 50)
|
||||||
|
print()
|
||||||
|
|
||||||
|
migrate_wardrobe(characters_dir=args.dir, dry_run=not args.execute)
|
||||||
28
models.py
28
models.py
@@ -6,10 +6,38 @@ class Character(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
character_id = db.Column(db.String(100), unique=True, nullable=False)
|
character_id = db.Column(db.String(100), unique=True, nullable=False)
|
||||||
slug = db.Column(db.String(100), unique=True, nullable=False)
|
slug = db.Column(db.String(100), unique=True, nullable=False)
|
||||||
|
filename = db.Column(db.String(255), nullable=True)
|
||||||
name = db.Column(db.String(100), nullable=False)
|
name = db.Column(db.String(100), nullable=False)
|
||||||
data = db.Column(db.JSON, nullable=False)
|
data = db.Column(db.JSON, nullable=False)
|
||||||
default_fields = db.Column(db.JSON, nullable=True)
|
default_fields = db.Column(db.JSON, nullable=True)
|
||||||
image_path = db.Column(db.String(255), nullable=True)
|
image_path = db.Column(db.String(255), nullable=True)
|
||||||
|
active_outfit = db.Column(db.String(100), default='default')
|
||||||
|
|
||||||
|
def get_active_wardrobe(self):
|
||||||
|
"""Get the currently active wardrobe outfit."""
|
||||||
|
wardrobe = self.data.get('wardrobe', {})
|
||||||
|
# Check if wardrobe is nested (new format) or flat (legacy)
|
||||||
|
if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict):
|
||||||
|
# New nested format - return active outfit
|
||||||
|
return wardrobe.get(self.active_outfit or 'default', wardrobe.get('default', {}))
|
||||||
|
else:
|
||||||
|
# Legacy flat format - return as-is
|
||||||
|
return wardrobe
|
||||||
|
|
||||||
|
def get_available_outfits(self):
|
||||||
|
"""Get list of available outfit names."""
|
||||||
|
wardrobe = self.data.get('wardrobe', {})
|
||||||
|
if 'default' in wardrobe and isinstance(wardrobe.get('default'), dict):
|
||||||
|
return list(wardrobe.keys())
|
||||||
|
return ['default']
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<Character {self.character_id}>'
|
return f'<Character {self.character_id}>'
|
||||||
|
|
||||||
|
class Settings(db.Model):
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
openrouter_api_key = db.Column(db.String(255), nullable=True)
|
||||||
|
openrouter_model = db.Column(db.String(100), default='google/gemini-2.0-flash-001')
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<Settings>'
|
||||||
|
|||||||
40
templates/create.html
Normal file
40
templates/create.html
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header bg-success text-white">Create New Character</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form action="{{ url_for('create_character') }}" method="post">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="name" class="form-label">Character Name</label>
|
||||||
|
<input type="text" class="form-control" id="name" name="name" placeholder="e.g. Cyberpunk Ninja" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="filename" class="form-label">Filename (Slug)</label>
|
||||||
|
<input type="text" class="form-control" id="filename" name="filename" placeholder="e.g. cyberpunk_ninja" required>
|
||||||
|
<div class="form-text">Used for the JSON file and URL. No spaces or special characters.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="prompt" class="form-label">Description / Concept</label>
|
||||||
|
<textarea class="form-control" id="prompt" name="prompt" rows="5" placeholder="Describe the character's appearance, clothing, style, and personality. The AI will generate the full profile based on this." required></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<i class="bi bi-info-circle"></i> Once created, the system will automatically attempt to generate a cover image using the new profile.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-grid">
|
||||||
|
<button type="submit" class="btn btn-success btn-lg">Create & Generate</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -79,13 +79,77 @@
|
|||||||
|
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
<h1>{{ character.name }}</h1>
|
<div>
|
||||||
|
<h1 class="mb-0">{{ character.name }}</h1>
|
||||||
|
<a href="{{ url_for('edit_character', slug=character.slug) }}" class="btn btn-sm btn-link text-decoration-none">Edit Profile</a>
|
||||||
|
</div>
|
||||||
<a href="/" class="btn btn-outline-secondary">Back to Gallery</a>
|
<a href="/" class="btn btn-outline-secondary">Back to Gallery</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Outfit Switcher -->
|
||||||
|
{% set outfits = character.get_available_outfits() %}
|
||||||
|
{% if outfits|length > 1 %}
|
||||||
|
<div class="card mb-4 border-primary">
|
||||||
|
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
|
||||||
|
<span><i class="bi bi-shirt"></i> Active Outfit</span>
|
||||||
|
<span class="badge bg-light text-primary">{{ character.active_outfit or 'default' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form action="{{ url_for('switch_outfit', slug=character.slug) }}" method="post" class="row g-2">
|
||||||
|
<div class="col-auto flex-grow-1">
|
||||||
|
<select name="outfit" class="form-select" id="outfit-select">
|
||||||
|
{% for outfit in outfits %}
|
||||||
|
<option value="{{ outfit }}" {% if outfit == character.active_outfit %}selected{% endif %}>
|
||||||
|
{{ outfit }}
|
||||||
|
</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<button type="submit" class="btn btn-primary">Switch</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<form id="generate-form" action="{{ url_for('generate_image', slug=character.slug) }}" method="post">
|
<form id="generate-form" action="{{ url_for('generate_image', slug=character.slug) }}" method="post">
|
||||||
{% for section, details in character.data.items() %}
|
{% for section, details in character.data.items() %}
|
||||||
{% if section not in ['character_id', 'tags', 'name'] and details is mapping %}
|
{% if section == 'wardrobe' %}
|
||||||
|
{# Special handling for wardrobe - show active outfit #}
|
||||||
|
{% set active_wardrobe = character.get_active_wardrobe() %}
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-light d-flex justify-content-between align-items-center">
|
||||||
|
<strong>
|
||||||
|
Wardrobe
|
||||||
|
{% if outfits|length > 1 %}
|
||||||
|
<span class="badge bg-secondary ms-2">{{ character.active_outfit or 'default' }}</span>
|
||||||
|
{% endif %}
|
||||||
|
</strong>
|
||||||
|
{% if outfits|length > 1 %}
|
||||||
|
<a href="{{ url_for('edit_character', slug=character.slug) }}#outfits" class="btn btn-sm btn-outline-secondary">Manage Outfits</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<dl class="row mb-0">
|
||||||
|
{% for key, value in active_wardrobe.items() %}
|
||||||
|
<dt class="col-sm-4 text-capitalize">
|
||||||
|
<input class="form-check-input me-1" type="checkbox" name="include_field" value="wardrobe::{{ key }}"
|
||||||
|
{% if preferences is not none %}
|
||||||
|
{% if 'wardrobe::' + key in preferences %}checked{% endif %}
|
||||||
|
{% elif character.default_fields is not none %}
|
||||||
|
{% if 'wardrobe::' + key in character.default_fields %}checked{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{% if value %}checked{% endif %}
|
||||||
|
{% endif %}>
|
||||||
|
{{ key.replace('_', ' ') }}
|
||||||
|
</dt>
|
||||||
|
<dd class="col-sm-8">{{ value if value else '--' }}</dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% elif section not in ['character_id', 'tags', 'name'] and details is mapping %}
|
||||||
<div class="card mb-4">
|
<div class="card mb-4">
|
||||||
<div class="card-header bg-light text-capitalize"><strong>{{ section.replace('_', ' ') }}</strong></div>
|
<div class="card-header bg-light text-capitalize"><strong>{{ section.replace('_', ' ') }}</strong></div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
|||||||
240
templates/edit.html
Normal file
240
templates/edit.html
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
|
<h1>Edit Profile: {{ character.name }}</h1>
|
||||||
|
<a href="{{ url_for('detail', slug=character.slug) }}" class="btn btn-outline-secondary">Cancel</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ url_for('edit_character', slug=character.slug) }}" method="post" id="main-form">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<!-- Basic Info -->
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-dark text-white">Basic Information</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="character_name" class="form-label">Display Name</label>
|
||||||
|
<input type="text" class="form-control" id="character_name" name="character_name" value="{{ character.name }}" required>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="tags" class="form-label">Tags (comma separated)</label>
|
||||||
|
<input type="text" class="form-control" id="tags" name="tags" value="{{ character.data.tags | join(', ') }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- LoRA -->
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-info text-white">LoRA Settings</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<label for="lora_lora_name" class="form-label">LoRA Name</label>
|
||||||
|
<select class="form-select" id="lora_lora_name" name="lora_lora_name">
|
||||||
|
<option value="">None</option>
|
||||||
|
{% for lora in loras %}
|
||||||
|
<option value="{{ lora }}" {% if character.data.lora.lora_name == lora %}selected{% endif %}>{{ lora }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label for="lora_lora_weight" class="form-label">Weight</label>
|
||||||
|
<input type="number" step="0.01" class="form-control" id="lora_lora_weight" name="lora_lora_weight" value="{{ character.data.lora.lora_weight }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3">
|
||||||
|
<label for="lora_lora_triggers" class="form-label">Triggers</label>
|
||||||
|
<input type="text" class="form-control" id="lora_lora_triggers" name="lora_lora_triggers" value="{{ character.data.lora.lora_triggers }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Identity Section -->
|
||||||
|
{% if character.data.identity %}
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-light"><strong>Identity</strong></div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% for key, value in character.data.identity.items() %}
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="identity_{{ key }}" class="form-label text-capitalize">{{ key.replace('_', ' ') }}</label>
|
||||||
|
<input type="text" class="form-control" id="identity_{{ key }}" name="identity_{{ key }}" value="{{ value }}">
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- Defaults Section -->
|
||||||
|
{% if character.data.defaults %}
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-light"><strong>Defaults</strong></div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% for key, value in character.data.defaults.items() %}
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="defaults_{{ key }}" class="form-label text-capitalize">{{ key.replace('_', ' ') }}</label>
|
||||||
|
<input type="text" class="form-control" id="defaults_{{ key }}" name="defaults_{{ key }}" value="{{ value }}">
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- Wardrobe Section - Show all outfits with tabs -->
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-light d-flex justify-content-between align-items-center">
|
||||||
|
<strong>Wardrobe</strong>
|
||||||
|
<button type="button" class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#addOutfitModal">
|
||||||
|
<i class="bi bi-plus-lg"></i> Add Outfit
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% set wardrobe_data = character.data.wardrobe %}
|
||||||
|
{% set outfits = character.get_available_outfits() %}
|
||||||
|
{% if wardrobe_data.default is defined and wardrobe_data.default is mapping %}
|
||||||
|
{# New nested format - show tabs for each outfit #}
|
||||||
|
<ul class="nav nav-tabs mb-3" id="wardrobeTabs" role="tablist">
|
||||||
|
{% for outfit_name in outfits %}
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link {% if loop.first %}active{% endif %}" id="outfit-{{ outfit_name }}-tab" data-bs-toggle="tab" data-bs-target="#outfit-{{ outfit_name }}" type="button" role="tab">
|
||||||
|
{{ outfit_name }}
|
||||||
|
{% if outfit_name == character.active_outfit %}
|
||||||
|
<span class="badge bg-primary ms-1">Active</span>
|
||||||
|
{% endif %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content" id="wardrobeTabContent">
|
||||||
|
{% for outfit_name in outfits %}
|
||||||
|
<div class="tab-pane fade {% if loop.first %}show active{% endif %}" id="outfit-{{ outfit_name }}" role="tabpanel">
|
||||||
|
<div class="d-flex justify-content-end mb-2">
|
||||||
|
{% if outfit_name != 'default' %}
|
||||||
|
<div class="btn-group btn-group-sm">
|
||||||
|
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#renameOutfitModal" data-outfit="{{ outfit_name }}">Rename</button>
|
||||||
|
<form action="{{ url_for('delete_outfit', slug=character.slug) }}" method="post" class="d-inline" onsubmit="return confirm('Delete outfit \'{{ outfit_name }}\'?');">
|
||||||
|
<input type="hidden" name="outfit" value="{{ outfit_name }}">
|
||||||
|
<button type="submit" class="btn btn-outline-danger">Delete</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% for key, value in wardrobe_data[outfit_name].items() %}
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="wardrobe_{{ outfit_name }}_{{ key }}" class="form-label text-capitalize">{{ key.replace('_', ' ') }}</label>
|
||||||
|
<input type="text" class="form-control" id="wardrobe_{{ outfit_name }}_{{ key }}" name="wardrobe_{{ outfit_name }}_{{ key }}" value="{{ value }}">
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
{# Legacy flat format #}
|
||||||
|
{% for key, value in wardrobe_data.items() %}
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="wardrobe_{{ key }}" class="form-label text-capitalize">{{ key.replace('_', ' ') }}</label>
|
||||||
|
<input type="text" class="form-control" id="wardrobe_{{ key }}" name="wardrobe_{{ key }}" value="{{ value }}">
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Styles Section -->
|
||||||
|
{% if character.data.styles %}
|
||||||
|
<div class="card mb-4">
|
||||||
|
<div class="card-header bg-light"><strong>Styles</strong></div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% for key, value in character.data.styles.items() %}
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="styles_{{ key }}" class="form-label text-capitalize">{{ key.replace('_', ' ') }}</label>
|
||||||
|
<input type="text" class="form-control" id="styles_{{ key }}" name="styles_{{ key }}" value="{{ value }}">
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="mb-5">
|
||||||
|
<button type="submit" class="btn btn-primary btn-lg w-100">Save Changes to JSON</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="sticky-top" style="top: 20px;">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header bg-warning text-dark">Notice</div>
|
||||||
|
<div class="card-body small">
|
||||||
|
<p>Saving changes here will overwrite the original JSON file in the <code>characters/</code> folder.</p>
|
||||||
|
<p>Character ID (<code>{{ character.character_id }}</code>) cannot be changed via the GUI to maintain file and URL consistency.</p>
|
||||||
|
<hr>
|
||||||
|
<p><strong>Outfits:</strong> Add multiple outfits using the "Add Outfit" button in the Wardrobe section. Switch between them on the character detail page.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Add Outfit Modal -->
|
||||||
|
<div class="modal fade" id="addOutfitModal" tabindex="-1" aria-labelledby="addOutfitModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<form action="{{ url_for('add_outfit', slug=character.slug) }}" method="post">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="addOutfitModalLabel">Add New Outfit</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="newOutfitName" class="form-label">Outfit Name</label>
|
||||||
|
<input type="text" class="form-control" id="newOutfitName" name="outfit_name" placeholder="e.g., casual, formal, swimwear">
|
||||||
|
<div class="form-text">Name will be converted to lowercase with underscores.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" class="btn btn-success">Add Outfit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rename Outfit Modal -->
|
||||||
|
<div class="modal fade" id="renameOutfitModal" tabindex="-1" aria-labelledby="renameOutfitModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<form action="{{ url_for('rename_outfit', slug=character.slug) }}" method="post">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="renameOutfitModalLabel">Rename Outfit</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<input type="hidden" name="old_name" id="renameOldName">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="renameNewName" class="form-label">New Name</label>
|
||||||
|
<input type="text" class="form-control" id="renameNewName" name="new_name" placeholder="Enter new outfit name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||||
|
<button type="submit" class="btn btn-primary">Rename</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Populate rename modal with current outfit name
|
||||||
|
document.getElementById('renameOutfitModal').addEventListener('show.bs.modal', function (event) {
|
||||||
|
var button = event.relatedTarget;
|
||||||
|
var outfitName = button.getAttribute('data-outfit');
|
||||||
|
document.getElementById('renameOldName').value = outfitName;
|
||||||
|
document.getElementById('renameNewName').value = outfitName;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
@@ -18,7 +18,9 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<a class="navbar-brand" href="/">Character Browser</a>
|
<a class="navbar-brand" href="/">Character Browser</a>
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
|
<a href="/create" class="btn btn-outline-success me-2">Create Character</a>
|
||||||
<a href="/generator" class="btn btn-outline-light me-2">Generator</a>
|
<a href="/generator" class="btn btn-outline-light me-2">Generator</a>
|
||||||
|
<a href="/settings" class="btn btn-outline-light">Settings</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
96
templates/settings.html
Normal file
96
templates/settings.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header bg-dark text-white">Application Settings</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form method="post">
|
||||||
|
<h5 class="card-title mb-3">LLM Configuration (OpenRouter)</h5>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="api_key" class="form-label">OpenRouter API Key</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="password" class="form-control" id="api_key" name="api_key" value="{{ settings.openrouter_api_key or '' }}">
|
||||||
|
<button class="btn btn-outline-secondary" type="button" id="connect-btn">Connect & Load Models</button>
|
||||||
|
</div>
|
||||||
|
<div class="form-text">Required for AI text generation features.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="model" class="form-label">Model Selection</label>
|
||||||
|
<select class="form-select" id="model" name="model">
|
||||||
|
<option value="{{ settings.openrouter_model }}" selected>{{ settings.openrouter_model }}</option>
|
||||||
|
</select>
|
||||||
|
<div class="form-text">Click "Connect" above to load the latest available models.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-grid">
|
||||||
|
<button type="submit" class="btn btn-primary">Save Settings</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const connectBtn = document.getElementById('connect-btn');
|
||||||
|
const apiKeyInput = document.getElementById('api_key');
|
||||||
|
const modelSelect = document.getElementById('model');
|
||||||
|
const currentModel = "{{ settings.openrouter_model }}";
|
||||||
|
|
||||||
|
connectBtn.addEventListener('click', async () => {
|
||||||
|
const apiKey = apiKeyInput.value;
|
||||||
|
if (!apiKey) {
|
||||||
|
alert('Please enter an API Key first.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connectBtn.disabled = true;
|
||||||
|
connectBtn.textContent = 'Connecting...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('api_key', apiKey);
|
||||||
|
|
||||||
|
const response = await fetch('/get_openrouter_models', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (data.error) {
|
||||||
|
alert('Error: ' + data.error);
|
||||||
|
} else {
|
||||||
|
// Clear and populate dropdown
|
||||||
|
modelSelect.innerHTML = '';
|
||||||
|
data.models.sort((a, b) => a.name.localeCompare(b.name)).forEach(model => {
|
||||||
|
const option = document.createElement('option');
|
||||||
|
option.value = model.id;
|
||||||
|
option.textContent = model.name;
|
||||||
|
if (model.id === currentModel) {
|
||||||
|
option.selected = true;
|
||||||
|
}
|
||||||
|
modelSelect.appendChild(option);
|
||||||
|
});
|
||||||
|
alert('Model list loaded successfully!');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
alert('Failed to connect to OpenRouter.');
|
||||||
|
} finally {
|
||||||
|
connectBtn.disabled = false;
|
||||||
|
connectBtn.textContent = 'Connect & Load Models';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user