Compare commits
27 Commits
fixes
...
d756ea1d0e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d756ea1d0e | ||
|
|
79bbf669e2 | ||
|
|
5e4348ebc1 | ||
|
|
1b8a798c31 | ||
|
|
d95b81dde5 | ||
|
|
ec08eb5d31 | ||
|
|
2c1c3a7ed7 | ||
|
|
ee36caccd6 | ||
|
|
e226548471 | ||
|
|
b9196ef5f5 | ||
|
|
a38915b354 | ||
|
|
da55b0889b | ||
|
|
9b143e65b1 | ||
|
|
27d2a70867 | ||
|
|
3c828a170f | ||
|
|
ae7ba961c1 | ||
|
|
0b8802deb5 | ||
| 0d7d4d404f | |||
|
|
615c400024 | ||
| bb65486995 | |||
|
|
8487b177b4 | ||
| 116941673e | |||
|
|
467c90594c | ||
| a4a21051a5 | |||
|
|
c0e6cff7b7 | ||
| 369c92e3ea | |||
|
|
5aede18ad5 |
8
.dockerignore
Normal file
8
.dockerignore
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
venv/
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
instance/
|
||||||
|
flask_session/
|
||||||
|
static/uploads/
|
||||||
|
tools/
|
||||||
|
.git/
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -31,3 +31,6 @@ Thumbs.db
|
|||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
|
# Tools (cloned at runtime — not tracked in this repo)
|
||||||
|
tools/
|
||||||
|
|||||||
511
CLAUDE.md
Normal file
511
CLAUDE.md
Normal file
@@ -0,0 +1,511 @@
|
|||||||
|
# GAZE — Character Browser: LLM Development Guide
|
||||||
|
|
||||||
|
## What This Project Is
|
||||||
|
|
||||||
|
GAZE is a Flask web app for managing AI image generation assets and generating images via ComfyUI. It is a **personal creative tool** for organizing characters, outfits, actions, styles, scenes, and detailers — all of which map to Stable Diffusion LoRAs and prompt fragments — and generating images by wiring those assets into a ComfyUI workflow at runtime.
|
||||||
|
|
||||||
|
The app is deployed locally, connects to a local ComfyUI instance at `http://127.0.0.1:8188`, and uses SQLite for persistence. LoRA and model files live on `/mnt/alexander/AITools/Image Models/`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
app.py # ~186 lines: Flask init, config, logging, route registration, startup/migrations
|
||||||
|
models.py # SQLAlchemy models only
|
||||||
|
comfy_workflow.json # ComfyUI workflow template with placeholder strings
|
||||||
|
utils.py # Pure constants + helpers (no Flask/DB deps)
|
||||||
|
services/
|
||||||
|
__init__.py
|
||||||
|
comfyui.py # ComfyUI HTTP client (queue_prompt, get_history, get_image)
|
||||||
|
workflow.py # Workflow building (_prepare_workflow, _apply_checkpoint_settings)
|
||||||
|
prompts.py # Prompt building + dedup (build_prompt, build_extras_prompt)
|
||||||
|
llm.py # LLM integration + MCP tool calls (call_llm, load_prompt)
|
||||||
|
mcp.py # MCP/Docker server lifecycle (ensure_mcp_server_running)
|
||||||
|
sync.py # All sync_*() functions + preset resolution helpers
|
||||||
|
job_queue.py # Background job queue (_enqueue_job, _make_finalize, worker thread)
|
||||||
|
file_io.py # LoRA/checkpoint scanning, file helpers
|
||||||
|
routes/
|
||||||
|
__init__.py # register_routes(app) — imports and calls all route modules
|
||||||
|
characters.py # Character CRUD + generation + outfit management
|
||||||
|
outfits.py # Outfit routes
|
||||||
|
actions.py # Action routes
|
||||||
|
styles.py # Style routes
|
||||||
|
scenes.py # Scene routes
|
||||||
|
detailers.py # Detailer routes
|
||||||
|
checkpoints.py # Checkpoint routes
|
||||||
|
looks.py # Look routes
|
||||||
|
presets.py # Preset routes
|
||||||
|
generator.py # Generator mix-and-match page
|
||||||
|
gallery.py # Gallery browsing + image/resource deletion
|
||||||
|
settings.py # Settings page + status APIs + context processors
|
||||||
|
strengths.py # Strengths gallery system
|
||||||
|
transfer.py # Resource transfer system
|
||||||
|
queue_api.py # /api/queue/* endpoints
|
||||||
|
```
|
||||||
|
|
||||||
|
### Dependency Graph
|
||||||
|
|
||||||
|
```
|
||||||
|
app.py
|
||||||
|
├── models.py (unchanged)
|
||||||
|
├── utils.py (no deps except stdlib)
|
||||||
|
├── services/
|
||||||
|
│ ├── comfyui.py ← utils (for config)
|
||||||
|
│ ├── prompts.py ← utils, models
|
||||||
|
│ ├── workflow.py ← prompts, utils, models
|
||||||
|
│ ├── llm.py ← mcp (for tool calls)
|
||||||
|
│ ├── mcp.py ← (stdlib only: subprocess, os)
|
||||||
|
│ ├── sync.py ← models, utils
|
||||||
|
│ ├── job_queue.py ← comfyui, models
|
||||||
|
│ └── file_io.py ← models, utils
|
||||||
|
└── routes/
|
||||||
|
├── All route modules ← services/*, utils, models
|
||||||
|
└── (routes never import from other routes)
|
||||||
|
```
|
||||||
|
|
||||||
|
**No circular imports**: routes → services → utils/models. Services never import routes. Utils never imports services.
|
||||||
|
|
||||||
|
### Route Registration Pattern
|
||||||
|
|
||||||
|
Routes use a `register_routes(app)` closure pattern — each route module defines a function that receives the Flask `app` object and registers routes via `@app.route()` closures. This preserves all existing `url_for()` endpoint names without requiring Blueprint prefixes. Helper functions used only by routes in that module are defined inside `register_routes()` before the routes that reference them.
|
||||||
|
|
||||||
|
### Database
|
||||||
|
SQLite at `instance/database.db`, managed by Flask-SQLAlchemy. The DB is a cache of the JSON files on disk — the JSON files are the source of truth.
|
||||||
|
|
||||||
|
**Models**: `Character`, `Look`, `Outfit`, `Action`, `Style`, `Scene`, `Detailer`, `Checkpoint`, `Settings`
|
||||||
|
|
||||||
|
All category models (except Settings and Checkpoint) share this pattern:
|
||||||
|
- `{entity}_id` — canonical ID (from JSON, often matches filename without extension)
|
||||||
|
- `slug` — URL-safe version of the ID (alphanumeric + underscores only, via `re.sub(r'[^a-zA-Z0-9_]', '', id)`)
|
||||||
|
- `name` — display name
|
||||||
|
- `filename` — original JSON filename
|
||||||
|
- `data` — full JSON blob (SQLAlchemy JSON column)
|
||||||
|
- `default_fields` — list of `section::key` strings saved as the user's preferred prompt fields
|
||||||
|
- `image_path` — relative path under `static/uploads/`
|
||||||
|
|
||||||
|
### Data Flow: JSON → DB → Prompt → ComfyUI
|
||||||
|
|
||||||
|
1. **JSON files** in `data/{characters,clothing,actions,styles,scenes,detailers,looks}/` are loaded by `sync_*()` functions into SQLite.
|
||||||
|
2. At generation time, `build_prompt(data, selected_fields, default_fields, active_outfit)` converts the character JSON blob into `{"main": ..., "face": ..., "hand": ...}` prompt strings.
|
||||||
|
3. `_prepare_workflow(workflow, character, prompts, ...)` wires prompts and LoRAs into the loaded `comfy_workflow.json`.
|
||||||
|
4. `queue_prompt(workflow, client_id)` POSTs the workflow to ComfyUI's `/prompt` endpoint.
|
||||||
|
5. The app polls `get_history(prompt_id)` and retrieves the image via `get_image(filename, subfolder, type)`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ComfyUI Workflow Node Map
|
||||||
|
|
||||||
|
The workflow (`comfy_workflow.json`) uses string node IDs. These are the critical nodes:
|
||||||
|
|
||||||
|
| Node | Role |
|
||||||
|
|------|------|
|
||||||
|
| `3` | Main KSampler |
|
||||||
|
| `4` | Checkpoint loader |
|
||||||
|
| `5` | Empty latent (width/height) |
|
||||||
|
| `6` | Positive prompt — contains `{{POSITIVE_PROMPT}}` placeholder |
|
||||||
|
| `7` | Negative prompt |
|
||||||
|
| `8` | VAE decode |
|
||||||
|
| `9` | Save image |
|
||||||
|
| `11` | Face ADetailer |
|
||||||
|
| `13` | Hand ADetailer |
|
||||||
|
| `14` | Face detailer prompt — contains `{{FACE_PROMPT}}` placeholder |
|
||||||
|
| `15` | Hand detailer prompt — contains `{{HAND_PROMPT}}` placeholder |
|
||||||
|
| `16` | Character LoRA (or Look LoRA when a Look is active) |
|
||||||
|
| `17` | Outfit LoRA |
|
||||||
|
| `18` | Action LoRA |
|
||||||
|
| `19` | Style / Detailer / Scene LoRA (priority: style > detailer > scene) |
|
||||||
|
|
||||||
|
LoRA nodes chain: `4 → 16 → 17 → 18 → 19`. Unused LoRA nodes are bypassed by pointing `model_source`/`clip_source` directly to the prior node. All model/clip consumers (nodes 3, 6, 7, 11, 13, 14, 15) are wired to the final `model_source`/`clip_source` at the end of `_prepare_workflow`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Functions by Module
|
||||||
|
|
||||||
|
### `utils.py` — Constants and Pure Helpers
|
||||||
|
|
||||||
|
- **`_IDENTITY_KEYS` / `_WARDROBE_KEYS`** — Lists of canonical field names for the `identity` and `wardrobe` sections. Used by `_ensure_character_fields()`.
|
||||||
|
- **`ALLOWED_EXTENSIONS`** — Permitted upload file extensions.
|
||||||
|
- **`_LORA_DEFAULTS`** — Default LoRA directory paths per category.
|
||||||
|
- **`parse_orientation(orientation_str)`** — Converts orientation codes (`1F`, `2F`, `1M1F`, etc.) into Danbooru tags.
|
||||||
|
- **`_resolve_lora_weight(lora_data)`** — Extracts and validates LoRA weight from a lora data dict.
|
||||||
|
- **`allowed_file(filename)`** — Checks file extension against `ALLOWED_EXTENSIONS`.
|
||||||
|
|
||||||
|
### `services/prompts.py` — Prompt Building
|
||||||
|
|
||||||
|
- **`build_prompt(data, selected_fields, default_fields, active_outfit)`** — Converts a character (or combined) data dict into `{"main", "face", "hand"}` prompt strings. Field selection priority: `selected_fields` → `default_fields` → select all (fallback). Fields are addressed as `"section::key"` strings (e.g. `"identity::hair"`, `"wardrobe::top"`). Characters support a **nested** wardrobe format where `wardrobe` is a dict of outfit names → outfit dicts.
|
||||||
|
- **`build_extras_prompt(actions, outfits, scenes, styles, detailers)`** — Used by the Generator page. Combines prompt text from all checked items across categories into a single string.
|
||||||
|
- **`_cross_dedup_prompts(positive, negative)`** — Cross-deduplicates tags between positive and negative prompt strings. Equal counts cancel completely; excess on one side is retained.
|
||||||
|
- **`_resolve_character(character_slug)`** — Returns a `Character` ORM object for a given slug string. Handles `"__random__"` sentinel.
|
||||||
|
- **`_ensure_character_fields(character, selected_fields, ...)`** — Mutates `selected_fields` in place, appending populated identity/wardrobe keys. Called in every secondary-category generate route after `_resolve_character()`.
|
||||||
|
- **`_append_background(prompts, character=None)`** — Appends `"<primary_color> simple background"` tag to `prompts['main']`.
|
||||||
|
|
||||||
|
### `services/workflow.py` — Workflow Wiring
|
||||||
|
|
||||||
|
- **`_prepare_workflow(workflow, character, prompts, ...)`** — Core workflow wiring function. Replaces prompt placeholders, chains LoRA nodes dynamically, randomises seeds, applies checkpoint settings, runs cross-dedup as the final step.
|
||||||
|
- **`_apply_checkpoint_settings(workflow, ckpt_data)`** — Applies checkpoint-specific sampler/prompt/VAE settings.
|
||||||
|
- **`_get_default_checkpoint()`** — Returns `(checkpoint_path, checkpoint_data)` from session, database Settings, or workflow file fallback.
|
||||||
|
- **`_log_workflow_prompts(label, workflow)`** — Logs the fully assembled workflow prompts in a readable block.
|
||||||
|
|
||||||
|
### `services/job_queue.py` — Background Job Queue
|
||||||
|
|
||||||
|
- **`_enqueue_job(label, workflow, finalize_fn)`** — Adds a generation job to the queue.
|
||||||
|
- **`_make_finalize(category, slug, db_model_class=None, action=None)`** — Factory returning a callback that retrieves the generated image from ComfyUI, saves it, and optionally updates the DB cover image.
|
||||||
|
- **`_prune_job_history(max_age_seconds=3600)`** — Removes old terminal-state jobs from memory.
|
||||||
|
- **`init_queue_worker(flask_app)`** — Stores the app reference and starts the worker thread.
|
||||||
|
|
||||||
|
### `services/comfyui.py` — ComfyUI HTTP Client
|
||||||
|
|
||||||
|
- **`queue_prompt(prompt_workflow, client_id)`** — POSTs workflow to ComfyUI's `/prompt` endpoint.
|
||||||
|
- **`get_history(prompt_id)`** — Polls ComfyUI for job completion.
|
||||||
|
- **`get_image(filename, subfolder, folder_type)`** — Retrieves generated image bytes.
|
||||||
|
- **`_ensure_checkpoint_loaded(checkpoint_path)`** — Forces ComfyUI to load a specific checkpoint.
|
||||||
|
|
||||||
|
### `services/llm.py` — LLM Integration
|
||||||
|
|
||||||
|
- **`call_llm(prompt, system_prompt)`** — OpenAI-compatible chat completion supporting OpenRouter (cloud) and Ollama/LMStudio (local). Implements a tool-calling loop (up to 10 turns) using `DANBOORU_TOOLS` via MCP Docker container.
|
||||||
|
- **`load_prompt(filename)`** — Loads system prompt text from `data/prompts/`.
|
||||||
|
- **`call_mcp_tool()`** — Synchronous wrapper for MCP tool calls.
|
||||||
|
|
||||||
|
### `services/sync.py` — Data Synchronization
|
||||||
|
|
||||||
|
- **`sync_characters()`, `sync_outfits()`, `sync_actions()`, etc.** — Load JSON files from `data/` directories into SQLite. One function per category.
|
||||||
|
- **`_resolve_preset_entity(type, id)`** / **`_resolve_preset_fields(preset_data)`** — Preset resolution helpers.
|
||||||
|
|
||||||
|
### `services/file_io.py` — File & DB Helpers
|
||||||
|
|
||||||
|
- **`get_available_loras(category)`** — Scans filesystem for available LoRA files in a category.
|
||||||
|
- **`get_available_checkpoints()`** — Scans checkpoint directories.
|
||||||
|
- **`_count_look_assignments()`** / **`_count_outfit_lora_assignments()`** — DB aggregate queries.
|
||||||
|
|
||||||
|
### `services/mcp.py` — MCP/Docker Lifecycle
|
||||||
|
|
||||||
|
- **`ensure_mcp_server_running()`** — Ensures the danbooru-mcp Docker container is running.
|
||||||
|
- **`ensure_character_mcp_server_running()`** — Ensures the character-mcp Docker container is running.
|
||||||
|
|
||||||
|
### Route-local Helpers
|
||||||
|
|
||||||
|
Some helpers are defined inside a route module's `register_routes()` since they're only used by routes in that file:
|
||||||
|
- `routes/scenes.py`: `_queue_scene_generation()` — scene-specific workflow builder
|
||||||
|
- `routes/detailers.py`: `_queue_detailer_generation()` — detailer-specific generation helper
|
||||||
|
- `routes/styles.py`: `_build_style_workflow()` — style-specific workflow builder
|
||||||
|
- `routes/checkpoints.py`: `_build_checkpoint_workflow()` — checkpoint-specific workflow builder
|
||||||
|
- `routes/strengths.py`: `_build_strengths_prompts()`, `_prepare_strengths_workflow()` — strengths gallery helpers
|
||||||
|
- `routes/transfer.py`: `_create_minimal_template()` — transfer template builder
|
||||||
|
- `routes/gallery.py`: `_scan_gallery_images()`, `_enrich_with_names()`, `_parse_comfy_png_metadata()`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## JSON Data Schemas
|
||||||
|
|
||||||
|
### Character (`data/characters/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"character_id": "tifa_lockhart",
|
||||||
|
"character_name": "Tifa Lockhart",
|
||||||
|
"identity": { "base_specs": "", "hair": "", "eyes": "", "hands": "", "arms": "", "torso": "", "pelvis": "", "legs": "", "feet": "", "extra": "" },
|
||||||
|
"defaults": { "expression": "", "pose": "", "scene": "" },
|
||||||
|
"wardrobe": {
|
||||||
|
"default": { "full_body": "", "headwear": "", "top": "", "bottom": "", "legwear": "", "footwear": "", "hands": "", "gloves": "", "accessories": "" }
|
||||||
|
},
|
||||||
|
"styles": { "aesthetic": "", "primary_color": "", "secondary_color": "", "tertiary_color": "" },
|
||||||
|
"lora": { "lora_name": "Illustrious/Looks/tifa.safetensors", "lora_weight": 0.8, "lora_triggers": "" },
|
||||||
|
"tags": [],
|
||||||
|
"participants": { "orientation": "1F", "solo_focus": "true" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
`participants` is optional; when absent, `(solo:1.2)` is injected. `orientation` is parsed by `parse_orientation()` into Danbooru tags (`1girl`, `hetero`, etc.).
|
||||||
|
|
||||||
|
### Outfit (`data/clothing/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"outfit_id": "french_maid_01",
|
||||||
|
"outfit_name": "French Maid",
|
||||||
|
"wardrobe": { "full_body": "", "headwear": "", "top": "", "bottom": "", "legwear": "", "footwear": "", "hands": "", "accessories": "" },
|
||||||
|
"lora": { "lora_name": "Illustrious/Clothing/maid.safetensors", "lora_weight": 0.8, "lora_triggers": "" },
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Action (`data/actions/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"action_id": "sitting",
|
||||||
|
"action_name": "Sitting",
|
||||||
|
"action": { "full_body": "", "additional": "", "head": "", "eyes": "", "arms": "", "hands": "" },
|
||||||
|
"lora": { "lora_name": "", "lora_weight": 1.0, "lora_triggers": "" },
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scene (`data/scenes/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"scene_id": "beach",
|
||||||
|
"scene_name": "Beach",
|
||||||
|
"scene": { "background": "", "foreground": "", "furniture": "", "colors": "", "lighting": "", "theme": "" },
|
||||||
|
"lora": { "lora_name": "", "lora_weight": 1.0, "lora_triggers": "" },
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Style (`data/styles/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"style_id": "watercolor",
|
||||||
|
"style_name": "Watercolor",
|
||||||
|
"style": { "artist_name": "", "artistic_style": "" },
|
||||||
|
"lora": { "lora_name": "", "lora_weight": 1.0, "lora_triggers": "" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Detailer (`data/detailers/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"detailer_id": "detailed_skin",
|
||||||
|
"detailer_name": "Detailed Skin",
|
||||||
|
"prompt": ["detailed skin", "pores"],
|
||||||
|
"focus": { "face": true, "hands": true },
|
||||||
|
"lora": { "lora_name": "", "lora_weight": 1.0, "lora_triggers": "" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Look (`data/looks/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"look_id": "tifa_casual",
|
||||||
|
"look_name": "Tifa Casual",
|
||||||
|
"character_id": "tifa_lockhart",
|
||||||
|
"positive": "casual clothes, jeans",
|
||||||
|
"negative": "revealing",
|
||||||
|
"lora": { "lora_name": "Illustrious/Looks/tifa_casual.safetensors", "lora_weight": 0.85, "lora_triggers": "" },
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Looks occupy LoRA node 16, overriding the character's own LoRA. The Look's `negative` is prepended to the workflow's negative prompt.
|
||||||
|
|
||||||
|
### Checkpoint (`data/checkpoints/*.json`)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"checkpoint_path": "Illustrious/model.safetensors",
|
||||||
|
"checkpoint_name": "Model Display Name",
|
||||||
|
"base_positive": "anime",
|
||||||
|
"base_negative": "text, logo",
|
||||||
|
"steps": 25,
|
||||||
|
"cfg": 5,
|
||||||
|
"sampler_name": "euler_ancestral",
|
||||||
|
"scheduler": "normal",
|
||||||
|
"vae": "integrated"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Checkpoint JSONs are keyed by `checkpoint_path`. If no JSON exists for a discovered model file, `_default_checkpoint_data()` provides defaults.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## URL Routes
|
||||||
|
|
||||||
|
### Characters
|
||||||
|
- `GET /` — character gallery (index)
|
||||||
|
- `GET /character/<slug>` — character detail with generation UI
|
||||||
|
- `POST /character/<slug>/generate` — queue generation (AJAX or form); returns `{"job_id": ...}`
|
||||||
|
- `POST /character/<slug>/replace_cover_from_preview` — promote preview to cover
|
||||||
|
- `GET/POST /character/<slug>/edit` — edit character data
|
||||||
|
- `POST /character/<slug>/upload` — upload cover image
|
||||||
|
- `POST /character/<slug>/save_defaults` — save default field selection
|
||||||
|
- `POST /character/<slug>/outfit/switch|add|delete|rename` — manage per-character wardrobe outfits
|
||||||
|
- `GET/POST /create` — create new character (blank or LLM-generated)
|
||||||
|
- `POST /rescan` — sync DB from JSON files
|
||||||
|
|
||||||
|
### Category Pattern (Outfits, Actions, Styles, Scenes, Detailers)
|
||||||
|
Each category follows the same URL pattern:
|
||||||
|
- `GET /<category>/` — gallery
|
||||||
|
- `GET /<category>/<slug>` — detail + generation UI
|
||||||
|
- `POST /<category>/<slug>/generate` — queue generation; returns `{"job_id": ...}`
|
||||||
|
- `POST /<category>/<slug>/replace_cover_from_preview`
|
||||||
|
- `GET/POST /<category>/<slug>/edit`
|
||||||
|
- `POST /<category>/<slug>/upload`
|
||||||
|
- `POST /<category>/<slug>/save_defaults`
|
||||||
|
- `POST /<category>/<slug>/clone` — duplicate entry
|
||||||
|
- `POST /<category>/<slug>/save_json` — save raw JSON (from modal editor)
|
||||||
|
- `POST /<category>/rescan`
|
||||||
|
- `POST /<category>/bulk_create` — LLM-generate entries from LoRA files on disk
|
||||||
|
|
||||||
|
### Looks
|
||||||
|
- `GET /looks` — gallery
|
||||||
|
- `GET /look/<slug>` — detail
|
||||||
|
- `GET/POST /look/<slug>/edit`
|
||||||
|
- `POST /look/<slug>/generate` — queue generation; returns `{"job_id": ...}`
|
||||||
|
- `POST /look/<slug>/replace_cover_from_preview`
|
||||||
|
- `GET/POST /look/create`
|
||||||
|
- `POST /looks/rescan`
|
||||||
|
|
||||||
|
### Generator (Mix & Match)
|
||||||
|
- `GET/POST /generator` — freeform generator with multi-select accordion UI
|
||||||
|
- `POST /generator/preview_prompt` — AJAX: preview composed prompt without generating
|
||||||
|
|
||||||
|
### Checkpoints
|
||||||
|
- `GET /checkpoints` — gallery
|
||||||
|
- `GET /checkpoint/<slug>` — detail + generation settings editor
|
||||||
|
- `POST /checkpoint/<slug>/save_json`
|
||||||
|
- `POST /checkpoints/rescan`
|
||||||
|
|
||||||
|
### Job Queue API
|
||||||
|
All generation routes use the background job queue. Frontend polls:
|
||||||
|
- `GET /api/queue/<job_id>/status` — returns `{"status": "pending"|"running"|"done"|"failed", "result": {...}}`
|
||||||
|
|
||||||
|
Image retrieval is handled server-side by the `_make_finalize()` callback; there are no separate client-facing finalize routes.
|
||||||
|
|
||||||
|
### Utilities
|
||||||
|
- `POST /set_default_checkpoint` — save default checkpoint to session and persist to `comfy_workflow.json`
|
||||||
|
- `GET /get_missing_{characters,outfits,actions,scenes,styles,detailers,looks,checkpoints}` — AJAX: list items without cover images (sorted by display name)
|
||||||
|
- `POST /generate_missing` — batch generate covers for all characters missing one (uses job queue)
|
||||||
|
- `POST /clear_all_covers` / `clear_all_{outfit,action,scene,style,detailer,look,checkpoint}_covers`
|
||||||
|
- `GET /gallery` — global image gallery browsing `static/uploads/`
|
||||||
|
- `GET/POST /settings` — LLM provider configuration
|
||||||
|
- `POST /resource/<category>/<slug>/delete` — soft (JSON only) or hard (JSON + safetensors) delete
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend
|
||||||
|
|
||||||
|
- Bootstrap 5.3 (CDN). Custom styles in `static/style.css`.
|
||||||
|
- All templates extend `templates/layout.html`. The base layout provides:
|
||||||
|
- `{% block content %}` — main page content
|
||||||
|
- `{% block scripts %}` — additional JS at end of body
|
||||||
|
- Navbar with links to all sections
|
||||||
|
- Global default checkpoint selector (saves to session via AJAX)
|
||||||
|
- Resource delete modal (soft/hard) shared across gallery pages
|
||||||
|
- `initJsonEditor(saveUrl)` — shared JSON editor modal (simple form + raw textarea tabs)
|
||||||
|
- Context processors inject `all_checkpoints`, `default_checkpoint_path`, and `COMFYUI_WS_URL` into every template.
|
||||||
|
- **No `{% block head %}` exists** in layout.html — do not try to use it.
|
||||||
|
- Generation is async: JS submits the form via AJAX (`X-Requested-With: XMLHttpRequest`), receives a `{"job_id": ...}` response, then polls `/api/queue/<job_id>/status` every ~1.5 seconds until `status == "done"`. The server-side worker handles all ComfyUI polling and image saving via the `_make_finalize()` callback. There are no client-facing finalize HTTP routes.
|
||||||
|
- **Batch generation** (library pages): Uses a two-phase pattern:
|
||||||
|
1. **Queue phase**: All jobs are submitted upfront via sequential fetch calls, collecting job IDs
|
||||||
|
2. **Poll phase**: All jobs are polled concurrently via `Promise.all()`, updating UI as each completes
|
||||||
|
3. **Progress tracking**: Displays currently processing items in real-time using a `Set` to track active jobs
|
||||||
|
4. **Sorting**: All batch operations sort items by display `name` (not `filename`) for better UX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## LLM Integration
|
||||||
|
|
||||||
|
### System Prompts
|
||||||
|
Text files in `data/prompts/` define JSON output schemas for LLM-generated entries:
|
||||||
|
- `character_system.txt` — character JSON schema
|
||||||
|
- `outfit_system.txt` — outfit JSON schema
|
||||||
|
- `action_system.txt`, `scene_system.txt`, `style_system.txt`, `detailer_system.txt`, `look_system.txt`, `checkpoint_system.txt`
|
||||||
|
|
||||||
|
Used by: character/outfit/action/scene/style create forms, and bulk_create routes.
|
||||||
|
|
||||||
|
### Danbooru MCP Tools
|
||||||
|
The LLM loop in `call_llm()` provides three tools via a Docker-based MCP server (`danbooru-mcp:latest`):
|
||||||
|
- `search_tags(query, limit, category)` — prefix search
|
||||||
|
- `validate_tags(tags)` — exact-match validation
|
||||||
|
- `suggest_tags(partial, limit, category)` — autocomplete
|
||||||
|
|
||||||
|
The LLM uses these to verify and discover correct Danbooru-compatible tags for prompts.
|
||||||
|
|
||||||
|
All system prompts (`character_system.txt`, `outfit_system.txt`, `action_system.txt`, `scene_system.txt`, `style_system.txt`, `detailer_system.txt`, `look_system.txt`, `checkpoint_system.txt`) instruct the LLM to use these tools before finalising any tag values. `checkpoint_system.txt` applies them specifically to the `base_positive` and `base_negative` fields.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## LoRA File Paths
|
||||||
|
|
||||||
|
LoRA filenames in JSON are stored as paths relative to ComfyUI's `models/lora/` root:
|
||||||
|
|
||||||
|
| Category | Path prefix | Example |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| Character / Look | `Illustrious/Looks/` | `Illustrious/Looks/tifa_v2.safetensors` |
|
||||||
|
| Outfit | `Illustrious/Clothing/` | `Illustrious/Clothing/maid.safetensors` |
|
||||||
|
| Action | `Illustrious/Poses/` | `Illustrious/Poses/sitting.safetensors` |
|
||||||
|
| Style | `Illustrious/Styles/` | `Illustrious/Styles/watercolor.safetensors` |
|
||||||
|
| Detailer | `Illustrious/Detailers/` | `Illustrious/Detailers/skin.safetensors` |
|
||||||
|
| Scene | `Illustrious/Backgrounds/` | `Illustrious/Backgrounds/beach.safetensors` |
|
||||||
|
|
||||||
|
Checkpoint paths: `Illustrious/<filename>.safetensors` or `Noob/<filename>.safetensors`.
|
||||||
|
|
||||||
|
Absolute paths on disk:
|
||||||
|
- Checkpoints: `/mnt/alexander/AITools/Image Models/Stable-diffusion/{Illustrious,Noob}/`
|
||||||
|
- LoRAs: `/mnt/alexander/AITools/Image Models/lora/Illustrious/{Looks,Clothing,Poses,Styles,Detailers,Backgrounds}/`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Adding a New Category
|
||||||
|
|
||||||
|
To add a new content category (e.g. "Poses" as a separate concept from Actions), the pattern is:
|
||||||
|
|
||||||
|
1. **Model** (`models.py`): Add a new SQLAlchemy model with the standard fields.
|
||||||
|
2. **Sync function** (`services/sync.py`): Add `sync_newcategory()` following the pattern of `sync_outfits()`.
|
||||||
|
3. **Data directory** (`app.py`): Add `app.config['NEWCATEGORY_DIR'] = 'data/newcategory'`.
|
||||||
|
4. **Routes** (`routes/newcategory.py`): Create a new route module with a `register_routes(app)` function. Implement index, detail, edit, generate, replace_cover_from_preview, upload, save_defaults, clone, rescan routes. Follow `routes/outfits.py` or `routes/scenes.py` exactly.
|
||||||
|
5. **Route registration** (`routes/__init__.py`): Import and call `newcategory.register_routes(app)`.
|
||||||
|
6. **Templates**: Create `templates/newcategory/{index,detail,edit,create}.html` extending `layout.html`.
|
||||||
|
7. **Nav**: Add link to navbar in `templates/layout.html`.
|
||||||
|
8. **Startup** (`app.py`): Import and call `sync_newcategory()` in the `with app.app_context()` block.
|
||||||
|
9. **Generator page**: Add to `routes/generator.py`, `services/prompts.py` `build_extras_prompt()`, and `templates/generator.html` accordion.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Session Keys
|
||||||
|
|
||||||
|
The Flask filesystem session stores:
|
||||||
|
- `default_checkpoint` — checkpoint_path string for the global default
|
||||||
|
- `prefs_{slug}` — selected_fields list for character detail page
|
||||||
|
- `preview_{slug}` — relative image path of last character preview
|
||||||
|
- `prefs_outfit_{slug}`, `preview_outfit_{slug}`, `char_outfit_{slug}` — outfit detail state
|
||||||
|
- `prefs_action_{slug}`, `preview_action_{slug}`, `char_action_{slug}` — action detail state
|
||||||
|
- `prefs_scene_{slug}`, `preview_scene_{slug}`, `char_scene_{slug}` — scene detail state
|
||||||
|
- `prefs_detailer_{slug}`, `preview_detailer_{slug}`, `char_detailer_{slug}`, `action_detailer_{slug}`, `extra_pos_detailer_{slug}`, `extra_neg_detailer_{slug}` — detailer detail state (selected fields, preview image, character, action LoRA, extra positive prompt, extra negative prompt)
|
||||||
|
- `prefs_style_{slug}`, `preview_style_{slug}`, `char_style_{slug}` — style detail state
|
||||||
|
- `prefs_look_{slug}`, `preview_look_{slug}` — look detail state
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Running the App
|
||||||
|
|
||||||
|
### Directly (development)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /mnt/alexander/Projects/character-browser
|
||||||
|
source venv/bin/activate
|
||||||
|
python app.py
|
||||||
|
```
|
||||||
|
|
||||||
|
The app runs in debug mode on port 5000 by default. ComfyUI must be running at `http://127.0.0.1:8188`.
|
||||||
|
|
||||||
|
The DB is initialised and all sync functions are called inside `with app.app_context():` at the bottom of `app.py` before `app.run()`.
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
The compose file (`docker-compose.yml`) runs two services:
|
||||||
|
- **`danbooru-mcp`** — built from `https://git.liveaodh.com/aodhan/danbooru-mcp.git`; the MCP tag-search container used by `call_llm()`.
|
||||||
|
- **`app`** — the Flask app, exposed on host port **5782** → container port 5000.
|
||||||
|
|
||||||
|
Key environment variables set by compose:
|
||||||
|
- `COMFYUI_URL=http://10.0.0.200:8188` — points at ComfyUI on the Docker host network.
|
||||||
|
- `SKIP_MCP_AUTOSTART=true` — disables the app's built-in danbooru-mcp launch logic (compose manages it).
|
||||||
|
|
||||||
|
Volumes mounted into the app container:
|
||||||
|
- `./data`, `./static/uploads`, `./instance`, `./flask_session` — persistent app data.
|
||||||
|
- `/Volumes/ImageModels:/ImageModels:ro` — model files for checkpoint/LoRA scanning (**requires Docker Desktop file sharing enabled for `/Volumes/ImageModels`**).
|
||||||
|
- `/var/run/docker.sock` — Docker socket so the app can exec danbooru-mcp tool containers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Common Pitfalls
|
||||||
|
|
||||||
|
- **SQLAlchemy JSON mutation**: After modifying a JSON column dict in place, always call `flag_modified(obj, "data")` or the change won't be detected.
|
||||||
|
- **Dual write**: Every edit route writes back to both the DB (`db.session.commit()`) and the JSON file on disk. Both must be kept in sync.
|
||||||
|
- **Slug generation**: `re.sub(r'[^a-zA-Z0-9_]', '', id)` — note this removes hyphens and dots, not just replaces them. Character IDs like `yuna_(ff10)` become slug `yunaffx10`. This is intentional.
|
||||||
|
- **Checkpoint slugs use underscore replacement**: `re.sub(r'[^a-zA-Z0-9_]', '_', ...)` (replaces with `_`, not removes) to preserve readability in paths.
|
||||||
|
- **LoRA chaining**: If a LoRA node has no LoRA (name is empty/None), the node is skipped and `model_source`/`clip_source` pass through unchanged. Do not set the node inputs for skipped nodes.
|
||||||
|
- **AJAX detection**: `request.headers.get('X-Requested-With') == 'XMLHttpRequest'` determines whether to return JSON or redirect.
|
||||||
|
- **Session must be marked modified for JSON responses**: After setting session values in AJAX-responding routes, set `session.modified = True`.
|
||||||
|
- **Detailer `prompt` is a list**: The `prompt` field in detailer JSON is stored as a list of strings (e.g. `["detailed skin", "pores"]`), not a plain string. When merging into `tags` for `build_prompt`, use `extend` for lists and `append` for strings — never append the list object itself or `", ".join()` will fail on the nested list item.
|
||||||
|
- **`_make_finalize` action semantics**: Pass `action=None` when the route should always update the DB cover (e.g. batch generate, checkpoint generate). Pass `action=request.form.get('action')` for routes that support both "preview" (no DB update) and "replace" (update DB). The factory skips the DB write when `action` is truthy and not `"replace"`.
|
||||||
29
Dockerfile
Normal file
29
Dockerfile
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
# Install system deps: git (for danbooru-mcp repo clone) + docker CLI
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
git \
|
||||||
|
curl \
|
||||||
|
ca-certificates \
|
||||||
|
&& install -m 0755 -d /etc/apt/keyrings \
|
||||||
|
&& curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \
|
||||||
|
&& chmod a+r /etc/apt/keyrings/docker.asc \
|
||||||
|
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
|
||||||
|
> /etc/apt/sources.list.d/docker.list \
|
||||||
|
&& apt-get update && apt-get install -y --no-install-recommends docker-ce-cli docker-compose-plugin \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Writable dirs that will typically be bind-mounted at runtime
|
||||||
|
RUN mkdir -p static/uploads instance flask_session data/characters data/clothing \
|
||||||
|
data/actions data/styles data/scenes data/detailers data/checkpoints data/looks
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
CMD ["python", "app.py"]
|
||||||
61
README.md
61
README.md
@@ -5,16 +5,25 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- **Character Gallery**: Automatically scans your `characters/` folder and builds a searchable, sortable database.
|
- **Character Gallery**: Automatically scans your `characters/` folder and builds a searchable, sortable database.
|
||||||
- **Granular Prompt Control**: Every field in your character JSON (Identity, Wardrobe, Styles) has a checkbox. You decide exactly what is sent to the AI.
|
- **Outfit Gallery**: Manage reusable outfit presets that can be applied to any character.
|
||||||
|
- **Actions Gallery**: A library of reusable poses and actions (e.g., "Belly Dancing", "Sword Fighting") that can be previewed on any character model.
|
||||||
|
- **Styles Gallery**: Manage art style / artist LoRA presets with AI-assisted bulk creation from your styles LoRA folder.
|
||||||
|
- **Scenes Gallery**: Background and environment LoRA presets, previewable with any character.
|
||||||
|
- **Detailers Gallery**: Detail enhancement LoRA presets for fine-tuning face, hands, and other features.
|
||||||
|
- **Checkpoints Gallery**: Browse all your installed SDXL checkpoints (Illustrious & Noob families). Stores per-checkpoint generation settings (steps, CFG, sampler, VAE, base prompts) via JSON files in `data/checkpoints/`. Supports AI-assisted metadata generation from accompanying HTML files.
|
||||||
|
- **AI-Powered Creation**: Create and populate gallery entries using AI to generate profiles from descriptions or LoRA HTML files, or manually create blank templates.
|
||||||
|
- **Character-Integrated Previews**: Standalone items (Outfits/Actions/Styles/Scenes/Detailers/Checkpoints) can be previewed directly on a specific character's model.
|
||||||
|
- **Granular Prompt Control**: Every field in your JSON models (Identity, Wardrobe, Styles, Action details) has a checkbox. You decide exactly what is sent to the AI.
|
||||||
- **ComfyUI Integration**:
|
- **ComfyUI Integration**:
|
||||||
- **SDXL Optimized**: Designed for high-quality SDXL workflows.
|
- **SDXL Optimized**: Designed for high-quality SDXL/Illustrious workflows.
|
||||||
- **Localized ADetailer**: Automated Face and Hand detailing with focused prompts (e.g., only eye color and expression are sent to the face detailer).
|
- **Localized ADetailer**: Automated Face and Hand detailing with focused prompts (e.g., only eye color and expression are sent to the face detailer).
|
||||||
- **LoRA Support**: Automatically detects and applies LoRAs specified in your character sheets.
|
- **Quad LoRA Chaining**: Chains up to four distinct LoRAs (Character + Outfit + Action + Style/Detailer/Scene) sequentially in the generation workflow.
|
||||||
|
- **Per-Checkpoint Settings**: Steps, CFG, sampler name, VAE, and base prompts are applied automatically from each checkpoint's JSON profile.
|
||||||
- **Real-time Progress**: Live progress bars and queue status via WebSockets (with a reliable polling fallback).
|
- **Real-time Progress**: Live progress bars and queue status via WebSockets (with a reliable polling fallback).
|
||||||
- **Batch Processing**:
|
- **Batch Processing**:
|
||||||
- **Fill Missing**: Generate covers for every character missing one with a single click.
|
- **Fill Missing**: Generate covers for every item missing one with a single click, across all galleries.
|
||||||
- **Refresh All**: Unassign all current covers and generate a fresh set for the whole collection.
|
- **Bulk Create from LoRAs/Checkpoints**: Auto-generate JSON metadata for entire directories using an LLM.
|
||||||
- **Advanced Generator**: A dedicated page to mix-and-match characters with different checkpoints (Illustrious/Noob support) and custom prompt additions.
|
- **Advanced Generator**: A dedicated mix-and-match page combining any character, outfit, action, style, scene, and detailer in a single generation.
|
||||||
- **Smart URLs**: Sanitized, human-readable URLs (slugs) that handle special characters and slashes gracefully.
|
- **Smart URLs**: Sanitized, human-readable URLs (slugs) that handle special characters and slashes gracefully.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
@@ -30,6 +39,20 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
|||||||
|
|
||||||
## Setup & Installation
|
## Setup & Installation
|
||||||
|
|
||||||
|
### Option A — Docker (recommended)
|
||||||
|
|
||||||
|
1. **Clone the repository.**
|
||||||
|
2. Edit `docker-compose.yml` if needed:
|
||||||
|
- Set `COMFYUI_URL` to your ComfyUI host/port.
|
||||||
|
- Adjust the `/Volumes/ImageModels` volume path to your model directory. If you're on Docker Desktop, add the path under **Settings → Resources → File Sharing** first.
|
||||||
|
3. **Start services:**
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
The app will be available at `http://localhost:5782`.
|
||||||
|
|
||||||
|
### Option B — Local (development)
|
||||||
|
|
||||||
1. **Clone the repository** to your local machine.
|
1. **Clone the repository** to your local machine.
|
||||||
2. **Configure Paths**: Open `app.py` and update the following variables to match your system:
|
2. **Configure Paths**: Open `app.py` and update the following variables to match your system:
|
||||||
```python
|
```python
|
||||||
@@ -45,13 +68,18 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
### Creating Content
|
||||||
|
- **AI Generation**: Toggle "Use AI to generate profile from description" on, then describe your character, outfit, or action. The AI will generate a complete profile with appropriate tags.
|
||||||
|
- **Manual Creation**: Toggle AI generation off to create a blank template you can edit yourself.
|
||||||
|
- **Auto-naming**: Leave the filename field empty to auto-generate one from the name. If a file already exists, a number will be appended automatically.
|
||||||
|
|
||||||
### Gallery Management
|
### Gallery Management
|
||||||
- **Rescan**: Use the "Rescan Character Files" button if you've added new JSON files or manually edited them.
|
- **Rescan**: Use the "Rescan" buttons if you've added new JSON files or manually edited them.
|
||||||
- **Save Defaults**: On a character page, select your favorite prompt combination and click "Save as Default Selection" to remember it for future quick generations.
|
- **Save Defaults**: On any detail page, select your favorite prompt combination and click "Save as Default Selection" to remember it for future generations.
|
||||||
|
|
||||||
### Generation
|
### Generation
|
||||||
- **Preview**: Generates an image and shows it to you without replacing your current cover.
|
- **Preview**: Generates an image and shows it to you without replacing your current cover.
|
||||||
- **Replace**: Generates an image and sets it as the character's official gallery cover.
|
- **Replace**: Generates an image and sets it as the item's official gallery cover.
|
||||||
- **Clean Start**: If you want to wipe the database and all generated images to start fresh:
|
- **Clean Start**: If you want to wipe the database and all generated images to start fresh:
|
||||||
```bash
|
```bash
|
||||||
./launch.sh --clean
|
./launch.sh --clean
|
||||||
@@ -59,9 +87,16 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
|||||||
|
|
||||||
## File Structure
|
## File Structure
|
||||||
|
|
||||||
- `/characters`: Your character JSON files.
|
- `/data/characters`: Character JSON files.
|
||||||
- `/static/uploads`: Generated images (organized by character subfolders).
|
- `/data/clothing`: Outfit preset JSON files.
|
||||||
- `/templates`: HTML UI using Bootstrap 5.
|
- `/data/actions`: Action/Pose preset JSON files.
|
||||||
|
- `/data/styles`: Art style / artist LoRA JSON files.
|
||||||
|
- `/data/scenes`: Scene/background LoRA JSON files.
|
||||||
|
- `/data/detailers`: Detailer LoRA JSON files.
|
||||||
|
- `/data/checkpoints`: Per-checkpoint metadata JSON files (steps, CFG, sampler, VAE, base prompts).
|
||||||
|
- `/data/prompts`: LLM system prompts used by the AI-assisted bulk creation features.
|
||||||
|
- `/static/uploads`: Generated images (organized by subfolders).
|
||||||
- `app.py`: Flask backend and prompt-building logic.
|
- `app.py`: Flask backend and prompt-building logic.
|
||||||
- `comfy_workflow.json`: The API-format workflow used for generations.
|
- `comfy_workflow.json`: The API-format workflow used for generations.
|
||||||
- `models.py`: SQLite database schema.
|
- `models.py`: SQLAlchemy database models.
|
||||||
|
- `DEVELOPMENT_GUIDE.md`: Architectural patterns for extending the browser.
|
||||||
|
|||||||
696
app.py
696
app.py
@@ -1,544 +1,186 @@
|
|||||||
import os
|
import os
|
||||||
import json
|
import logging
|
||||||
import time
|
from flask import Flask
|
||||||
import re
|
from flask_session import Session
|
||||||
import requests
|
from models import db, Settings, Look
|
||||||
import random
|
|
||||||
from flask import Flask, render_template, request, redirect, url_for, flash, session
|
|
||||||
from werkzeug.utils import secure_filename
|
|
||||||
from models import db, Character
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
|
||||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||||
app.config['UPLOAD_FOLDER'] = 'static/uploads'
|
app.config['UPLOAD_FOLDER'] = 'static/uploads'
|
||||||
app.config['SECRET_KEY'] = 'dev-key-123'
|
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'dev-key-123')
|
||||||
app.config['CHARACTERS_DIR'] = 'characters'
|
app.config['CHARACTERS_DIR'] = 'data/characters'
|
||||||
app.config['COMFYUI_URL'] = 'http://127.0.0.1:8188'
|
app.config['CLOTHING_DIR'] = 'data/clothing'
|
||||||
app.config['ILLUSTRIOUS_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Illustrious/'
|
app.config['ACTIONS_DIR'] = 'data/actions'
|
||||||
app.config['NOOB_MODELS_DIR'] = '/mnt/alexander/AITools/Image Models/Stable-diffusion/Noob/'
|
app.config['STYLES_DIR'] = 'data/styles'
|
||||||
|
app.config['SCENES_DIR'] = 'data/scenes'
|
||||||
|
app.config['DETAILERS_DIR'] = 'data/detailers'
|
||||||
|
app.config['CHECKPOINTS_DIR'] = 'data/checkpoints'
|
||||||
|
app.config['LOOKS_DIR'] = 'data/looks'
|
||||||
|
app.config['PRESETS_DIR'] = 'data/presets'
|
||||||
|
app.config['COMFYUI_URL'] = os.environ.get('COMFYUI_URL', 'http://127.0.0.1:8188')
|
||||||
|
app.config['ILLUSTRIOUS_MODELS_DIR'] = '/ImageModels/Stable-diffusion/Illustrious/'
|
||||||
|
app.config['NOOB_MODELS_DIR'] = '/ImageModels/Stable-diffusion/Noob/'
|
||||||
|
app.config['LORA_DIR'] = '/ImageModels/lora/Illustrious/Looks/'
|
||||||
|
|
||||||
|
# Server-side session configuration to avoid cookie size limits
|
||||||
|
app.config['SESSION_TYPE'] = 'filesystem'
|
||||||
|
app.config['SESSION_FILE_DIR'] = os.path.join(app.config['UPLOAD_FOLDER'], '../flask_session')
|
||||||
|
app.config['SESSION_PERMANENT'] = False
|
||||||
|
|
||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
|
Session(app)
|
||||||
|
|
||||||
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
|
# ---------------------------------------------------------------------------
|
||||||
|
# Logging
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
log_level_str = os.environ.get('LOG_LEVEL', 'INFO').upper()
|
||||||
|
log_level = getattr(logging, log_level_str, logging.INFO)
|
||||||
|
|
||||||
def get_available_checkpoints():
|
logging.basicConfig(
|
||||||
checkpoints = []
|
level=log_level,
|
||||||
|
format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',
|
||||||
# Scan Illustrious
|
datefmt='%Y-%m-%d %H:%M:%S',
|
||||||
if os.path.exists(app.config['ILLUSTRIOUS_MODELS_DIR']):
|
)
|
||||||
for f in os.listdir(app.config['ILLUSTRIOUS_MODELS_DIR']):
|
logger = logging.getLogger('gaze')
|
||||||
if f.endswith('.safetensors') or f.endswith('.ckpt'):
|
logger.setLevel(log_level)
|
||||||
checkpoints.append(f"Illustrious/{f}")
|
|
||||||
|
|
||||||
# Scan Noob
|
|
||||||
if os.path.exists(app.config['NOOB_MODELS_DIR']):
|
|
||||||
for f in os.listdir(app.config['NOOB_MODELS_DIR']):
|
|
||||||
if f.endswith('.safetensors') or f.endswith('.ckpt'):
|
|
||||||
checkpoints.append(f"Noob/{f}")
|
|
||||||
|
|
||||||
return sorted(checkpoints)
|
|
||||||
|
|
||||||
def allowed_file(filename):
|
# ---------------------------------------------------------------------------
|
||||||
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
# Register all routes
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
def build_prompt(data, selected_fields=None, default_fields=None):
|
from routes import register_routes
|
||||||
def is_selected(section, key):
|
register_routes(app)
|
||||||
# Priority:
|
|
||||||
# 1. Manual selection from form (if list is not empty)
|
|
||||||
# 2. Database defaults (if they exist)
|
|
||||||
# 3. Select all (default behavior)
|
|
||||||
if selected_fields:
|
|
||||||
return f"{section}::{key}" in selected_fields
|
|
||||||
if default_fields:
|
|
||||||
return f"{section}::{key}" in default_fields
|
|
||||||
return True
|
|
||||||
|
|
||||||
identity = data.get('identity', {})
|
|
||||||
wardrobe = data.get('wardrobe', {})
|
|
||||||
|
|
||||||
# Pre-calculate Hand/Glove priority
|
|
||||||
hand_val = ""
|
|
||||||
if wardrobe.get('gloves') and is_selected('wardrobe', 'gloves'):
|
|
||||||
hand_val = wardrobe.get('gloves')
|
|
||||||
elif identity.get('hands') and is_selected('identity', 'hands'):
|
|
||||||
hand_val = identity.get('hands')
|
|
||||||
|
|
||||||
# 1. Main Prompt
|
|
||||||
parts = ["(solo:1.2)"]
|
|
||||||
# Use character_id (underscores to spaces) for tags compatibility
|
|
||||||
char_tag = data.get('character_id', '').replace('_', ' ')
|
|
||||||
if char_tag and is_selected('special', 'name'):
|
|
||||||
parts.append(char_tag)
|
|
||||||
|
|
||||||
for key in ['base_specs', 'hair', 'eyes', 'expression', 'distinguishing_marks']:
|
|
||||||
val = identity.get(key)
|
|
||||||
if val and is_selected('identity', key):
|
|
||||||
parts.append(val)
|
|
||||||
|
|
||||||
# Add hand priority value to main prompt
|
|
||||||
if hand_val:
|
|
||||||
parts.append(hand_val)
|
|
||||||
|
|
||||||
for key in ['outer_layer', 'inner_layer', 'lower_body', 'footwear', 'accessories']:
|
|
||||||
val = wardrobe.get(key)
|
|
||||||
if val and is_selected('wardrobe', key):
|
|
||||||
parts.append(val)
|
|
||||||
|
|
||||||
style = data.get('styles', {}).get('aesthetic')
|
|
||||||
if style and is_selected('styles', 'aesthetic'):
|
|
||||||
parts.append(f"{style} style")
|
|
||||||
|
|
||||||
tags = data.get('tags', [])
|
|
||||||
if tags and is_selected('special', 'tags'):
|
|
||||||
parts.extend(tags)
|
|
||||||
|
|
||||||
lora = data.get('lora', {})
|
|
||||||
if lora.get('lora_triggers') and is_selected('lora', 'lora_triggers'):
|
|
||||||
parts.append(lora.get('lora_triggers'))
|
|
||||||
|
|
||||||
# 2. Face Prompt: Tag, Eyes, Expression
|
|
||||||
face_parts = []
|
|
||||||
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('expression') and is_selected('identity', 'expression'): face_parts.append(identity.get('expression'))
|
|
||||||
|
|
||||||
# 3. Hand Prompt: Hand value (Gloves or Hands)
|
|
||||||
hand_parts = [hand_val] if hand_val else []
|
|
||||||
|
|
||||||
return {
|
|
||||||
"main": ", ".join(parts),
|
|
||||||
"face": ", ".join(face_parts),
|
|
||||||
"hand": ", ".join(hand_parts)
|
|
||||||
}
|
|
||||||
|
|
||||||
def queue_prompt(prompt_workflow, client_id=None):
|
|
||||||
p = {"prompt": prompt_workflow}
|
|
||||||
if client_id:
|
|
||||||
p["client_id"] = client_id
|
|
||||||
data = json.dumps(p).encode('utf-8')
|
|
||||||
response = requests.post(f"{app.config['COMFYUI_URL']}/prompt", data=data)
|
|
||||||
return response.json()
|
|
||||||
|
|
||||||
def get_history(prompt_id):
|
|
||||||
response = requests.get(f"{app.config['COMFYUI_URL']}/history/{prompt_id}")
|
|
||||||
return response.json()
|
|
||||||
|
|
||||||
def get_image(filename, subfolder, folder_type):
|
|
||||||
data = {"filename": filename, "subfolder": subfolder, "type": folder_type}
|
|
||||||
response = requests.get(f"{app.config['COMFYUI_URL']}/view", params=data)
|
|
||||||
return response.content
|
|
||||||
|
|
||||||
from sqlalchemy.orm.attributes import flag_modified
|
|
||||||
|
|
||||||
def sync_characters():
|
|
||||||
if not os.path.exists(app.config['CHARACTERS_DIR']):
|
|
||||||
return
|
|
||||||
|
|
||||||
current_ids = []
|
|
||||||
|
|
||||||
for filename in os.listdir(app.config['CHARACTERS_DIR']):
|
|
||||||
if filename.endswith('.json'):
|
|
||||||
file_path = os.path.join(app.config['CHARACTERS_DIR'], filename)
|
|
||||||
try:
|
|
||||||
with open(file_path, 'r') as f:
|
|
||||||
data = json.load(f)
|
|
||||||
char_id = data.get('character_id')
|
|
||||||
if not char_id:
|
|
||||||
continue
|
|
||||||
|
|
||||||
current_ids.append(char_id)
|
|
||||||
|
|
||||||
# Generate URL-safe slug: remove special characters from character_id
|
|
||||||
slug = re.sub(r'[^a-zA-Z0-9_]', '', char_id)
|
|
||||||
|
|
||||||
# Check if character already exists
|
|
||||||
character = Character.query.filter_by(character_id=char_id).first()
|
|
||||||
name = data.get('character_name', char_id.replace('_', ' ').title())
|
|
||||||
|
|
||||||
if character:
|
|
||||||
character.data = data
|
|
||||||
character.name = name
|
|
||||||
character.slug = slug
|
|
||||||
|
|
||||||
# Check if cover image still exists
|
|
||||||
if character.image_path:
|
|
||||||
full_img_path = os.path.join(app.config['UPLOAD_FOLDER'], character.image_path)
|
|
||||||
if not os.path.exists(full_img_path):
|
|
||||||
print(f"Image missing for {character.name}, clearing path.")
|
|
||||||
character.image_path = None
|
|
||||||
|
|
||||||
# Explicitly tell SQLAlchemy the JSON field was modified
|
|
||||||
flag_modified(character, "data")
|
|
||||||
else:
|
|
||||||
new_char = Character(
|
|
||||||
character_id=char_id,
|
|
||||||
slug=slug,
|
|
||||||
name=name,
|
|
||||||
data=data
|
|
||||||
)
|
|
||||||
db.session.add(new_char)
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error importing {filename}: {e}")
|
|
||||||
|
|
||||||
# Remove characters that are no longer in the folder
|
|
||||||
all_characters = Character.query.all()
|
|
||||||
for char in all_characters:
|
|
||||||
if char.character_id not in current_ids:
|
|
||||||
db.session.delete(char)
|
|
||||||
|
|
||||||
db.session.commit()
|
|
||||||
|
|
||||||
@app.route('/')
|
|
||||||
def index():
|
|
||||||
characters = Character.query.order_by(Character.name).all()
|
|
||||||
return render_template('index.html', characters=characters)
|
|
||||||
|
|
||||||
@app.route('/rescan', methods=['POST'])
|
|
||||||
def rescan():
|
|
||||||
sync_characters()
|
|
||||||
flash('Database synced with character files.')
|
|
||||||
return redirect(url_for('index'))
|
|
||||||
|
|
||||||
@app.route('/generator', methods=['GET', 'POST'])
|
|
||||||
def generator():
|
|
||||||
characters = Character.query.order_by(Character.name).all()
|
|
||||||
checkpoints = get_available_checkpoints()
|
|
||||||
|
|
||||||
if not checkpoints:
|
|
||||||
checkpoints = ["Noob/oneObsession_v19Atypical.safetensors"]
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
|
||||||
char_slug = request.form.get('character')
|
|
||||||
checkpoint = request.form.get('checkpoint')
|
|
||||||
custom_positive = request.form.get('positive_prompt', '')
|
|
||||||
custom_negative = request.form.get('negative_prompt', '')
|
|
||||||
|
|
||||||
character = Character.query.filter_by(slug=char_slug).first_or_404()
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open('comfy_workflow.json', 'r') as f:
|
|
||||||
workflow = json.load(f)
|
|
||||||
|
|
||||||
# Build base prompts from character defaults
|
|
||||||
prompts = build_prompt(character.data, default_fields=character.default_fields)
|
|
||||||
|
|
||||||
# Append custom additions to the "main" prompt
|
|
||||||
if custom_positive:
|
|
||||||
prompts["main"] = f"{prompts['main']}, {custom_positive}"
|
|
||||||
|
|
||||||
# Prepare workflow with custom checkpoint and negative prompt
|
|
||||||
workflow = _prepare_workflow(workflow, character, prompts, checkpoint, custom_negative)
|
|
||||||
|
|
||||||
print(f"Queueing generator prompt for {character.character_id}")
|
|
||||||
prompt_response = queue_prompt(workflow)
|
|
||||||
|
|
||||||
if 'prompt_id' not in prompt_response:
|
|
||||||
raise Exception(f"ComfyUI failed: {prompt_response.get('error', 'Unknown error')}")
|
|
||||||
|
|
||||||
prompt_id = prompt_response['prompt_id']
|
|
||||||
flash("Generation started...")
|
|
||||||
|
|
||||||
max_retries = 120
|
|
||||||
while max_retries > 0:
|
|
||||||
history = get_history(prompt_id)
|
|
||||||
if prompt_id in history:
|
|
||||||
outputs = history[prompt_id]['outputs']
|
|
||||||
for node_id in outputs:
|
|
||||||
if 'images' in outputs[node_id]:
|
|
||||||
image_info = outputs[node_id]['images'][0]
|
|
||||||
image_data = get_image(image_info['filename'], image_info['subfolder'], image_info['type'])
|
|
||||||
|
|
||||||
char_folder = os.path.join(app.config['UPLOAD_FOLDER'], character.slug)
|
|
||||||
os.makedirs(char_folder, exist_ok=True)
|
|
||||||
filename = f"gen_{int(time.time())}.png"
|
|
||||||
file_path = os.path.join(char_folder, filename)
|
|
||||||
with open(file_path, 'wb') as f:
|
|
||||||
f.write(image_data)
|
|
||||||
|
|
||||||
relative_path = f"{character.slug}/{filename}"
|
|
||||||
return render_template('generator.html', characters=characters, checkpoints=checkpoints,
|
|
||||||
generated_image=relative_path, selected_char=char_slug, selected_ckpt=checkpoint)
|
|
||||||
time.sleep(2)
|
|
||||||
max_retries -= 1
|
|
||||||
flash("Generation timed out.")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Generator error: {e}")
|
|
||||||
flash(f"Error: {str(e)}")
|
|
||||||
|
|
||||||
return render_template('generator.html', characters=characters, checkpoints=checkpoints)
|
|
||||||
|
|
||||||
@app.route('/character/<path:slug>')
|
|
||||||
def detail(slug):
|
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
|
||||||
|
|
||||||
# Load state from session
|
|
||||||
preferences = session.get(f'prefs_{slug}')
|
|
||||||
preview_image = session.get(f'preview_{slug}')
|
|
||||||
|
|
||||||
return render_template('detail.html', character=character, preferences=preferences, preview_image=preview_image)
|
|
||||||
|
|
||||||
@app.route('/character/<path:slug>/upload', methods=['POST'])
|
|
||||||
def upload_image(slug):
|
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
|
||||||
|
|
||||||
if 'image' not in request.files:
|
|
||||||
flash('No file part')
|
|
||||||
return redirect(request.url)
|
|
||||||
|
|
||||||
file = request.files['image']
|
|
||||||
if file.filename == '':
|
|
||||||
flash('No selected file')
|
|
||||||
return redirect(request.url)
|
|
||||||
|
|
||||||
if file and allowed_file(file.filename):
|
|
||||||
# Create character subfolder
|
|
||||||
char_folder = os.path.join(app.config['UPLOAD_FOLDER'], slug)
|
|
||||||
os.makedirs(char_folder, exist_ok=True)
|
|
||||||
|
|
||||||
filename = secure_filename(file.filename)
|
|
||||||
file_path = os.path.join(char_folder, filename)
|
|
||||||
file.save(file_path)
|
|
||||||
|
|
||||||
# Store relative path in DB
|
|
||||||
character.image_path = f"{slug}/{filename}"
|
|
||||||
db.session.commit()
|
|
||||||
flash('Image uploaded successfully!')
|
|
||||||
|
|
||||||
return redirect(url_for('detail', slug=slug))
|
|
||||||
|
|
||||||
@app.route('/character/<path:slug>/finalize_generation/<prompt_id>', methods=['POST'])
|
|
||||||
def finalize_generation(slug, prompt_id):
|
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
|
||||||
action = request.form.get('action', 'preview')
|
|
||||||
|
|
||||||
try:
|
|
||||||
history = get_history(prompt_id)
|
|
||||||
if prompt_id not in history:
|
|
||||||
return {'error': 'History not found'}, 404
|
|
||||||
|
|
||||||
outputs = history[prompt_id]['outputs']
|
|
||||||
for node_id in outputs:
|
|
||||||
if 'images' in outputs[node_id]:
|
|
||||||
image_info = outputs[node_id]['images'][0]
|
|
||||||
image_data = get_image(image_info['filename'], image_info['subfolder'], image_info['type'])
|
|
||||||
|
|
||||||
# Create character subfolder
|
|
||||||
char_folder = os.path.join(app.config['UPLOAD_FOLDER'], slug)
|
|
||||||
os.makedirs(char_folder, exist_ok=True)
|
|
||||||
|
|
||||||
filename = f"gen_{int(time.time())}.png"
|
|
||||||
file_path = os.path.join(char_folder, filename)
|
|
||||||
with open(file_path, 'wb') as f:
|
|
||||||
f.write(image_data)
|
|
||||||
|
|
||||||
print(f"Image saved to: {os.path.abspath(file_path)}")
|
|
||||||
|
|
||||||
# Handle actions
|
|
||||||
relative_path = f"{slug}/{filename}"
|
|
||||||
|
|
||||||
if action == 'replace':
|
|
||||||
character.image_path = relative_path
|
|
||||||
db.session.commit()
|
|
||||||
flash('Cover image updated!')
|
|
||||||
else:
|
|
||||||
# Preview mode
|
|
||||||
session[f'preview_{slug}'] = relative_path
|
|
||||||
|
|
||||||
return {'success': True, 'image_url': url_for('static', filename=f'uploads/{relative_path}')}
|
|
||||||
|
|
||||||
return {'error': 'No image found in output'}, 404
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Finalize error: {e}")
|
|
||||||
return {'error': str(e)}, 500
|
|
||||||
|
|
||||||
def _prepare_workflow(workflow, character, prompts, checkpoint=None, custom_negative=None):
|
|
||||||
# 1. Update prompts using replacement to preserve embeddings
|
|
||||||
workflow["6"]["inputs"]["text"] = workflow["6"]["inputs"]["text"].replace("{{POSITIVE_PROMPT}}", prompts["main"])
|
|
||||||
|
|
||||||
if custom_negative:
|
|
||||||
workflow["7"]["inputs"]["text"] = f"{workflow['7']['inputs']['text']}, {custom_negative}"
|
|
||||||
|
|
||||||
if "14" in workflow:
|
|
||||||
workflow["14"]["inputs"]["text"] = workflow["14"]["inputs"]["text"].replace("{{FACE_PROMPT}}", prompts["face"])
|
|
||||||
if "15" in workflow:
|
|
||||||
workflow["15"]["inputs"]["text"] = workflow["15"]["inputs"]["text"].replace("{{HAND_PROMPT}}", prompts["hand"])
|
|
||||||
|
|
||||||
print("--- DEBUG: COMFYUI PROMPTS ---")
|
|
||||||
print(f"Main Positive (6): {workflow['6']['inputs']['text']}")
|
|
||||||
print(f"Main Negative (7): {workflow['7']['inputs']['text']}")
|
|
||||||
if "14" in workflow:
|
|
||||||
print(f"Face Detailer (14): {workflow['14']['inputs']['text']}")
|
|
||||||
if "15" in workflow:
|
|
||||||
print(f"Hand Detailer (15): {workflow['15']['inputs']['text']}")
|
|
||||||
print("-------------------------------")
|
|
||||||
|
|
||||||
# 2. Update Checkpoint
|
|
||||||
if checkpoint:
|
|
||||||
workflow["4"]["inputs"]["ckpt_name"] = checkpoint
|
|
||||||
|
|
||||||
# 3. Handle LoRA
|
|
||||||
lora_data = character.data.get('lora', {})
|
|
||||||
lora_name = lora_data.get('lora_name')
|
|
||||||
|
|
||||||
model_source = ["4", 0]
|
|
||||||
clip_source = ["4", 1]
|
|
||||||
|
|
||||||
if lora_name and "16" in workflow:
|
|
||||||
workflow["16"]["inputs"]["lora_name"] = lora_name
|
|
||||||
workflow["16"]["inputs"]["strength_model"] = lora_data.get('lora_weight', 1.0)
|
|
||||||
workflow["16"]["inputs"]["strength_clip"] = lora_data.get('lora_weight', 1.0)
|
|
||||||
model_source = ["16", 0]
|
|
||||||
clip_source = ["16", 1]
|
|
||||||
|
|
||||||
# Apply connections to all model/clip consumers
|
|
||||||
workflow["3"]["inputs"]["model"] = model_source
|
|
||||||
workflow["11"]["inputs"]["model"] = model_source
|
|
||||||
workflow["13"]["inputs"]["model"] = model_source
|
|
||||||
|
|
||||||
workflow["6"]["inputs"]["clip"] = clip_source
|
|
||||||
workflow["7"]["inputs"]["clip"] = clip_source
|
|
||||||
workflow["11"]["inputs"]["clip"] = clip_source
|
|
||||||
workflow["13"]["inputs"]["clip"] = clip_source
|
|
||||||
workflow["14"]["inputs"]["clip"] = clip_source
|
|
||||||
workflow["15"]["inputs"]["clip"] = clip_source
|
|
||||||
|
|
||||||
# 4. Randomize seeds
|
|
||||||
gen_seed = random.randint(1, 10**15)
|
|
||||||
workflow["3"]["inputs"]["seed"] = gen_seed
|
|
||||||
if "11" in workflow: workflow["11"]["inputs"]["seed"] = gen_seed
|
|
||||||
if "13" in workflow: workflow["13"]["inputs"]["seed"] = gen_seed
|
|
||||||
|
|
||||||
return workflow
|
|
||||||
|
|
||||||
def _queue_generation(character, action='preview', selected_fields=None, client_id=None):
|
|
||||||
# 1. Load workflow
|
|
||||||
with open('comfy_workflow.json', 'r') as f:
|
|
||||||
workflow = json.load(f)
|
|
||||||
|
|
||||||
# 2. Build prompts
|
|
||||||
prompts = build_prompt(character.data, selected_fields, character.default_fields)
|
|
||||||
|
|
||||||
# 3. Prepare workflow
|
|
||||||
workflow = _prepare_workflow(workflow, character, prompts)
|
|
||||||
|
|
||||||
return queue_prompt(workflow, client_id=client_id)
|
|
||||||
@app.route('/get_missing_characters')
|
|
||||||
def get_missing_characters():
|
|
||||||
missing = Character.query.filter((Character.image_path == None) | (Character.image_path == '')).all()
|
|
||||||
return {'missing': [{'slug': c.slug, 'name': c.name} for c in missing]}
|
|
||||||
|
|
||||||
@app.route('/clear_all_covers', methods=['POST'])
|
|
||||||
def clear_all_covers():
|
|
||||||
characters = Character.query.all()
|
|
||||||
for char in characters:
|
|
||||||
char.image_path = None
|
|
||||||
db.session.commit()
|
|
||||||
return {'success': True}
|
|
||||||
|
|
||||||
@app.route('/generate_missing', methods=['POST'])
|
|
||||||
def generate_missing():
|
|
||||||
missing = Character.query.filter((Character.image_path == None) | (Character.image_path == '')).all()
|
|
||||||
if not missing:
|
|
||||||
flash("No characters missing cover images.")
|
|
||||||
return redirect(url_for('index'))
|
|
||||||
|
|
||||||
success_count = 0
|
|
||||||
for character in missing:
|
|
||||||
try:
|
|
||||||
print(f"Batch generating for: {character.name}")
|
|
||||||
prompt_response = _queue_generation(character, action='replace')
|
|
||||||
prompt_id = prompt_response['prompt_id']
|
|
||||||
|
|
||||||
# Simple synchronous wait for each
|
|
||||||
max_retries = 120
|
|
||||||
while max_retries > 0:
|
|
||||||
history = get_history(prompt_id)
|
|
||||||
if prompt_id in history:
|
|
||||||
outputs = history[prompt_id]['outputs']
|
|
||||||
for node_id in outputs:
|
|
||||||
if 'images' in outputs[node_id]:
|
|
||||||
image_info = outputs[node_id]['images'][0]
|
|
||||||
image_data = get_image(image_info['filename'], image_info['subfolder'], image_info['type'])
|
|
||||||
|
|
||||||
char_folder = os.path.join(app.config['UPLOAD_FOLDER'], character.slug)
|
|
||||||
os.makedirs(char_folder, exist_ok=True)
|
|
||||||
filename = f"gen_{int(time.time())}.png"
|
|
||||||
file_path = os.path.join(char_folder, filename)
|
|
||||||
with open(file_path, 'wb') as f:
|
|
||||||
f.write(image_data)
|
|
||||||
|
|
||||||
character.image_path = f"{character.slug}/{filename}"
|
|
||||||
db.session.commit()
|
|
||||||
success_count += 1
|
|
||||||
break
|
|
||||||
break
|
|
||||||
time.sleep(2)
|
|
||||||
max_retries -= 1
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error generating for {character.name}: {e}")
|
|
||||||
|
|
||||||
flash(f"Batch generation complete. Generated {success_count} images.")
|
|
||||||
return redirect(url_for('index'))
|
|
||||||
|
|
||||||
@app.route('/check_status/<prompt_id>')
|
|
||||||
def check_status(prompt_id):
|
|
||||||
try:
|
|
||||||
history = get_history(prompt_id)
|
|
||||||
if prompt_id in history:
|
|
||||||
return {'status': 'finished'}
|
|
||||||
return {'status': 'pending'}
|
|
||||||
except Exception:
|
|
||||||
return {'status': 'error'}, 500
|
|
||||||
|
|
||||||
@app.route('/character/<path:slug>/generate', methods=['POST'])
|
|
||||||
def generate_image(slug):
|
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Get action type
|
|
||||||
action = request.form.get('action', 'preview')
|
|
||||||
client_id = request.form.get('client_id')
|
|
||||||
|
|
||||||
# Get selected fields
|
|
||||||
selected_fields = request.form.getlist('include_field')
|
|
||||||
|
|
||||||
# Save preferences
|
|
||||||
session[f'prefs_{slug}'] = selected_fields
|
|
||||||
|
|
||||||
# Queue generation using helper
|
|
||||||
prompt_response = _queue_generation(character, action, selected_fields, client_id=client_id)
|
|
||||||
|
|
||||||
if 'prompt_id' not in prompt_response:
|
|
||||||
raise Exception(f"ComfyUI failed: {prompt_response.get('error', 'Unknown error')}")
|
|
||||||
|
|
||||||
prompt_id = prompt_response['prompt_id']
|
|
||||||
|
|
||||||
# Return JSON if AJAX request
|
|
||||||
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
|
||||||
return {'status': 'queued', 'prompt_id': prompt_id}
|
|
||||||
|
|
||||||
return redirect(url_for('detail', slug=slug))
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Generation error: {e}")
|
|
||||||
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
|
||||||
return {'error': str(e)}, 500
|
|
||||||
flash(f"Error during generation: {str(e)}")
|
|
||||||
return redirect(url_for('detail', slug=slug))
|
|
||||||
|
|
||||||
@app.route('/character/<path:slug>/save_defaults', methods=['POST'])
|
|
||||||
def save_defaults(slug):
|
|
||||||
character = Character.query.filter_by(slug=slug).first_or_404()
|
|
||||||
selected_fields = request.form.getlist('include_field')
|
|
||||||
character.default_fields = selected_fields
|
|
||||||
db.session.commit()
|
|
||||||
flash('Default prompt selection saved for this character!')
|
|
||||||
return redirect(url_for('detail', slug=slug))
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Startup
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
from services.mcp import ensure_mcp_server_running, ensure_character_mcp_server_running
|
||||||
|
from services.job_queue import init_queue_worker
|
||||||
|
from services.sync import (
|
||||||
|
sync_characters, sync_outfits, sync_actions, sync_styles,
|
||||||
|
sync_detailers, sync_scenes, sync_looks, sync_checkpoints, sync_presets,
|
||||||
|
)
|
||||||
|
|
||||||
|
ensure_mcp_server_running()
|
||||||
|
ensure_character_mcp_server_running()
|
||||||
|
init_queue_worker(app)
|
||||||
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}")
|
||||||
|
|
||||||
|
# Migration: Add default_fields column to action table if it doesn't exist
|
||||||
|
try:
|
||||||
|
from sqlalchemy import text
|
||||||
|
db.session.execute(text('ALTER TABLE action ADD COLUMN default_fields JSON'))
|
||||||
|
db.session.commit()
|
||||||
|
print("Added default_fields column to action table")
|
||||||
|
except Exception as e:
|
||||||
|
if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower():
|
||||||
|
print("default_fields column already exists in action table")
|
||||||
|
else:
|
||||||
|
print(f"Migration action note: {e}")
|
||||||
|
|
||||||
|
# Migration: Add new columns to settings table
|
||||||
|
columns_to_add = [
|
||||||
|
('llm_provider', "VARCHAR(50) DEFAULT 'openrouter'"),
|
||||||
|
('local_base_url', "VARCHAR(255)"),
|
||||||
|
('local_model', "VARCHAR(100)"),
|
||||||
|
('lora_dir_characters', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Looks'"),
|
||||||
|
('lora_dir_outfits', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Clothing'"),
|
||||||
|
('lora_dir_actions', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Poses'"),
|
||||||
|
('lora_dir_styles', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Styles'"),
|
||||||
|
('lora_dir_scenes', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Backgrounds'"),
|
||||||
|
('lora_dir_detailers', "VARCHAR(500) DEFAULT '/ImageModels/lora/Illustrious/Detailers'"),
|
||||||
|
('checkpoint_dirs', "VARCHAR(1000) DEFAULT '/ImageModels/Stable-diffusion/Illustrious,/ImageModels/Stable-diffusion/Noob'"),
|
||||||
|
('default_checkpoint', "VARCHAR(500)"),
|
||||||
|
]
|
||||||
|
for col_name, col_type in columns_to_add:
|
||||||
|
try:
|
||||||
|
db.session.execute(text(f'ALTER TABLE settings ADD COLUMN {col_name} {col_type}'))
|
||||||
|
db.session.commit()
|
||||||
|
print(f"Added {col_name} column to settings table")
|
||||||
|
except Exception as e:
|
||||||
|
if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print(f"Migration settings note ({col_name}): {e}")
|
||||||
|
|
||||||
|
# Ensure settings exist
|
||||||
|
if not Settings.query.first():
|
||||||
|
db.session.add(Settings())
|
||||||
|
db.session.commit()
|
||||||
|
print("Created default settings")
|
||||||
|
|
||||||
|
# Log the default checkpoint on startup
|
||||||
|
settings = Settings.query.first()
|
||||||
|
if settings and settings.default_checkpoint:
|
||||||
|
logger.info("=" * 80)
|
||||||
|
logger.info("DEFAULT CHECKPOINT loaded from database: %s", settings.default_checkpoint)
|
||||||
|
logger.info("=" * 80)
|
||||||
|
else:
|
||||||
|
logger.info("No default checkpoint set in database")
|
||||||
|
|
||||||
sync_characters()
|
sync_characters()
|
||||||
app.run(debug=True, port=5000)
|
sync_outfits()
|
||||||
|
sync_actions()
|
||||||
|
# Migration: Add data column to checkpoint table
|
||||||
|
try:
|
||||||
|
db.session.execute(text('ALTER TABLE checkpoint ADD COLUMN data JSON'))
|
||||||
|
db.session.commit()
|
||||||
|
print("Added data column to checkpoint table")
|
||||||
|
except Exception as e:
|
||||||
|
if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower():
|
||||||
|
print("data column already exists in checkpoint table")
|
||||||
|
else:
|
||||||
|
print(f"Migration checkpoint note: {e}")
|
||||||
|
|
||||||
|
sync_styles()
|
||||||
|
sync_detailers()
|
||||||
|
sync_scenes()
|
||||||
|
sync_looks()
|
||||||
|
sync_checkpoints()
|
||||||
|
sync_presets()
|
||||||
|
|
||||||
|
# Migration: Convert look.character_id to look.character_ids
|
||||||
|
try:
|
||||||
|
from sqlalchemy import text
|
||||||
|
# First ensure the column exists
|
||||||
|
db.session.execute(text("ALTER TABLE look ADD COLUMN character_ids JSON"))
|
||||||
|
db.session.commit()
|
||||||
|
print("Added character_ids column to look table")
|
||||||
|
except Exception as e:
|
||||||
|
if 'duplicate column name' in str(e).lower() or 'already exists' in str(e).lower():
|
||||||
|
pass # Column already exists
|
||||||
|
else:
|
||||||
|
print(f"Migration note (character_ids column): {e}")
|
||||||
|
|
||||||
|
# Migrate existing character_id to character_ids list
|
||||||
|
try:
|
||||||
|
looks_with_old_field = Look.query.filter(Look.character_id.isnot(None)).all()
|
||||||
|
migrated_count = 0
|
||||||
|
for look in looks_with_old_field:
|
||||||
|
if not look.character_ids:
|
||||||
|
look.character_ids = []
|
||||||
|
if look.character_id and look.character_id not in look.character_ids:
|
||||||
|
look.character_ids.append(look.character_id)
|
||||||
|
migrated_count += 1
|
||||||
|
if migrated_count > 0:
|
||||||
|
db.session.commit()
|
||||||
|
print(f"Migrated {migrated_count} looks from character_id to character_ids")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Migration note (character_ids data): {e}")
|
||||||
|
|
||||||
|
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "aerith_gainsborough",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long brown hair, braided, pink ribbon",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "cheerful expression",
|
|
||||||
"hands": "pink nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "pink dress, red bolero jacket",
|
|
||||||
"lower_body": "long skirt",
|
|
||||||
"footwear": "brown boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "gold bracelets, flower basket"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "floral, gentle, final fantasy style",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "red",
|
|
||||||
"tertiary_color": "brown"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy VII"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "android_18",
|
|
||||||
"character_name": "Android 18",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "shoulder-length blonde hair, tucked behind one ear",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "cool, indifferent expression",
|
|
||||||
"hands": "blue nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "gold hoop earrings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black short-sleeved shirt",
|
|
||||||
"outer_layer": "blue denim vest, 'RR' text on back",
|
|
||||||
"lower_body": "blue denim skirt, black leggings",
|
|
||||||
"footwear": "brown boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": ""
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "90s casual, anime, dragon ball style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "white"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Dragon Ball Z"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "anya_(spy_x_family)",
|
|
||||||
"character_name": "Anya Forger",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, small build, loli, fair skin",
|
|
||||||
"hair": "short pink hair, two small horns (hair ornaments)",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "smirk",
|
|
||||||
"hands": "pink nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "flat chest",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black Eden Academy uniform, gold trim",
|
|
||||||
"lower_body": "uniform skirt",
|
|
||||||
"footwear": "black shoes, white socks",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "black and gold hair cones"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "cute, academic, spy x family style",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Spy x Family"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "biwa_hayahide_(Umamusume)",
|
|
||||||
"character_name": "Biwa Hayahide",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
|
||||||
"hair": "long grey hair, wild hair",
|
|
||||||
"eyes": "purple eyes, red framed glasses",
|
|
||||||
"expression": "thinking",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "tracen school uniform",
|
|
||||||
"lower_body": "pleated skirt",
|
|
||||||
"footwear": "heeled shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": ""
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "intellectual, cool",
|
|
||||||
"primary_color": "maroon",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "grey"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Umamusume"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "bulma",
|
|
||||||
"character_name": "Bulma Briefs",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "turquoise hair, ponytail",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "energetic smile",
|
|
||||||
"hands": "turquoise nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black playboy bunny",
|
|
||||||
"lower_body": "pantyhose",
|
|
||||||
"footwear": "red high heels",
|
|
||||||
"gloves": "detatched cuffs",
|
|
||||||
"accessories": "red hair ribbon, dragon radar"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "retro-futuristic, anime, dragon ball style",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "turquoise",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Dragon Ball"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"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",
|
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "purple nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "black headband with horns"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black armor, cleavage",
|
|
||||||
"lower_body": "black leggings, armored plates",
|
|
||||||
"footwear": "black armored boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "purple cape, large axe"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "dark fantasy, gothic, fire emblem style",
|
|
||||||
"primary_color": "black",
|
|
||||||
"secondary_color": "gold",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Fire Emblem"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "cammy",
|
|
||||||
"character_name": "Cammy White",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, muscular build, fair skin",
|
|
||||||
"hair": "long blonde hair, twin braids",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "serious look",
|
|
||||||
"hands": "green nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "scar on left cheek, green camouflage paint on legs"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "green high-leg leotard",
|
|
||||||
"lower_body": "bare legs",
|
|
||||||
"footwear": "black combat boots, green socks",
|
|
||||||
"gloves": "red gauntlets",
|
|
||||||
"accessories": "red beret"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "military, athletic, street fighter style",
|
|
||||||
"primary_color": "green",
|
|
||||||
"secondary_color": "red",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Street Fighter"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "chun_li",
|
|
||||||
"character_name": "Chun-Li",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, muscular build, fair skin, asian",
|
|
||||||
"hair": "black hair, hair buns",
|
|
||||||
"eyes": "brown eyes",
|
|
||||||
"expression": "determined smile",
|
|
||||||
"hands": "blue nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "thick thighs",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "blue qipao, gold embroidery, white accents",
|
|
||||||
"lower_body": "brown tights",
|
|
||||||
"footwear": "white combat boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "white hair ribbons, spiked bracelets"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "chinese style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Street Fighter"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "ciri",
|
|
||||||
"character_name": "Ciri",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build",
|
|
||||||
"hair": "ashen grey hair, messy bun",
|
|
||||||
"eyes": "emerald green eyes, mascara",
|
|
||||||
"expression": "determined look",
|
|
||||||
"hands": "green nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "scar over eye"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white blouse",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "brown leather trousers",
|
|
||||||
"footwear": "brown leather boots",
|
|
||||||
"gloves": "brown leather gloves",
|
|
||||||
"accessories": "silver sword on back, witcher medallion"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gritty, fantasy, witcher style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "brown",
|
|
||||||
"tertiary_color": "silver"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"The Witcher 3"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "delinquent_mother_flim13",
|
|
||||||
"character_name": "Delinquent Mother",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, milf, gyaru, tall",
|
|
||||||
"hair": "blonde hair, long hair",
|
|
||||||
"eyes": "sharp eyes",
|
|
||||||
"expression": "smirk, sharp teeth",
|
|
||||||
"hands": "painted nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "very large breasts",
|
|
||||||
"pelvis": "wide hips",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "biege sweater, cleavage",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "pencil skirt",
|
|
||||||
"footwear": "high heels",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "necklace, rings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gyaru, milf, pink leopard print",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/Gyaru_mom_Flim13_IL_V1.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Original","flim13"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "gold_city_(Umamusume)",
|
|
||||||
"character_name": "Gold City",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
|
||||||
"hair": "blonde hair, wavy hair",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "confident expression",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "tracen school uniform",
|
|
||||||
"lower_body": "pleated skirt",
|
|
||||||
"footwear": "heeled shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "choker, earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fashionable, model",
|
|
||||||
"primary_color": "gold",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Umamusume"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "gold_ship_(Umamusume)",
|
|
||||||
"character_name": "Gold Ship",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, horse ears, horse tail, tall",
|
|
||||||
"hair": "grey hair, short hair",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "crazy expression, grin",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "tracen school uniform",
|
|
||||||
"lower_body": "pleated skirt",
|
|
||||||
"footwear": "heeled shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "ear covers, hat"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "energetic, sporty",
|
|
||||||
"primary_color": "red",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Umamusume"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "hatsune_miku",
|
|
||||||
"character_name": "Hatsune Miku",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long turquoise hair, twin tails, floor-length",
|
|
||||||
"eyes": "turquoise eyes",
|
|
||||||
"expression": "cheerful smile",
|
|
||||||
"hands": "turquoise nails",
|
|
||||||
"arms": "01 tattoo on left shoulder",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "grey sleeveless shirt, turquoise tie",
|
|
||||||
"lower_body": "grey miniskirt, turquoise trim",
|
|
||||||
"footwear": "black thigh-high boots, turquoise trim",
|
|
||||||
"gloves": "black arm warmers, turquoise trim",
|
|
||||||
"accessories": "hair ornament, headset"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "vocaloid, futuristic, anime style",
|
|
||||||
"primary_color": "teal",
|
|
||||||
"secondary_color": "grey",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Vocaloid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "jessica_rabbit",
|
|
||||||
"character_name": "Jessica Rabbit",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, voluptuous build, tall,",
|
|
||||||
"hair": "long red hair, side part, hair over one eye",
|
|
||||||
"eyes": "green eyes, heavy makeup, purple eyeshadow",
|
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "purple elbow gloves",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "narrow waist",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "red lips"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "red sequin dress, strapless, high slit, backless",
|
|
||||||
"lower_body": "side_slit,",
|
|
||||||
"footwear": "red high heels",
|
|
||||||
"gloves": "purple opera gloves",
|
|
||||||
"accessories": "gold earrings, glitter"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "noir, cartoon, glamorous",
|
|
||||||
"primary_color": "red",
|
|
||||||
"secondary_color": "purple",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Who Framed Roger Rabbit"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "jessie_(pokemon)",
|
|
||||||
"character_name": "Jessie",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long magenta hair, curved back",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "arrogant smirk",
|
|
||||||
"hands": "white nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "green earrings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black crop top",
|
|
||||||
"outer_layer": "white Team Rocket uniform jacket, bare stomach, red R logo",
|
|
||||||
"lower_body": "white miniskirt",
|
|
||||||
"footwear": "black thigh-high boots",
|
|
||||||
"gloves": "black elbow gloves",
|
|
||||||
"accessories": "green earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "villainous, anime, pokemon style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "magenta",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Pokemon"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "jinx_(league_of_legends)",
|
|
||||||
"character_name": "Jinx",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, pale skin,",
|
|
||||||
"hair": "long aqua hair, twin braids, very long hair, bangs",
|
|
||||||
"eyes": "pink eyes, ",
|
|
||||||
"expression": "crazy eyes, crazy smile",
|
|
||||||
"hands": "black and pink nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "flat chest,",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "cloud tattoo,"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "pink and black bikini, asymmetrical_bikini ",
|
|
||||||
"lower_body": "pink shorts, single pink stocking",
|
|
||||||
"footwear": "combat boots",
|
|
||||||
"gloves": "black fingerless gloves, fishnet elbow gloves,",
|
|
||||||
"accessories": "ammo belts, choker, bullet necklace,"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "punk, chaotic,",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "aqua"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/jinx_default_lol-000021.safetensors",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"League of Legends"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "kagamine_rin",
|
|
||||||
"character_name": "Kagamine Rin",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, petite",
|
|
||||||
"hair": "blonde hair, short hair, hair bow",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "smile, energetic",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "detached sleeves",
|
|
||||||
"torso": "flat chest",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "leg warmers",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt, sailor collar",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "black shorts, yellow belt",
|
|
||||||
"footwear": "white shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "headset, hair bow"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "vocaloid, cyber",
|
|
||||||
"primary_color": "yellow",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Vocaloid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "kagari_atsuko",
|
|
||||||
"character_name": "Kagari Atsuko",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long brown hair, half-ponytail, bangs",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "determined smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "dark blue witch robes",
|
|
||||||
"lower_body": "dark blue skirt",
|
|
||||||
"footwear": "brown boots, white socks",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "pointed witch hat, brown belt, magic wand"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fantasy, magical girl, little witch academia style",
|
|
||||||
"primary_color": "dark blue",
|
|
||||||
"secondary_color": "brown",
|
|
||||||
"tertiary_color": "red"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Little Witch Academia"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "k/da_all_out_ahri",
|
|
||||||
"character_name": "Ahri",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin, fox ears",
|
|
||||||
"hair": "long blonde hair, flowing",
|
|
||||||
"eyes": "yellow eyes",
|
|
||||||
"expression": "charming smile",
|
|
||||||
"hands": "silver nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "whisker markings on cheeks, crystal tails"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "silver crop top",
|
|
||||||
"outer_layer": "white and silver jacket",
|
|
||||||
"lower_body": "black leather shorts",
|
|
||||||
"footwear": "black thigh-high boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "crystal heart, silver jewelry"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "pop star, mystical, k/da style",
|
|
||||||
"primary_color": "silver",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "blue"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/KDA AhriIlluLoRA.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "k/da_all_out_akali",
|
|
||||||
"character_name": "Akali",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build, fair skin",
|
|
||||||
"hair": "long dark blue hair, blonde streaks, high ponytail",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "cool, rebellious look",
|
|
||||||
"hands": "blue nails",
|
|
||||||
"arms": "tattoos on arms",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black crop top",
|
|
||||||
"outer_layer": "blue and silver motorcycle jacket",
|
|
||||||
"lower_body": "black leather pants",
|
|
||||||
"footwear": "blue sneakers",
|
|
||||||
"gloves": "black fingerless gloves",
|
|
||||||
"accessories": "kama and kunai"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "pop star, street, k/da style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "purple",
|
|
||||||
"tertiary_color": "silver"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/KDAAkaliIlluLoRA.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "k/da_all_out_evelynn",
|
|
||||||
"character_name": "Evelynn",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, curvaceous build, fair skin",
|
|
||||||
"hair": "light blue hair,",
|
|
||||||
"eyes": "yellow glowing eyes, slit pupils",
|
|
||||||
"expression": "seductive, confident look",
|
|
||||||
"hands": "metal claws",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "two long lashers (shadow tendrils)"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black leather bra",
|
|
||||||
"outer_layer": "iridescent blue jacket, fur collar",
|
|
||||||
"lower_body": "black leather skirt",
|
|
||||||
"footwear": "black high-heeled boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "diamond earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "pop star, glamorous, k/da style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "purple",
|
|
||||||
"tertiary_color": "silver"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/KDA EvelynnIlluLoRA.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "k/da_all_out_kai'sa",
|
|
||||||
"character_name": "Kai'Sa",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build, fair skin",
|
|
||||||
"hair": "long hair, purple hair, hair ornament, ponytail, green highlights",
|
|
||||||
"eyes": "purple eyes",
|
|
||||||
"expression": "focused expression",
|
|
||||||
"hands": "silver nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "silver bodysuit",
|
|
||||||
"outer_layer": "white and silver jacket",
|
|
||||||
"lower_body": "silver leggings",
|
|
||||||
"footwear": "silver high-heeled boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "crystal shoulder pods"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "pop star, futuristic, k/da style",
|
|
||||||
"primary_color": "silver",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/KDA KaisaIlluLoRA.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"League of Legends", "K/DA", "KDA", "K-Pop"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "komi_shouko",
|
|
||||||
"character_name": "Komi Shouko",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, pale skin, asian",
|
|
||||||
"hair": "long dark purple hair, hime cut,",
|
|
||||||
"eyes": "dark purple eyes,",
|
|
||||||
"expression": "neutral expression, stoic, cat ears",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "black pantyhose",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "itan private high school uniform, blazer, striped bow tie",
|
|
||||||
"lower_body": "plaid skirt",
|
|
||||||
"footwear": "loafers",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": ""
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "anime, manga, clean lines",
|
|
||||||
"primary_color": "purple",
|
|
||||||
"secondary_color": "magenta",
|
|
||||||
"tertiary_color": "white"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": "komi shouko, itan private high school uniform"
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Komi Can't Communicate"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "lara_croft_classic",
|
|
||||||
"character_name": "Lara Croft",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build,",
|
|
||||||
"hair": "long brown hair, single braid",
|
|
||||||
"eyes": "brown eyes",
|
|
||||||
"expression": "light smile, raised eyebrow",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "teal tank top,",
|
|
||||||
"lower_body": "brown shorts",
|
|
||||||
"footwear": "brown combat boots, red laces",
|
|
||||||
"gloves": "black fingerless gloves",
|
|
||||||
"accessories": "dual thigh pistol holsters, brown leatherbackpack, red circular sunglasses"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "adventure, retro, 90s style",
|
|
||||||
"primary_color": "teal",
|
|
||||||
"secondary_color": "brown",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/LaraCroft_ClassicV2_Illu_Dwnsty.safetensors",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Tomb Raider"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "lisa_(genshin_impact)",
|
|
||||||
"character_name": "Lisa Minci",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, tall, mature female",
|
|
||||||
"hair": "brown hair, wavy hair, side ponytail",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "seductive smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "detached sleeves",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "wide hips",
|
|
||||||
"legs": "black pantyhose",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "beauty mark"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "purple dress, corset",
|
|
||||||
"outer_layer": "purple shawl",
|
|
||||||
"lower_body": "slit skirt",
|
|
||||||
"footwear": "black heels",
|
|
||||||
"gloves": "purple gloves",
|
|
||||||
"accessories": "witch hat, rose, necklace"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "genshin impact, witch, librarian",
|
|
||||||
"primary_color": "purple",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Genshin Impact"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "lulu (ff10)",
|
|
||||||
"character_name": "Lulu",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, curvaceous build, fair skin",
|
|
||||||
"hair": "long black hair, complex braids, hairpins",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "thinking, raised eyebrow",
|
|
||||||
"hands": "black nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "dark purple lipstick"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black corset",
|
|
||||||
"outer_layer": "black fur-trimmed dress, many belts on front",
|
|
||||||
"lower_body": "long skirt made of belts",
|
|
||||||
"footwear": "black boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "moogle doll, silver jewelry"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gothic, ornate, final fantasy x style",
|
|
||||||
"primary_color": "black",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/Lulu DG illuLoRA_1337272.safetensors",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy X"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "majin_android_21",
|
|
||||||
"character_name": "Majin Android 21",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, curvaceous build, pink skin",
|
|
||||||
"hair": "long voluminous white hair",
|
|
||||||
"eyes": "red eyes, black sclera",
|
|
||||||
"expression": "evil smile",
|
|
||||||
"hands": "black claws, pink nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "pink skin, long tail, pointy ears"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black tube top",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "white harem pants",
|
|
||||||
"footwear": "black and yellow boots",
|
|
||||||
"gloves": "black sleeves",
|
|
||||||
"accessories": "gold bracelets, gold neck ring, hoop earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "supernatural, anime, dragon ball style",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Dragon Ball FighterZ"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "marin_kitagawa",
|
|
||||||
"character_name": "Marin Kitagawa",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin, asian",
|
|
||||||
"hair": "long blonde hair, pink tips",
|
|
||||||
"eyes": "pink eyes (contacts)",
|
|
||||||
"expression": "excited smile",
|
|
||||||
"hands": "long pink nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "piercings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "white school shirt, loosely tied blue tie",
|
|
||||||
"lower_body": "blue plaid miniskirt",
|
|
||||||
"footwear": "black loafers, black socks",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "choker, various bracelets"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gyaru, modern, anime style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "blue",
|
|
||||||
"tertiary_color": "pink"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"My Dress-Up Darling"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "megurine_luka",
|
|
||||||
"character_name": "Megurine Luka",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, tall, mature female",
|
|
||||||
"hair": "pink hair, long hair",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "light smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "crop top, detached sleeves, gold trim",
|
|
||||||
"lower_body": "side slit, lace-up skirt",
|
|
||||||
"footwear": "thinghighs, lace-up boots, gold boots, gold armlet",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "headset"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "vocaloid, elegant",
|
|
||||||
"primary_color": "black",
|
|
||||||
"secondary_color": "gold",
|
|
||||||
"tertiary_color": "pink"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Vocaloid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "meiko",
|
|
||||||
"character_name": "Meiko",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, mature female",
|
|
||||||
"hair": "brown hair, short hair",
|
|
||||||
"eyes": "brown eyes",
|
|
||||||
"expression": "smile, confident",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "red crop top, sleeveless",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "red skirt, mini skirt",
|
|
||||||
"footwear": "brown boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "choker"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "vocaloid, casual",
|
|
||||||
"primary_color": "red",
|
|
||||||
"secondary_color": "brown",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Vocaloid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "nessa",
|
|
||||||
"character_name": "Nessa",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build, dark skin",
|
|
||||||
"hair": "long hair, light blue highlights",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "confident smile",
|
|
||||||
"hands": "blue nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "blue earrings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white and blue bikini top",
|
|
||||||
"outer_layer": "gym uniform, number 049",
|
|
||||||
"lower_body": "white and blue shorts",
|
|
||||||
"footwear": "blue and white sandals",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "wristband, life buoy, pokeball"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "sporty, aquatic, pokemon style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "orange"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Pokemon"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "olivier_mira_armstrong",
|
|
||||||
"character_name": "Olivier Mira Armstrong",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, tall, mature female",
|
|
||||||
"hair": "blonde hair, long hair, hair over one eye",
|
|
||||||
"eyes": "blue eyes, sharp eyes",
|
|
||||||
"expression": "serious",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "thick lips"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black shirt",
|
|
||||||
"outer_layer": "blue military coat, fur collar",
|
|
||||||
"lower_body": "black pants",
|
|
||||||
"footwear": "black boots",
|
|
||||||
"gloves": "black gloves",
|
|
||||||
"accessories": "sword"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "military, amestris uniform",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Fullmetal Alchemist"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "princess_peach",
|
|
||||||
"character_name": "Princess Peach",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long blonde hair, voluminous, crown",
|
|
||||||
"eyes": "blue eyes, long eyelashes",
|
|
||||||
"expression": "gentle smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "pink lips, blue earrings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white petticoat",
|
|
||||||
"outer_layer": "pink floor-length ball gown, puffy sleeves, dark pink panniers",
|
|
||||||
"lower_body": "long skirt",
|
|
||||||
"footwear": "red high heels",
|
|
||||||
"gloves": "white opera gloves",
|
|
||||||
"accessories": "gold crown with red and blue jewels, blue brooch"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "royal, whimsical, nintendo style",
|
|
||||||
"primary_color": "pink",
|
|
||||||
"secondary_color": "gold",
|
|
||||||
"tertiary_color": "blue"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/Princess_Peach_Shiny_Style_V4.0_Illustrious_1652958.safetensors",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": "princess peach, crown, pink dress, shiny skin, royal elegance"
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Super Mario"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "princess_zelda_botw",
|
|
||||||
"character_name": "Princess Zelda",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin, pointed ears",
|
|
||||||
"hair": "long blonde hair, braided, gold hair clips",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "curious",
|
|
||||||
"hands": "gold nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "tri-force symbol, elf ears"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "blue tunic",
|
|
||||||
"outer_layer": "blue champion's tunic, brown leather belts",
|
|
||||||
"lower_body": "tan trousers",
|
|
||||||
"footwear": "brown leather boots",
|
|
||||||
"gloves": "brown fingerless gloves",
|
|
||||||
"accessories": "sheikah slate, gold jewelry"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fantasy, adventurous, zelda style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "gold",
|
|
||||||
"tertiary_color": "brown"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"The Legend of Zelda"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "rice_shower_(Umamusume)",
|
|
||||||
"character_name": "Rice Shower",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, petite, horse ears, horse tail",
|
|
||||||
"hair": "long dark brown hair, bangs, hair over one eye",
|
|
||||||
"eyes": "purple eyes",
|
|
||||||
"expression": "shy expression",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white shirt",
|
|
||||||
"outer_layer": "tracen school uniform",
|
|
||||||
"lower_body": "pleated skirt",
|
|
||||||
"footwear": "heeled shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "blue rose, hair flower, small hat, dagger"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gothic lolita, elegant",
|
|
||||||
"primary_color": "purple",
|
|
||||||
"secondary_color": "blue",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Umamusume"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "riju",
|
|
||||||
"character_name": "Riju",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, young, dark skin, gerudo",
|
|
||||||
"hair": "short red hair, braided ponytail, gold hair ornament",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "serious",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "darkblue lipstick,"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black top, blue sash",
|
|
||||||
"lower_body": "black skirt, pelvic curtain,",
|
|
||||||
"footwear": "gold high heels",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "gold jewelry, earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fantasy, desert, gerudo style",
|
|
||||||
"primary_color": "gold",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "red"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"The Legend of Zelda"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "rosalina",
|
|
||||||
"character_name": "Rosalina",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, tall, slender build, fair skin",
|
|
||||||
"hair": "long platinum blonde hair, side-swept bangs covering one eye",
|
|
||||||
"eyes": "light blue eyes",
|
|
||||||
"expression": "serene expression",
|
|
||||||
"hands": "turquoise nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "star-shaped earrings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "turquoise off-the-shoulder gown, silver trim",
|
|
||||||
"lower_body": "long skirt",
|
|
||||||
"footwear": "silver high heels",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "silver crown with blue jewels, star wand, luma"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "celestial, elegant, nintendo style",
|
|
||||||
"primary_color": "turquoise",
|
|
||||||
"secondary_color": "silver",
|
|
||||||
"tertiary_color": "yellow"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Super Mario"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "rouge_the_bat",
|
|
||||||
"character_name": "Rouge the Bat",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, anthro, bat girl, white fur",
|
|
||||||
"hair": "short white hair",
|
|
||||||
"eyes": "teal eyes",
|
|
||||||
"expression": "sly smirk",
|
|
||||||
"hands": "white gloves",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "bat wings, eyeshadow"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black skin-tight jumpsuit, pink heart-shaped chest plate, bare shoulders, cleavage",
|
|
||||||
"lower_body": "jumpsuit",
|
|
||||||
"footwear": "white boots, pink heart motifs",
|
|
||||||
"gloves": "white gloves, pink cuffs",
|
|
||||||
"accessories": "blue eyeshadow"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "jewels, museum,sleek, spy, sonic style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "pink",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "Illustrious/Looks/Rouge_the_bat_v2.safetensors",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Sonic the Hedgehog"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "ryouko_(tenchi_muyou!)",
|
|
||||||
"character_name": "Ryouko Hakubi",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slim build,",
|
|
||||||
"hair": "long teal hair, spiky, voluminous",
|
|
||||||
"eyes": "golden eyes, cat-like pupils",
|
|
||||||
"expression": "confident smirk",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "red gem on forehead,"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "long white dress, plunging neckline, black belt",
|
|
||||||
"outer_layer": "black and orange long sleeve jacket with purple trim,",
|
|
||||||
"lower_body": "side_slit,, red trousers",
|
|
||||||
"footwear": "",
|
|
||||||
"gloves": "red gloves",
|
|
||||||
"accessories": "red gems, wristbands"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "90s anime, sci-fi",
|
|
||||||
"primary_color": "teal",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "red"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": "ryouko hakubi, space pirate"
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Tenchi Muyou!", "Tenchi Muyo!"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "samus_aran",
|
|
||||||
"character_name": "Samus Aran",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build, fair skin",
|
|
||||||
"hair": "long blonde hair, ponytail",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "serious expression",
|
|
||||||
"hands": "blue nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "beauty mark on chin"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "blue skin-tight bodysuit, pink symbols",
|
|
||||||
"lower_body": "bodysuit",
|
|
||||||
"footwear": "blue high-heeled boots",
|
|
||||||
"gloves": "zero suit",
|
|
||||||
"accessories": "paralyzer pistol"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "sci-fi, sleek, metroid style",
|
|
||||||
"primary_color": "blue",
|
|
||||||
"secondary_color": "pink",
|
|
||||||
"tertiary_color": "yellow"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Metroid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "sarah_miller_(the_last_of_us)",
|
|
||||||
"character_name": "Sarah Miller",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, loli, small build",
|
|
||||||
"hair": "blonde hair, short hair",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "flat chest",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "grey t-shirt, white shirt",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "blue jeans",
|
|
||||||
"footwear": "sneakers",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "wristwatch"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "casual, 2013 fashion",
|
|
||||||
"primary_color": "grey",
|
|
||||||
"secondary_color": "blue",
|
|
||||||
"tertiary_color": "white"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"The Last of Us"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "shantae",
|
|
||||||
"character_name": "Shantae",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, dark skin, pointy ears",
|
|
||||||
"hair": "purple hair, very long hair, ponytail",
|
|
||||||
"eyes": "blue eyes",
|
|
||||||
"expression": "smile, energetic",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "gold bracelets",
|
|
||||||
"torso": "small breasts, perky breasts",
|
|
||||||
"pelvis": "wide hips",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "red bikini top, red harem pants, gold trim",
|
|
||||||
"lower_body": "",
|
|
||||||
"footwear": "gold shoes",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "gold tiara, hoop earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "genie, dancer, arabian",
|
|
||||||
"primary_color": "red",
|
|
||||||
"secondary_color": "gold",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Shantae"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "sucy_manbavaran",
|
|
||||||
"character_name": "Sucy Manbavaran",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, lanky build, pale skin",
|
|
||||||
"hair": "light purple hair, hair covering one eye",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "deadpan expression",
|
|
||||||
"hands": "black nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "narrow waist",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "dark circles under eyes"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "dark purple witch robes",
|
|
||||||
"lower_body": "long skirt with frayed edges",
|
|
||||||
"footwear": "brown boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "pointed witch hat, potion bottle"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "gothic, whimsical, little witch academia style",
|
|
||||||
"primary_color": "purple",
|
|
||||||
"secondary_color": "mauve",
|
|
||||||
"tertiary_color": "green"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Little Witch Academia"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "tifa_lockhart",
|
|
||||||
"character_name": "Tifa Lockhart",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, athletic build, fair skin",
|
|
||||||
"hair": "long black hair, tied end",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "kind smile",
|
|
||||||
"hands": "dark red nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "black sports bra",
|
|
||||||
"outer_layer": "white tank top, black suspenders",
|
|
||||||
"lower_body": "black miniskirt",
|
|
||||||
"footwear": "red boots, black socks",
|
|
||||||
"gloves": "red fingerless gloves",
|
|
||||||
"accessories": "silver earrings"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "urban, martial arts, final fantasy style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "red"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy VII"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "tracer",
|
|
||||||
"character_name": "Tracer",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "short spiky brown hair",
|
|
||||||
"eyes": "brown eyes",
|
|
||||||
"expression": "energetic smile",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "freckles"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "orange leggings",
|
|
||||||
"outer_layer": "brown flight jacket, yellow vest",
|
|
||||||
"lower_body": "orange leggings",
|
|
||||||
"footwear": "white and orange sneakers",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "chronal accelerator, yellow goggles"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "sci-fi, pilot, overwatch style",
|
|
||||||
"primary_color": "orange",
|
|
||||||
"secondary_color": "brown",
|
|
||||||
"tertiary_color": "white"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Overwatch"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "urbosa",
|
|
||||||
"character_name": "Urbosa",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, tall, muscular, dark skin, gerudo",
|
|
||||||
"hair": "long red hair, wild hair",
|
|
||||||
"eyes": "green eyes",
|
|
||||||
"expression": "confident",
|
|
||||||
"hands": "gold nails",
|
|
||||||
"arms": "muscular arms",
|
|
||||||
"torso": "abs, mediumS breasts",
|
|
||||||
"pelvis": "wide hips",
|
|
||||||
"legs": "muscular legs",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "dark blue lipstick, gerudo markings"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "blue top, blue champion's skirt, green sash, green shoulder guards,",
|
|
||||||
"lower_body": "blue skirt",
|
|
||||||
"footwear": "gold heels",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "gold jewelry, scimitar"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fantasy, warrior, gerudo style",
|
|
||||||
"primary_color": "gold",
|
|
||||||
"secondary_color": "blue",
|
|
||||||
"tertiary_color": "red"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"The Legend of Zelda"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "widowmaker",
|
|
||||||
"character_name": "Widowmaker",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, blue skin",
|
|
||||||
"hair": "long purple hair, ponytail",
|
|
||||||
"eyes": "yellow eyes",
|
|
||||||
"expression": "cold expression",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "spider tattoo on arm",
|
|
||||||
"torso": "large breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "blue skin"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "purple tactical bodysuit, plunging neckline",
|
|
||||||
"lower_body": "bodysuit",
|
|
||||||
"footwear": "purple high-heeled boots",
|
|
||||||
"gloves": "purple gauntlets",
|
|
||||||
"accessories": "sniper visor, grappling hook"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "sci-fi, assassin, overwatch style",
|
|
||||||
"primary_color": "purple",
|
|
||||||
"secondary_color": "black",
|
|
||||||
"tertiary_color": "pink"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Overwatch"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "yor_briar",
|
|
||||||
"character_name": "Yor Briar",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "long black hair, styled with gold headband",
|
|
||||||
"eyes": "red eyes",
|
|
||||||
"expression": "gentle yet mysterious smile",
|
|
||||||
"hands": "black nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "medium breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black backless halter dress, red rose pattern inside",
|
|
||||||
"lower_body": "black thigh-high boots",
|
|
||||||
"footwear": "black boots",
|
|
||||||
"gloves": "black fingerless gloves",
|
|
||||||
"accessories": "gold rose-themed headband, gold needle weapons"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "elegant, assassin, spy x family style",
|
|
||||||
"primary_color": "black",
|
|
||||||
"secondary_color": "red",
|
|
||||||
"tertiary_color": "gold"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Spy x Family"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "y'shtola_rhul",
|
|
||||||
"character_name": "Y'shtola Rhul",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, miqo'te, slender build, fair skin, cat ears",
|
|
||||||
"hair": "short white hair, bangs",
|
|
||||||
"eyes": "blind, white eyes",
|
|
||||||
"expression": "stoic expression",
|
|
||||||
"hands": "black nails",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "facial markings, cat tail"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "black sorceress robes, fur trim",
|
|
||||||
"lower_body": "long skirt",
|
|
||||||
"footwear": "black boots",
|
|
||||||
"gloves": "",
|
|
||||||
"accessories": "wooden staff"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "magical, scholarly, final fantasy xiv style",
|
|
||||||
"primary_color": "black",
|
|
||||||
"secondary_color": "white",
|
|
||||||
"tertiary_color": "purple"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy XIV"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "yuffie_kisaragi",
|
|
||||||
"character_name": "Yuffie Kisaragi",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender build, fair skin",
|
|
||||||
"hair": "short black hair, bob cut",
|
|
||||||
"eyes": "brown eyes",
|
|
||||||
"expression": "playful grin",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "black sleeve on one arm",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": "headband"
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "",
|
|
||||||
"outer_layer": "green turtleneck sweater vest, midriff",
|
|
||||||
"lower_body": "beige shorts",
|
|
||||||
"footwear": "boots, socks",
|
|
||||||
"gloves": "fingerless glove on one hand, large gauntlet on one arm",
|
|
||||||
"accessories": "shuriken"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "ninja, adventurer, final fantasy style",
|
|
||||||
"primary_color": "green",
|
|
||||||
"secondary_color": "beige",
|
|
||||||
"tertiary_color": "black"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 1.0,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy VII"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"character_id": "yuna_(ff10)",
|
|
||||||
"character_name": "Yuna",
|
|
||||||
"identity": {
|
|
||||||
"base_specs": "1girl, slender, fair skin",
|
|
||||||
"hair": "short brown hair, bob cut",
|
|
||||||
"eyes": "heterochromia, blue eye, green eye",
|
|
||||||
"expression": "gentle",
|
|
||||||
"hands": "",
|
|
||||||
"arms": "",
|
|
||||||
"torso": "small breasts",
|
|
||||||
"pelvis": "",
|
|
||||||
"legs": "",
|
|
||||||
"feet": "",
|
|
||||||
"distinguishing_marks": ""
|
|
||||||
},
|
|
||||||
"wardrobe": {
|
|
||||||
"inner_layer": "white kimono top, yellow obi",
|
|
||||||
"outer_layer": "",
|
|
||||||
"lower_body": "long blue skirt, floral pattern",
|
|
||||||
"footwear": "boots",
|
|
||||||
"gloves": "detached sleeves",
|
|
||||||
"accessories": "summoner staff, necklace"
|
|
||||||
},
|
|
||||||
"styles": {
|
|
||||||
"aesthetic": "fantasy, final fantasy x style",
|
|
||||||
"primary_color": "white",
|
|
||||||
"secondary_color": "blue",
|
|
||||||
"tertiary_color": "yellow"
|
|
||||||
},
|
|
||||||
"lora": {
|
|
||||||
"lora_name": "",
|
|
||||||
"lora_weight": 0.8,
|
|
||||||
"lora_triggers": ""
|
|
||||||
},
|
|
||||||
"tags": [
|
|
||||||
"Final Fantasy X"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"4": {
|
"4": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"ckpt_name": "Noob/oneObsession_v19Atypical.safetensors"
|
"ckpt_name": ""
|
||||||
},
|
},
|
||||||
"class_type": "CheckpointLoaderSimple"
|
"class_type": "CheckpointLoaderSimple"
|
||||||
},
|
},
|
||||||
@@ -169,5 +169,45 @@
|
|||||||
"clip": ["4", 1]
|
"clip": ["4", 1]
|
||||||
},
|
},
|
||||||
"class_type": "LoraLoader"
|
"class_type": "LoraLoader"
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "",
|
||||||
|
"strength_model": 0.8,
|
||||||
|
"strength_clip": 0.8,
|
||||||
|
"model": ["16", 0],
|
||||||
|
"clip": ["16", 1]
|
||||||
|
},
|
||||||
|
"class_type": "LoraLoader"
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "",
|
||||||
|
"strength_model": 1.0,
|
||||||
|
"strength_clip": 1.0,
|
||||||
|
"model": ["17", 0],
|
||||||
|
"clip": ["17", 1]
|
||||||
|
},
|
||||||
|
"class_type": "LoraLoader"
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "",
|
||||||
|
"strength_model": 1.0,
|
||||||
|
"strength_clip": 1.0,
|
||||||
|
"model": ["18", 0],
|
||||||
|
"clip": ["18", 1]
|
||||||
|
},
|
||||||
|
"class_type": "LoraLoader"
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "",
|
||||||
|
"strength_model": 1.0,
|
||||||
|
"strength_clip": 1.0,
|
||||||
|
"model": ["19", 0],
|
||||||
|
"clip": ["19", 1]
|
||||||
|
},
|
||||||
|
"class_type": "LoraLoader"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
29
data/actions/3p_sex_000037.json
Normal file
29
data/actions/3p_sex_000037.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"action_id": "3p_sex_000037",
|
||||||
|
"action_name": "3P Sex 000037",
|
||||||
|
"action": {
|
||||||
|
"base": "threesome",
|
||||||
|
"head": "blush, half-closed_eyes",
|
||||||
|
"upper_body": "reaching, nude",
|
||||||
|
"lower_body": "sex, spread_legs",
|
||||||
|
"hands": "groping",
|
||||||
|
"feet": "toes_curled",
|
||||||
|
"additional": "sweat"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/3P_SEX-000037.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": "threesome, group_sex",
|
||||||
|
"lora_weight_min": 0.8,
|
||||||
|
"lora_weight_max": 0.8
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"threesome",
|
||||||
|
"group_sex",
|
||||||
|
"nude",
|
||||||
|
"sex",
|
||||||
|
"blush",
|
||||||
|
"groping",
|
||||||
|
"sweat"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/4p_sex.json
Normal file
32
data/actions/4p_sex.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "4p_sex",
|
||||||
|
"action_name": "4P Sex",
|
||||||
|
"action": {
|
||||||
|
"base": "Choreographed foursome group sex scene involving four participants (e.g., 1 girl and 3 boys or 3 girls and 1 boy) engaged in simultaneous sexual acts like double penetration or cooperative fellatio.",
|
||||||
|
"head": "Moaning expression, open mouth, potentially heavily breathing or performing fellatio., Heart-shaped pupils, ahegao, or rolling back in pleasure.",
|
||||||
|
"upper_body": "Bracing on the surface (all fours), holding onto partners, or grabbing sheets., Nude, arching back, breasts exposed and pressed or being touched.",
|
||||||
|
"lower_body": "Engaged in intercourse, involving vaginal or anal penetration, potentially double penetration., Spread wide, positioned in all fours, missionary, or reverse cowgirl depending on specific interaction.",
|
||||||
|
"hands": "Grabbing breasts, holding legs, fingering, or resting on knees/shoulders.",
|
||||||
|
"feet": "Toes curled, dynamic positioning based on stance (kneeling or lying).",
|
||||||
|
"additional": "Sexual fluids, messy after-sex atmosphere, sweat, steaming body."
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/4P_sex.safetensors",
|
||||||
|
"lora_weight": 0.6,
|
||||||
|
"lora_triggers": "4P_sexV1",
|
||||||
|
"lora_weight_min": 0.6,
|
||||||
|
"lora_weight_max": 0.6
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"4P_sexV1",
|
||||||
|
"group sex",
|
||||||
|
"foursome",
|
||||||
|
"4P",
|
||||||
|
"double penetration",
|
||||||
|
"fellatio",
|
||||||
|
"all fours",
|
||||||
|
"uncensored",
|
||||||
|
"hetero",
|
||||||
|
"sex"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"action_id": "_malebolgia__oral_sex_tounge_afterimage_concept_2_0_illustrious",
|
||||||
|
"action_name": "Malebolgia Oral Sex Tounge Afterimage Concept 2 0 Illustrious",
|
||||||
|
"action": {
|
||||||
|
"base": "kneeling, leaning forward, engaged in oral activity",
|
||||||
|
"head": "facing target, mouth wide open, intense expression, looking up, half-closed",
|
||||||
|
"upper_body": "reaching forward, angled towards partner",
|
||||||
|
"lower_body": "stationary, kneeling on the floor",
|
||||||
|
"hands": "grasping partner's thighs or hips",
|
||||||
|
"feet": "tucked behind",
|
||||||
|
"additional": "afterimage, motion blur, multiple tongues, rapid tongue movement, speed lines, saliva trails"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/[Malebolgia] Oral Sex Tounge Afterimage Concept 2.0 Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "[Malebolgia] Oral Sex Tounge Afterimage Concept 2.0 Illustrious",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"oral",
|
||||||
|
"rapid motion",
|
||||||
|
"tongue play",
|
||||||
|
"motion blur",
|
||||||
|
"surreal"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"action_id": "actually_reliable_penis_kissing_3_variants_illustrious",
|
||||||
|
"action_name": "Actually Reliable Penis Kissing 3 Variants Illustrious",
|
||||||
|
"action": {
|
||||||
|
"base": "kneeling in front of standing or sitting partner, leaning forward towards crotch",
|
||||||
|
"head": "face aligned with groin, lips pressing against glans or shaft, tongue slightly out, kissing connection, looking up at partner or closed in enjoyment, half-closed",
|
||||||
|
"upper_body": "reaching forward or resting on partner's legs, leaning forward, arched back",
|
||||||
|
"lower_body": "kneeling pose, hips pushed back, kneeling on the ground",
|
||||||
|
"hands": "gently holding the shaft, cupping testicles, or resting on partner's thighs",
|
||||||
|
"feet": "toes curled or flat",
|
||||||
|
"additional": "saliva connection, affectionate oral interaction, unsucked penis"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Actually_Reliable_Penis_Kissing_3_Variants_Illustrious.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Actually_Reliable_Penis_Kissing_3_Variants_Illustrious",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"penis kissing",
|
||||||
|
"fellatio",
|
||||||
|
"oral sex",
|
||||||
|
"kneeling",
|
||||||
|
"saliva",
|
||||||
|
"tongue",
|
||||||
|
"close-up"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"action_id": "after_sex_fellatio_illustriousxl_lora_nochekaiser_r1",
|
||||||
|
"action_name": "After Sex Fellatio Illustriousxl Lora Nochekaiser R1",
|
||||||
|
"action": {
|
||||||
|
"base": "completely_nude, lying, on_back, m_legs, spread_legs",
|
||||||
|
"head": "looking_at_viewer, tongue, open_mouth, blush, messing_hair, half-closed_eyes, blue_eyes",
|
||||||
|
"upper_body": "arms_at_sides, on_bed, large_breasts, nipples, sweat",
|
||||||
|
"lower_body": "pussy, cum_in_pussy, leaking_cum, m_legs, spread_legs, legs_up",
|
||||||
|
"hands": "on_bed, pressing_bed",
|
||||||
|
"feet": "barefoot, toes",
|
||||||
|
"additional": "after_sex, after_vaginal, fellatio, penis, cum, cumdrip, messy_body, bed_sheet"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/after-sex-fellatio-illustriousxl-lora-nochekaiser_r1.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "after sex fellatio",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"after_sex",
|
||||||
|
"after_vaginal",
|
||||||
|
"fellatio",
|
||||||
|
"cum_in_pussy",
|
||||||
|
"m_legs",
|
||||||
|
"lying",
|
||||||
|
"on_back",
|
||||||
|
"on_bed",
|
||||||
|
"cumdrip",
|
||||||
|
"completely_nude",
|
||||||
|
"nipples",
|
||||||
|
"tongue",
|
||||||
|
"penis",
|
||||||
|
"cum"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/afterfellatio_ill.json
Normal file
32
data/actions/afterfellatio_ill.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "afterfellatio_ill",
|
||||||
|
"action_name": "Afterfellatio Ill",
|
||||||
|
"action": {
|
||||||
|
"base": "kneeling, leaning_forward, pov",
|
||||||
|
"head": "looking_at_viewer, blush, tilted_head, cum_on_face, half-closed_eyes, tears",
|
||||||
|
"upper_body": "arms_down, reaching_towards_viewer, leaning_forward",
|
||||||
|
"lower_body": "kneeling, kneeling",
|
||||||
|
"hands": "handjob, touching_penis",
|
||||||
|
"feet": "barefoot",
|
||||||
|
"additional": "cum_string, cum_in_mouth, closed_mouth"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/afterfellatio_ill.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": "after fellatio, cum in mouth, closed mouth, cum string",
|
||||||
|
"lora_weight_min": 0.8,
|
||||||
|
"lora_weight_max": 0.8
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"after_fellatio",
|
||||||
|
"cum_in_mouth",
|
||||||
|
"cum_string",
|
||||||
|
"closed_mouth",
|
||||||
|
"blush",
|
||||||
|
"half-closed_eyes",
|
||||||
|
"looking_at_viewer",
|
||||||
|
"kneeling",
|
||||||
|
"pov",
|
||||||
|
"handjob"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/afteroral.json
Normal file
32
data/actions/afteroral.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "afteroral",
|
||||||
|
"action_name": "Afteroral",
|
||||||
|
"action": {
|
||||||
|
"base": "Character depicted immediately after performing oral sex, often focusing on the upper body and face.",
|
||||||
|
"head": "Messy hair, flushed cheeks, mouth slightly open or panting., Half-closed or dazed expression, potentially with runny mascara or makeup.",
|
||||||
|
"upper_body": "Relaxed or wiping mouth., Heaving chest indicative of heavy breathing.",
|
||||||
|
"lower_body": "N/A (typically upper body focus), N/A",
|
||||||
|
"hands": "Resting or near face.",
|
||||||
|
"feet": "N/A",
|
||||||
|
"additional": "Presence of bodily fluids like saliva trails or excessive cum on face and messy makeup."
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/afteroral.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "after oral, after deepthroat",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"after_fellatio",
|
||||||
|
"runny_makeup",
|
||||||
|
"smeared_lipstick",
|
||||||
|
"saliva_trail",
|
||||||
|
"excessive_cum",
|
||||||
|
"messy_hair",
|
||||||
|
"heavy_breathing",
|
||||||
|
"cum_bubble",
|
||||||
|
"penis_on_face",
|
||||||
|
"sweat"
|
||||||
|
]
|
||||||
|
}
|
||||||
34
data/actions/afterpaizuri.json
Normal file
34
data/actions/afterpaizuri.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"action_id": "afterpaizuri",
|
||||||
|
"action_name": "Afterpaizuri",
|
||||||
|
"action": {
|
||||||
|
"base": "kneeling or sitting, displaying upper body aftermath, exhausted posture",
|
||||||
|
"head": "flushed face, messy hair, panting, mouth slightly open, tongue out, half-closed eyes, dazed expression, looking at viewer",
|
||||||
|
"upper_body": "resting on thighs or gesturing towards chest, exposed cleavage, chest covered in white liquid, disheveled clothes",
|
||||||
|
"lower_body": "hips settling back, kneeling posture, kneeling, thighs together or slightly spread",
|
||||||
|
"hands": "presenting breasts or cleaning face",
|
||||||
|
"feet": "tucked under buttocks or relaxed",
|
||||||
|
"additional": "semen on breasts, semen on face, heavy breathing, sweat, sticky fluids"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "F"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/afterpaizuri.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "afterpaizuri",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"after paizuri",
|
||||||
|
"semen on breasts",
|
||||||
|
"semen on face",
|
||||||
|
"messy",
|
||||||
|
"blush",
|
||||||
|
"dazed",
|
||||||
|
"sweat",
|
||||||
|
"disheveled"
|
||||||
|
]
|
||||||
|
}
|
||||||
40
data/actions/aftersexbreakv2.json
Normal file
40
data/actions/aftersexbreakv2.json
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"action_id": "aftersexbreakv2",
|
||||||
|
"action_name": "Aftersexbreakv2",
|
||||||
|
"action": {
|
||||||
|
"base": "lying, on_back, on_bed, bowlegged_pose, spread_legs, twisted_torso",
|
||||||
|
"head": "messy_hair, head_back, sweaty_face, rolling_eyes, half-closed_eyes, ahegao",
|
||||||
|
"upper_body": "arms_spread, arms_above_head, sweat, nipples, collarbone, heavy_breathing",
|
||||||
|
"lower_body": "hips, navel, female_pubic_hair, spread_legs, legs_up, bent_legs",
|
||||||
|
"hands": "relaxed_hands",
|
||||||
|
"feet": "barefoot",
|
||||||
|
"additional": "condom_wrapper, used_tissue, stained_sheets, cum_pool, bead_of_sweat"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/AfterSexBreakV2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "aftersexbreak, after sex, male sitting",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"after_sex",
|
||||||
|
"lying",
|
||||||
|
"on_back",
|
||||||
|
"on_bed",
|
||||||
|
"fucked_silly",
|
||||||
|
"spread_legs",
|
||||||
|
"bowlegged_pose",
|
||||||
|
"sweat",
|
||||||
|
"blush",
|
||||||
|
"messy_hair",
|
||||||
|
"heavy_breathing",
|
||||||
|
"rolling_eyes",
|
||||||
|
"ahegao",
|
||||||
|
"cum_pool",
|
||||||
|
"condom_wrapper",
|
||||||
|
"used_tissue",
|
||||||
|
"bed_sheet",
|
||||||
|
"stained_sheets"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/against_glass_bs.json
Normal file
32
data/actions/against_glass_bs.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "against_glass_bs",
|
||||||
|
"action_name": "Against Glass Bs",
|
||||||
|
"action": {
|
||||||
|
"base": "leaning forward, body pressed directly against the viewing plane/glass surface",
|
||||||
|
"head": "face close to camera, breath fog on glass, cheek slightly pressed, looking directly at viewer, intimate gaze",
|
||||||
|
"upper_body": "reaching forward towards the viewer, chest squished against glass, leaning into the surface",
|
||||||
|
"lower_body": "hips pushed forward or slightly angled back depending on angle, standing straight or knees slightly bent for leverage",
|
||||||
|
"hands": "palms pressed flat against glass, fingers spread, palm prints",
|
||||||
|
"feet": "planted firmly on the ground",
|
||||||
|
"additional": "transparent surface, condensation, distortion from glass, surface interaction"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Against_glass_bs.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Against_glass_bs",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"against glass",
|
||||||
|
"pressed against glass",
|
||||||
|
"palms on glass",
|
||||||
|
"view through glass",
|
||||||
|
"cheek press",
|
||||||
|
"distorted view"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/amateur_pov_filming.json
Normal file
32
data/actions/amateur_pov_filming.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "amateur_pov_filming",
|
||||||
|
"action_name": "Amateur Pov Filming",
|
||||||
|
"action": {
|
||||||
|
"base": "selfie pose, standing or sitting, facing viewer or mirror",
|
||||||
|
"head": "looking_at_viewer, blush, maybe open mouth or shy expression, looking_at_viewer, contact with camera",
|
||||||
|
"upper_body": "raised to hold phone or camera, upper body in frame, breasts, nipples",
|
||||||
|
"lower_body": "hips visible if full body mirror selfie, standing or sitting",
|
||||||
|
"hands": "holding_phone, holding_id_card, or adjusting clothes",
|
||||||
|
"feet": "barefoot if visible",
|
||||||
|
"additional": "phone recording interface, smartphone, mirror, amateur aesthetic"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Amateur_POV_Filming.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Homemade_PornV1, recording, pov, prostitution",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"recording",
|
||||||
|
"pov",
|
||||||
|
"selfie",
|
||||||
|
"holding_phone",
|
||||||
|
"smartphone",
|
||||||
|
"mirror_selfie",
|
||||||
|
"holding_id_card",
|
||||||
|
"looking_at_viewer",
|
||||||
|
"prostitution",
|
||||||
|
"indoors"
|
||||||
|
]
|
||||||
|
}
|
||||||
28
data/actions/arch_back_sex_v1_1_illustriousxl.json
Normal file
28
data/actions/arch_back_sex_v1_1_illustriousxl.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"action_id": "arch_back_sex_v1_1_illustriousxl",
|
||||||
|
"action_name": "Arch Back Sex V1 1 Illustriousxl",
|
||||||
|
"action": {
|
||||||
|
"base": "doggystyle, sex_from_behind, all_fours",
|
||||||
|
"head": "head_back, looking_back, closed_eyes, blush",
|
||||||
|
"upper_body": "arms_support, arched_back",
|
||||||
|
"lower_body": "lifted_hip, kneeling, spread_legs",
|
||||||
|
"hands": "grabbing_another's_ass",
|
||||||
|
"feet": "toes",
|
||||||
|
"additional": "kiss, sweat, saliva, intense_pleasure"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/arch-back-sex-v1.1-illustriousxl.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "kiss, arched_back, sex_from_behind",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"hetero",
|
||||||
|
"sex",
|
||||||
|
"vaginal",
|
||||||
|
"penis",
|
||||||
|
"nude",
|
||||||
|
"indoors"
|
||||||
|
]
|
||||||
|
}
|
||||||
37
data/actions/arm_grab_missionary_ill_10.json
Normal file
37
data/actions/arm_grab_missionary_ill_10.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"action_id": "arm_grab_missionary_ill_10",
|
||||||
|
"action_name": "Arm Grab Missionary Ill 10",
|
||||||
|
"action": {
|
||||||
|
"base": "missionary, lying, on_back, sex, vaginal",
|
||||||
|
"head": "expressive face, open mouth, one_eye_closed, blushing, looking_at_viewer (optional), dilated_pupils",
|
||||||
|
"upper_body": "arms_up, pinned, restrained, grabbed_wrists, breasts, nipples, medium_breasts",
|
||||||
|
"lower_body": "legs_spread, lifted_pelvis, spread_legs, legs_up, knees_up, straddling (if applicable)",
|
||||||
|
"hands": "interlocked_fingers, holding_hands",
|
||||||
|
"feet": "barefoot (implied)",
|
||||||
|
"additional": "faceless_male, male_focus, motion_lines, sweat"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/arm_grab_missionary_ill-10.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "arm_grab_missionary",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"missionary",
|
||||||
|
"spread_legs",
|
||||||
|
"interlocked_fingers",
|
||||||
|
"holding_hands",
|
||||||
|
"arms_up",
|
||||||
|
"pinned",
|
||||||
|
"lying",
|
||||||
|
"on_back",
|
||||||
|
"sex",
|
||||||
|
"vaginal",
|
||||||
|
"faceless_male",
|
||||||
|
"one_eye_closed",
|
||||||
|
"open_mouth",
|
||||||
|
"breasts",
|
||||||
|
"nipples"
|
||||||
|
]
|
||||||
|
}
|
||||||
29
data/actions/ballsdeep_il_v2_2_s.json
Normal file
29
data/actions/ballsdeep_il_v2_2_s.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"action_id": "ballsdeep_il_v2_2_s",
|
||||||
|
"action_name": "Ballsdeep Il V2 2 S",
|
||||||
|
"action": {
|
||||||
|
"base": "sexual intercourse, variable position (prone, girl on top, or from behind)",
|
||||||
|
"head": "expression of intensity or pleasure, often looking back or face down, rolled back or squeezed shut",
|
||||||
|
"upper_body": "grasping sheets or holding partner, arched or pressed against contrasting surface",
|
||||||
|
"lower_body": "hips pushed firmly against partner's hips, joined genitals, spread wide or wrapped around partner",
|
||||||
|
"hands": "clenched or grabbing",
|
||||||
|
"feet": "toes curled",
|
||||||
|
"additional": "deep penetration, testicles pressed flat against skin, stomach bulge visible"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BallsDeep-IL-V2.2-S.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "deep penetration",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"deep_penetration",
|
||||||
|
"testicles",
|
||||||
|
"stomach_bulge",
|
||||||
|
"sex",
|
||||||
|
"anal",
|
||||||
|
"vaginal",
|
||||||
|
"gaping"
|
||||||
|
]
|
||||||
|
}
|
||||||
30
data/actions/bathingtogether.json
Normal file
30
data/actions/bathingtogether.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"action_id": "bathingtogether",
|
||||||
|
"action_name": "Bathingtogether",
|
||||||
|
"action": {
|
||||||
|
"base": "bathing, sitting, partially_submerged",
|
||||||
|
"head": "looking_at_viewer, facing_viewer, eye_contact",
|
||||||
|
"upper_body": "arms_resting, bare_shoulders",
|
||||||
|
"lower_body": "submerged, knees_up, submerged",
|
||||||
|
"hands": "resting",
|
||||||
|
"feet": "no_shoes",
|
||||||
|
"additional": "bathtub, steam, water, bubbles, wet"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/bathingtogether.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "bathing together",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"bathing",
|
||||||
|
"bathtub",
|
||||||
|
"partially_submerged",
|
||||||
|
"pov",
|
||||||
|
"looking_at_viewer",
|
||||||
|
"wet",
|
||||||
|
"steam",
|
||||||
|
"bare_shoulders"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/before_after_1230829.json
Normal file
32
data/actions/before_after_1230829.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"base": "2koma, before and after, side-by-side",
|
||||||
|
"head": "sticky_face,facial, bukkake, cum_on_face, eyes_closed",
|
||||||
|
"upper_body": "",
|
||||||
|
"lower_body": "",
|
||||||
|
"hands": "",
|
||||||
|
"feet": "",
|
||||||
|
"additional": "cum, close-uo"
|
||||||
|
},
|
||||||
|
"action_id": "before_after_1230829",
|
||||||
|
"action_name": "Before After 1230829",
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/before_after_1230829.safetensors",
|
||||||
|
"lora_triggers": "before_after",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_weight_max": 0.7,
|
||||||
|
"lora_weight_min": 0.6
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"before_and_after",
|
||||||
|
"2koma",
|
||||||
|
"facial",
|
||||||
|
"bukkake",
|
||||||
|
"cum",
|
||||||
|
"cum_on_face",
|
||||||
|
"orgasm",
|
||||||
|
"heavy_breathing",
|
||||||
|
"upper_body",
|
||||||
|
"split_theme"
|
||||||
|
]
|
||||||
|
}
|
||||||
28
data/actions/belly_dancing.json
Normal file
28
data/actions/belly_dancing.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"action_id": "belly_dancing",
|
||||||
|
"action_name": "Belly Dancing",
|
||||||
|
"action": {
|
||||||
|
"base": "belly dancing, standing",
|
||||||
|
"head": "",
|
||||||
|
"upper_body": "hands above head",
|
||||||
|
"lower_body": "swaying hips",
|
||||||
|
"hands": "palms together",
|
||||||
|
"feet": "",
|
||||||
|
"additional": ""
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "false",
|
||||||
|
"orientation": "F"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"belly dancing",
|
||||||
|
"dance"
|
||||||
|
]
|
||||||
|
}
|
||||||
28
data/actions/bentback.json
Normal file
28
data/actions/bentback.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"action_id": "bentback",
|
||||||
|
"action_name": "Bentback",
|
||||||
|
"action": {
|
||||||
|
"base": "bent_over, leaning_forward, from_behind",
|
||||||
|
"head": "looking_at_viewer, looking_back, open_eyes",
|
||||||
|
"upper_body": "arms_at_sides, twisted_torso, arched_back",
|
||||||
|
"lower_body": "ass_focus, kneepits",
|
||||||
|
"hands": "hands_on_legs",
|
||||||
|
"feet": "barefoot",
|
||||||
|
"additional": "unnatural_body"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BentBack.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "bentback, kneepits",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"bent_over",
|
||||||
|
"from_behind",
|
||||||
|
"looking_back",
|
||||||
|
"kneepits",
|
||||||
|
"twisted_torso",
|
||||||
|
"ass_focus"
|
||||||
|
]
|
||||||
|
}
|
||||||
31
data/actions/blowjobcomicpart2.json
Normal file
31
data/actions/blowjobcomicpart2.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"action_id": "blowjobcomicpart2",
|
||||||
|
"action_name": "Blowjobcomicpart2",
|
||||||
|
"action": {
|
||||||
|
"base": "3koma, comic layout, vertical panel sequence",
|
||||||
|
"head": "tongue_out, open mouth, saliva, empty_eyes, rolled eyes",
|
||||||
|
"upper_body": "arms_down or holding_head, visible torso",
|
||||||
|
"lower_body": "sexual_activity, kneeling or sitting",
|
||||||
|
"hands": "fingers_on_penis",
|
||||||
|
"feet": "out_of_frame",
|
||||||
|
"additional": "fellatio, irrumatio, licking_penis, ejaculation, excessive_cum"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BlowjobComicPart2.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "bjmcut",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"3koma",
|
||||||
|
"comic",
|
||||||
|
"fellatio",
|
||||||
|
"irrumatio",
|
||||||
|
"licking_penis",
|
||||||
|
"ejaculation",
|
||||||
|
"excessive_cum",
|
||||||
|
"empty_eyes",
|
||||||
|
"tongue_out"
|
||||||
|
]
|
||||||
|
}
|
||||||
29
data/actions/bodybengirl.json
Normal file
29
data/actions/bodybengirl.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"action_id": "bodybengirl",
|
||||||
|
"action_name": "Bodybengirl",
|
||||||
|
"action": {
|
||||||
|
"base": "suspended_congress, lifting_person, dangling legs",
|
||||||
|
"head": "",
|
||||||
|
"upper_body": "dangling arms, torso_grab, bent_over",
|
||||||
|
"lower_body": "legs_hanging",
|
||||||
|
"hands": "",
|
||||||
|
"feet": "",
|
||||||
|
"additional": "1boy, 1girl, suspended, size difference, loli"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BodyBenGirl.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "bentstand-behind",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"suspended_congress",
|
||||||
|
"torso_grab",
|
||||||
|
"bent_over",
|
||||||
|
"reaching",
|
||||||
|
"standing",
|
||||||
|
"1boy",
|
||||||
|
"1girl"
|
||||||
|
]
|
||||||
|
}
|
||||||
30
data/actions/bodybengirlpart2.json
Normal file
30
data/actions/bodybengirlpart2.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"action_id": "bodybengirlpart2",
|
||||||
|
"action_name": "Bodybengirlpart2",
|
||||||
|
"action": {
|
||||||
|
"base": "body suspended in mid-air, held by torso, bent over forward",
|
||||||
|
"head": "embarrassed, sweating, scared, open, looking away or down",
|
||||||
|
"upper_body": "arms hanging down, limp arms, arms at sides, torso grab, bent forward",
|
||||||
|
"lower_body": "hips raised if bent over, legs dangling, knees together, feet apart",
|
||||||
|
"hands": "hands open, limp",
|
||||||
|
"feet": "feet off ground, dangling",
|
||||||
|
"additional": "motion lines, sweat drops"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BodyBenGirlPart2.safetensors",
|
||||||
|
"lora_weight": 0.9,
|
||||||
|
"lora_triggers": "bentstand-behind, dangling legs, dangling arms, from_side, arms hanging down, torso_grab, suspended",
|
||||||
|
"lora_weight_min": 0.9,
|
||||||
|
"lora_weight_max": 0.9
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"torso_grab",
|
||||||
|
"suspension",
|
||||||
|
"bent_over",
|
||||||
|
"knees_together_feet_apart",
|
||||||
|
"arms_at_sides",
|
||||||
|
"motion_lines",
|
||||||
|
"embarrassed",
|
||||||
|
"sweat"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/bored_retrain_000115_1336316.json
Normal file
32
data/actions/bored_retrain_000115_1336316.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "bored_retrain_000115_1336316",
|
||||||
|
"action_name": "Bored Retrain 000115 1336316",
|
||||||
|
"action": {
|
||||||
|
"base": "slouching sitting posture, low energy, visually disinterested, exhibiting ennui",
|
||||||
|
"head": "tilted to the side, resting heavily on hand, cheek squished against palm, blank or annoyed expression, half-lidded, dull gaze, looking away or staring into space, heavy eyelids",
|
||||||
|
"upper_body": "elbow proped on surface, arm supporting the head, other arm dangling loosely or lying flat, slumped shoulders, curved spine, leaning forward",
|
||||||
|
"lower_body": "sitting back, relaxed weight, stretched out under a table or loosely crossed",
|
||||||
|
"hands": "palm supporting chin or cheek, fingers lazily curled",
|
||||||
|
"feet": "resting idly",
|
||||||
|
"additional": "sighing context, waiting, lethargic atmosphere"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Bored_Retrain-000115_1336316.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Bored_Retrain-000115_1336316",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"boredom",
|
||||||
|
"uninterested",
|
||||||
|
"slouching",
|
||||||
|
"ennui",
|
||||||
|
"tired",
|
||||||
|
"cheek resting on hand"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/breast_pressh.json
Normal file
32
data/actions/breast_pressh.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "breast_pressh",
|
||||||
|
"action_name": "Breast Pressh",
|
||||||
|
"action": {
|
||||||
|
"base": "sandwiched, girl_sandwich, standing, height_difference, size_difference",
|
||||||
|
"head": "head_between_breasts, face_between_breasts, cheek_squash, eyes_closed, squints",
|
||||||
|
"upper_body": "hugging, arms_around_waist, breast_press, chest_to_chest",
|
||||||
|
"lower_body": "hips_touching, standing, legs_apart",
|
||||||
|
"hands": "hands_on_back",
|
||||||
|
"feet": "barefoot",
|
||||||
|
"additional": "1boy, 2girls, multiple_girls, hetero"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/breast_pressH.safetensors",
|
||||||
|
"lora_weight": 0.6,
|
||||||
|
"lora_triggers": "breast_pressH",
|
||||||
|
"lora_weight_min": 0.6,
|
||||||
|
"lora_weight_max": 0.6
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"height_difference",
|
||||||
|
"girl_sandwich",
|
||||||
|
"breast_press",
|
||||||
|
"sandwiched",
|
||||||
|
"size_difference",
|
||||||
|
"head_between_breasts",
|
||||||
|
"cheek_squash",
|
||||||
|
"face_between_breasts",
|
||||||
|
"1boy",
|
||||||
|
"2girls"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"action_id": "breast_smother_illustriousxl_lora_nochekaiser",
|
||||||
|
"action_name": "Breast Smother Illustriousxl Lora Nochekaiser",
|
||||||
|
"action": {
|
||||||
|
"base": "intimate upper body POV or side view, character pressing another's face into their chest",
|
||||||
|
"head": "tilted downwards, chin tucked, affectionate or dominant expression, looking down, half-closed, affectionate gaze",
|
||||||
|
"upper_body": "wrapping around the partner's head or neck, leaning slightly backward, chest prominent, squished breasts, cleavage",
|
||||||
|
"lower_body": "close contact, standing or sitting, posture relaxed",
|
||||||
|
"hands": "cradling the back of the head, fingers interlocked in hair, pressing face deeper",
|
||||||
|
"feet": "planted on ground",
|
||||||
|
"additional": "face buried in breasts, chest covering face, soft lighting, skin compression"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/breast-smother-illustriousxl-lora-nochekaiser.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "breast-smother-illustriousxl-lora-nochekaiser",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"breast smother",
|
||||||
|
"buried in breasts",
|
||||||
|
"face in cleavage",
|
||||||
|
"motorboating",
|
||||||
|
"breast press",
|
||||||
|
"hugging",
|
||||||
|
"embrace",
|
||||||
|
"pov",
|
||||||
|
"large breasts"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"action_id": "breast_sucking_fingering_illustriousxl_lora_nochekaiser",
|
||||||
|
"action_name": "Breast Sucking Fingering Illustriousxl Lora Nochekaiser",
|
||||||
|
"action": {
|
||||||
|
"base": "duo, sexual interaction, close-up, breast sucking, fingering, intimate embrace",
|
||||||
|
"head": "face buried in breasts, sucking nipple, kissing breast, saliva, eyes closed, heavy breathing, blush, expression of bliss",
|
||||||
|
"upper_body": "reaching down, holding partner close, arm around waist, large breasts, exposed nipples, nude torso, pressing bodies",
|
||||||
|
"lower_body": "legs spread, pussy exposed, vaginal manipulation, open legs, m-legs, intertwined legs",
|
||||||
|
"hands": "fingering, fingers inside, rubbing clitoris, squeezing breast, groping",
|
||||||
|
"feet": "toes curled, relaxed feet",
|
||||||
|
"additional": "saliva trail, sweat, motion lines, uncensored"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/breast-sucking-fingering-illustriousxl-lora-nochekaiser.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "breast-sucking-fingering-illustriousxl-lora-nochekaiser",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"breast sucking",
|
||||||
|
"fingering",
|
||||||
|
"nipple suck",
|
||||||
|
"fingers in pussy",
|
||||||
|
"duo",
|
||||||
|
"sexual act",
|
||||||
|
"exposed breasts",
|
||||||
|
"pussy juice",
|
||||||
|
"saliva",
|
||||||
|
"stimulation"
|
||||||
|
]
|
||||||
|
}
|
||||||
34
data/actions/brokenglass_illusxl_incrs_v1.json
Normal file
34
data/actions/brokenglass_illusxl_incrs_v1.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"action_id": "brokenglass_illusxl_incrs_v1",
|
||||||
|
"action_name": "Brokenglass Illusxl Incrs V1",
|
||||||
|
"action": {
|
||||||
|
"base": "dynamic shot of character seemingly breaking through a barrier",
|
||||||
|
"head": "intense expression, face visible through cracks, sharp focus, wide open",
|
||||||
|
"upper_body": "outstretched towards the viewer or shielding face, twisted slightly to suggest impact force",
|
||||||
|
"lower_body": "anchored or mid-air depending on angle, posed dynamically to support the movement",
|
||||||
|
"hands": "touching the surface of the invisible wall, interacting with fragments",
|
||||||
|
"feet": "grounded or trailing",
|
||||||
|
"additional": "foreground filled with sharp broken glass shards, spiderweb cracks glowing with light, refractive surfaces, cinematic debris"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "F"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/BrokenGlass_illusXL_Incrs_v1.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "BrokenGlass_illusXL_Incrs_v1",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"broken glass",
|
||||||
|
"shattered",
|
||||||
|
"cracked screen",
|
||||||
|
"fragmentation",
|
||||||
|
"glass shards",
|
||||||
|
"impact",
|
||||||
|
"cinematic",
|
||||||
|
"destruction"
|
||||||
|
]
|
||||||
|
}
|
||||||
34
data/actions/butt_smother_ag_000043.json
Normal file
34
data/actions/butt_smother_ag_000043.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"action_id": "butt_smother_ag_000043",
|
||||||
|
"action_name": "Butt Smother Ag 000043",
|
||||||
|
"action": {
|
||||||
|
"base": "1boy,1girl,facesitting, character sitting on face, pov from below, dominant pose",
|
||||||
|
"head": "looking down at viewer, looking back over shoulder, looking at viewer, half-closed eyes, seductive gaze",
|
||||||
|
"upper_body": "arms reaching back, supporting weight, back arched, leaning forward",
|
||||||
|
"lower_body": "buttocks pressing down slightly, buttocks covering screen, heavy weight, thighs straddling viewer, knees bent, spread legs",
|
||||||
|
"hands": "hands spreading buttocks, hands on thighs, hands grasping victim's head",
|
||||||
|
"feet": "feet planted on ground, toes curled",
|
||||||
|
"additional": "extreme close-up, squished face, muffling, soft lighting on skin"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Butt_smother_ag-000043.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Butt_smother_ag-000043",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"facesitting",
|
||||||
|
"butt smother",
|
||||||
|
"femdom",
|
||||||
|
"pov",
|
||||||
|
"big ass",
|
||||||
|
"ass focus",
|
||||||
|
"suffocation",
|
||||||
|
"submissive view"
|
||||||
|
]
|
||||||
|
}
|
||||||
28
data/actions/buttjob.json
Normal file
28
data/actions/buttjob.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"action_id": "buttjob",
|
||||||
|
"action_name": "Buttjob",
|
||||||
|
"action": {
|
||||||
|
"base": "bent over, buttjob",
|
||||||
|
"head": "",
|
||||||
|
"upper_body": "",
|
||||||
|
"lower_body": "buttjob",
|
||||||
|
"hands": "",
|
||||||
|
"feet": "",
|
||||||
|
"additional": ""
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/buttjob.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "buttjob",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"buttjob",
|
||||||
|
"butt"
|
||||||
|
]
|
||||||
|
}
|
||||||
35
data/actions/carwashv2.json
Normal file
35
data/actions/carwashv2.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"action_id": "carwashv2",
|
||||||
|
"action_name": "Carwashv2",
|
||||||
|
"action": {
|
||||||
|
"base": "washing_vehicle, bending_over",
|
||||||
|
"head": "wet_hair",
|
||||||
|
"upper_body": "wet_clothes, breast_press, breasts_on_glass",
|
||||||
|
"lower_body": "",
|
||||||
|
"hands": "holding_sponge, holding_hose",
|
||||||
|
"feet": "",
|
||||||
|
"additional": "car, motor_vehicle, soap_bubbles"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/CarWashV2.safetensors",
|
||||||
|
"lora_weight": 0.8,
|
||||||
|
"lora_triggers": "w4sh1n, w4sh0ut",
|
||||||
|
"lora_weight_min": 0.8,
|
||||||
|
"lora_weight_max": 0.8
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"car",
|
||||||
|
"motor_vehicle",
|
||||||
|
"washing_vehicle",
|
||||||
|
"soap_bubbles",
|
||||||
|
"wet",
|
||||||
|
"wet_hair",
|
||||||
|
"wet_clothes",
|
||||||
|
"holding_sponge",
|
||||||
|
"holding_hose",
|
||||||
|
"breasts_on_glass",
|
||||||
|
"breast_press",
|
||||||
|
"outdoors",
|
||||||
|
"car_interior"
|
||||||
|
]
|
||||||
|
}
|
||||||
33
data/actions/cat_stretchill.json
Normal file
33
data/actions/cat_stretchill.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cat_stretchill",
|
||||||
|
"action_name": "Cat Stretchill",
|
||||||
|
"action": {
|
||||||
|
"base": "kneeling, all_fours, cat_stretch, pose",
|
||||||
|
"head": "looking_ahead, head_down, closed_eyes, trembling",
|
||||||
|
"upper_body": "outstretched_arms, reaching_forward, hands_on_ground, arched_back, chest_down",
|
||||||
|
"lower_body": "hips_up, buttocks_up, kneeling, knees_on_ground",
|
||||||
|
"hands": "palms_down",
|
||||||
|
"feet": "feet_up",
|
||||||
|
"additional": "cat_ears, cat_tail, trembling"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cat_stretchILL.safetensors",
|
||||||
|
"lora_weight": 0.7,
|
||||||
|
"lora_triggers": "stretching, cat stretch, downward dog, trembling",
|
||||||
|
"lora_weight_min": 0.7,
|
||||||
|
"lora_weight_max": 0.7
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"cat_stretch",
|
||||||
|
"kneeling",
|
||||||
|
"all_fours",
|
||||||
|
"stretching",
|
||||||
|
"arched_back",
|
||||||
|
"outstretched_arms",
|
||||||
|
"hands_on_ground",
|
||||||
|
"downward_dog",
|
||||||
|
"trembling",
|
||||||
|
"cat_ears",
|
||||||
|
"cat_tail"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/charm_person_magic.json
Normal file
32
data/actions/charm_person_magic.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "charm_person_magic",
|
||||||
|
"action_name": "Charm Person Magic",
|
||||||
|
"action": {
|
||||||
|
"base": "casting_spell, standing, magical_presence",
|
||||||
|
"head": "smile, confident_expression, glowing_eyes, looking_at_viewer, glowing_eyes",
|
||||||
|
"upper_body": "outstretched_hand, reaching_towards_viewer, arms_up, upper_body, facing_viewer",
|
||||||
|
"lower_body": "n/a, n/a",
|
||||||
|
"hands": "open_hand, hand_gesture",
|
||||||
|
"feet": "n/a",
|
||||||
|
"additional": "aura, soft_light, magic_effects, sparkling"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/charm_person_magic.safetensors",
|
||||||
|
"lora_weight": 0.7,
|
||||||
|
"lora_triggers": "charm_person_(magic), cham_aura",
|
||||||
|
"lora_weight_min": 0.7,
|
||||||
|
"lora_weight_max": 0.7
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"casting_spell",
|
||||||
|
"magic",
|
||||||
|
"aura",
|
||||||
|
"outstretched_hand",
|
||||||
|
"reaching_towards_viewer",
|
||||||
|
"glowing_eyes",
|
||||||
|
"looking_at_viewer",
|
||||||
|
"smile",
|
||||||
|
"cowboy_shot",
|
||||||
|
"solo"
|
||||||
|
]
|
||||||
|
}
|
||||||
29
data/actions/cheekbulge.json
Normal file
29
data/actions/cheekbulge.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cheekbulge",
|
||||||
|
"action_name": "Cheekbulge",
|
||||||
|
"action": {
|
||||||
|
"base": "fellatio",
|
||||||
|
"head": "cheek_bulge, head_tilt, saliva, penis in mouth, fellatio, looking_up",
|
||||||
|
"upper_body": "arms_behind_back, upper_body",
|
||||||
|
"lower_body": "kneeling, kneeling",
|
||||||
|
"hands": "hands_on_head",
|
||||||
|
"feet": "plantar_flexion",
|
||||||
|
"additional": "deepthroat, pov, penis"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cheekbulge.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cheek bulge, male pov",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"cheek_bulge",
|
||||||
|
"deepthroat",
|
||||||
|
"fellatio",
|
||||||
|
"saliva",
|
||||||
|
"head_tilt",
|
||||||
|
"penis",
|
||||||
|
"pov"
|
||||||
|
]
|
||||||
|
}
|
||||||
34
data/actions/chokehold.json
Normal file
34
data/actions/chokehold.json
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"action_id": "chokehold",
|
||||||
|
"action_name": "Chokehold",
|
||||||
|
"action": {
|
||||||
|
"base": "rear_naked_choke, from_behind, struggling, kneeling",
|
||||||
|
"head": "head_back, expressionless, open_mouth, rolling_eyes, tearing_up, empty_eyes",
|
||||||
|
"upper_body": "arm_around_neck, struggling, grabbing_arm, leaning_forward, arched_back",
|
||||||
|
"lower_body": "kneeling, bent_over, kneeling, spread_legs",
|
||||||
|
"hands": "clenched_hands, struggling",
|
||||||
|
"feet": "barefoot, toes_curled",
|
||||||
|
"additional": "distress, blushing, saliva, veins"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/chokehold.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "choke hold",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"choke_hold",
|
||||||
|
"rear_naked_choke",
|
||||||
|
"strangling",
|
||||||
|
"arm_around_neck",
|
||||||
|
"from_behind",
|
||||||
|
"struggling",
|
||||||
|
"head_back",
|
||||||
|
"clenched_teeth",
|
||||||
|
"rolling_eyes",
|
||||||
|
"drooling",
|
||||||
|
"saliva",
|
||||||
|
"ohogao"
|
||||||
|
]
|
||||||
|
}
|
||||||
36
data/actions/cleavageteasedwnsty_000008.json
Normal file
36
data/actions/cleavageteasedwnsty_000008.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cleavageteasedwnsty_000008",
|
||||||
|
"action_name": "Cleavageteasedwnsty 000008",
|
||||||
|
"action": {
|
||||||
|
"base": "leaning_forward, sexually_suggestive",
|
||||||
|
"head": "looking_at_viewer, smile, blush, one_eye_closed, blue_eyes, looking_at_viewer",
|
||||||
|
"upper_body": "arms_bent_at_elbows, cleavage, breasts_squeezed_together, areola_slip, bare_shoulders, collarbone",
|
||||||
|
"lower_body": "n/a, n/a",
|
||||||
|
"hands": "hands_on_own_chest, clothes_pull, adjusting_clothes",
|
||||||
|
"feet": "n/a",
|
||||||
|
"additional": "teasing, undressing"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/CleavageTeaseDwnsty-000008.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "pulling down own clothes, teasing",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"clothes_pull",
|
||||||
|
"shirt_pull",
|
||||||
|
"teasing",
|
||||||
|
"breasts_squeezed_together",
|
||||||
|
"areola_slip",
|
||||||
|
"undressing",
|
||||||
|
"leaning_forward",
|
||||||
|
"cleavage",
|
||||||
|
"hands_on_own_chest",
|
||||||
|
"collarbone",
|
||||||
|
"bare_shoulders",
|
||||||
|
"sexually_suggestive",
|
||||||
|
"blush",
|
||||||
|
"one_eye_closed"
|
||||||
|
]
|
||||||
|
}
|
||||||
30
data/actions/closeup_facial_illus.json
Normal file
30
data/actions/closeup_facial_illus.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"action": {
|
||||||
|
"base": "close-up, portrait",
|
||||||
|
"head": "facial, open_mouth, tongue, saliva, blush, looking_at_viewer, eyes_open",
|
||||||
|
"upper_body": "",
|
||||||
|
"lower_body": "",
|
||||||
|
"hands": "",
|
||||||
|
"feet": "",
|
||||||
|
"additional": "nsfw, semen, cum"
|
||||||
|
},
|
||||||
|
"action_id": "closeup_facial_illus",
|
||||||
|
"action_name": "Closeup Facial Illus",
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Closeup_Facial_iLLus.safetensors",
|
||||||
|
"lora_triggers": "Closeup Facial",
|
||||||
|
"lora_weight": 1,
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"facial",
|
||||||
|
"close-up",
|
||||||
|
"portrait",
|
||||||
|
"open_mouth",
|
||||||
|
"tongue",
|
||||||
|
"looking_at_viewer",
|
||||||
|
"saliva",
|
||||||
|
"blush"
|
||||||
|
]
|
||||||
|
}
|
||||||
28
data/actions/cof.json
Normal file
28
data/actions/cof.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cof",
|
||||||
|
"action_name": "Cum on Figure",
|
||||||
|
"action": {
|
||||||
|
"base": "figurine, mini-girl, cum on body, cum on figurine",
|
||||||
|
"head": "",
|
||||||
|
"upper_body": "",
|
||||||
|
"lower_body": "",
|
||||||
|
"hands": "",
|
||||||
|
"feet": "",
|
||||||
|
"additional": "cum,excessive cum"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "F"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cof.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cof",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"cum",
|
||||||
|
"figurine"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/cooperative_grinding.json
Normal file
32
data/actions/cooperative_grinding.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cooperative_grinding",
|
||||||
|
"action_name": "Cooperative Grinding",
|
||||||
|
"action": {
|
||||||
|
"base": "duo, standing, carrying, straddling, lift and carry, legs wrapped around waist, body to body",
|
||||||
|
"head": "head thrown back, blushing, heavy breathing, intense pleasure, eyes closed, half-closed eyes, rolled back eyes",
|
||||||
|
"upper_body": "arms around neck, holding buttocks, supporting thighs, strong grip, chest to chest, pressed together, close physical contact",
|
||||||
|
"lower_body": "hips touching, grinding, mating press, pelvic curtain, legs wrapped around, thighs spread, lifted legs",
|
||||||
|
"hands": "grabbing, squeezing, gripping back",
|
||||||
|
"feet": "dangling feet, arched toes",
|
||||||
|
"additional": "sweat, motion lines, intimate, erotic atmosphere"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "false",
|
||||||
|
"orientation": "MFF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cooperative_grinding.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cooperative_grinding",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"standing sex",
|
||||||
|
"carry",
|
||||||
|
"legs wrapped around",
|
||||||
|
"straddle",
|
||||||
|
"grinding",
|
||||||
|
"lift and carry"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/cooperativepaizuri.json
Normal file
32
data/actions/cooperativepaizuri.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cooperativepaizuri",
|
||||||
|
"action_name": "Cooperativepaizuri",
|
||||||
|
"action": {
|
||||||
|
"base": "cooperative_paizuri, 2girls, 1boy, sexual_activity",
|
||||||
|
"head": "smile, open_mouth, facial, looking_at_partner, half_closed_eyes",
|
||||||
|
"upper_body": "arms_around_neck, grabbing_penis, large_breasts, breasts_touching, nipples",
|
||||||
|
"lower_body": "penis, glans, erection, kneeling, straddling",
|
||||||
|
"hands": "on_penis, guiding_penis",
|
||||||
|
"feet": "barefoot",
|
||||||
|
"additional": "pov, cum_on_body, fluids"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cooperativepaizuri.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cooperative paizuri",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"cooperative_paizuri",
|
||||||
|
"2girls",
|
||||||
|
"1boy",
|
||||||
|
"paizuri",
|
||||||
|
"breasts",
|
||||||
|
"penis",
|
||||||
|
"facial",
|
||||||
|
"pov",
|
||||||
|
"from_side",
|
||||||
|
"large_breasts"
|
||||||
|
]
|
||||||
|
}
|
||||||
29
data/actions/covering_privates_illustrious_v1_0.json
Normal file
29
data/actions/covering_privates_illustrious_v1_0.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"action_id": "covering_privates_illustrious_v1_0",
|
||||||
|
"action_name": "Covering Privates Illustrious V1 0",
|
||||||
|
"action": {
|
||||||
|
"base": "covering_privates",
|
||||||
|
"head": "embarrassed, blush, looking_at_viewer",
|
||||||
|
"upper_body": "arm_across_chest, upper_body",
|
||||||
|
"lower_body": "hips, legs_together",
|
||||||
|
"hands": "covering_breasts, covering_crotch",
|
||||||
|
"feet": "standing",
|
||||||
|
"additional": "modesty"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/covering privates_illustrious_V1.0.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "covering privates, covering crotch, covering breasts",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"covering_privates",
|
||||||
|
"covering_breasts",
|
||||||
|
"covering_crotch",
|
||||||
|
"embarrassed",
|
||||||
|
"blush",
|
||||||
|
"arm_across_chest",
|
||||||
|
"legs_together"
|
||||||
|
]
|
||||||
|
}
|
||||||
23
data/actions/coveringownmouth_ill_v1.json
Normal file
23
data/actions/coveringownmouth_ill_v1.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"action_id": "coveringownmouth_ill_v1",
|
||||||
|
"action_name": "Coveringownmouth Ill V1",
|
||||||
|
"action": {
|
||||||
|
"base": "character covering their mouth with their hand",
|
||||||
|
"head": "lower face obscured by hand, neutral or expressive (depending on context)",
|
||||||
|
"upper_body": "arm raised towards face, upper body visible",
|
||||||
|
"lower_body": "variable, variable",
|
||||||
|
"hands": "hand placed over mouth, palm inward",
|
||||||
|
"feet": "variable",
|
||||||
|
"additional": "often indicates surprise, embarrassment, or silence"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/CoveringOwnMouth_Ill_V1.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "covering_own_mouth",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"covering_own_mouth"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cowgirl_position_breast_press_illustriousxl_lora_nochekaiser",
|
||||||
|
"action_name": "Cowgirl Position Breast Press Illustriousxl Lora Nochekaiser",
|
||||||
|
"action": {
|
||||||
|
"base": "straddling pose, body leaning forward directly into the camera view",
|
||||||
|
"head": "face close to the viewer, looking down or directly ahead, looking at viewer, intense or half-closed gaze",
|
||||||
|
"upper_body": "arms extending forward or bent to support weight, upper body leaning forward, breasts heavily pressed and flattened against the screen/viewer",
|
||||||
|
"lower_body": "hips wide, seated in a straddling motion, knees bent, thighs spread wide apart",
|
||||||
|
"hands": "placed on an invisible surface or partner's chest",
|
||||||
|
"feet": "tucked behind or out of frame",
|
||||||
|
"additional": "pov, squish, breast deformation, intimate distance"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "false",
|
||||||
|
"orientation": "MFF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/cowgirl-position-breast-press-illustriousxl-lora-nochekaiser.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "cowgirl-position-breast-press-illustriousxl-lora-nochekaiser",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"cowgirl position",
|
||||||
|
"breast press",
|
||||||
|
"straddling",
|
||||||
|
"pov",
|
||||||
|
"leaning forward",
|
||||||
|
"close-up",
|
||||||
|
"breast deformation",
|
||||||
|
"squish"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
data/actions/cuckold_ntr_il_nai_py.json
Normal file
32
data/actions/cuckold_ntr_il_nai_py.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"action_id": "cuckold_ntr_il_nai_py",
|
||||||
|
"action_name": "Cuckold Ntr Il Nai Py",
|
||||||
|
"action": {
|
||||||
|
"base": "from behind, bent over, doggy style, looking back, pov",
|
||||||
|
"head": "turned to look back over shoulder, face flushed, heavy breathing, expression of pleasure or distress, looking at viewer, tears, heart-shaped pupils or rolled back",
|
||||||
|
"upper_body": "supporting body weight on surface, arched back, leaning forward",
|
||||||
|
"lower_body": "hips raised high, exposed, kneeling, spread wide",
|
||||||
|
"hands": "gripping sheets or surface tightly",
|
||||||
|
"feet": "toes curled",
|
||||||
|
"additional": "sweat, rude, messy hair, partner silhouette implied behind"
|
||||||
|
},
|
||||||
|
"participants": {
|
||||||
|
"solo_focus": "true",
|
||||||
|
"orientation": "MF"
|
||||||
|
},
|
||||||
|
"lora": {
|
||||||
|
"lora_name": "Illustrious/Poses/Cuckold NTR-IL_NAI_PY.safetensors",
|
||||||
|
"lora_weight": 1.0,
|
||||||
|
"lora_triggers": "Cuckold NTR-IL_NAI_PY",
|
||||||
|
"lora_weight_min": 1.0,
|
||||||
|
"lora_weight_max": 1.0
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"ntr",
|
||||||
|
"cuckold",
|
||||||
|
"pov",
|
||||||
|
"from behind",
|
||||||
|
"doggy style",
|
||||||
|
"looking back"
|
||||||
|
]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user