Compare commits
22 Commits
bb65486995
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed9a7b4b11 | ||
|
|
32a73b02f5 | ||
|
|
7d79e626a5 | ||
|
|
d756ea1d0e | ||
|
|
79bbf669e2 | ||
|
|
5e4348ebc1 | ||
|
|
1b8a798c31 | ||
|
|
d95b81dde5 | ||
|
|
ec08eb5d31 | ||
|
|
2c1c3a7ed7 | ||
|
|
ee36caccd6 | ||
|
|
e226548471 | ||
|
|
b9196ef5f5 | ||
|
|
a38915b354 | ||
|
|
da55b0889b | ||
|
|
9b143e65b1 | ||
|
|
27d2a70867 | ||
|
|
3c828a170f | ||
|
|
ae7ba961c1 | ||
|
|
0b8802deb5 | ||
| 0d7d4d404f | |||
|
|
615c400024 |
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
|
||||
*.log
|
||||
|
||||
# Tools (cloned at runtime — not tracked in this repo)
|
||||
tools/
|
||||
|
||||
219
API_GUIDE.md
Normal file
219
API_GUIDE.md
Normal file
@@ -0,0 +1,219 @@
|
||||
# GAZE REST API Guide
|
||||
|
||||
## Setup
|
||||
|
||||
1. Open **Settings** in the GAZE web UI
|
||||
2. Scroll to **REST API Key** and click **Regenerate**
|
||||
3. Copy the key — you'll need it for all API requests
|
||||
|
||||
## Authentication
|
||||
|
||||
Every request must include your API key via one of:
|
||||
|
||||
- **Header (recommended):** `X-API-Key: <your-key>`
|
||||
- **Query parameter:** `?api_key=<your-key>`
|
||||
|
||||
Responses for auth failures:
|
||||
|
||||
| Status | Meaning |
|
||||
|--------|---------|
|
||||
| `401` | Missing API key |
|
||||
| `403` | Invalid API key |
|
||||
|
||||
## Endpoints
|
||||
|
||||
### List Presets
|
||||
|
||||
```
|
||||
GET /api/v1/presets
|
||||
```
|
||||
|
||||
Returns all available presets.
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"presets": [
|
||||
{
|
||||
"preset_id": "example_01",
|
||||
"slug": "example_01",
|
||||
"name": "Example Preset",
|
||||
"has_cover": true
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Generate Image
|
||||
|
||||
```
|
||||
POST /api/v1/generate/<preset_slug>
|
||||
```
|
||||
|
||||
Queue one or more image generations using a preset's configuration. All body parameters are optional — when omitted, the preset's own settings are used.
|
||||
|
||||
**Request body (JSON):**
|
||||
|
||||
| Field | Type | Default | Description |
|
||||
|-------|------|---------|-------------|
|
||||
| `count` | int | `1` | Number of images to generate (1–20) |
|
||||
| `checkpoint` | string | — | Override checkpoint path (e.g. `"Illustrious/model.safetensors"`) |
|
||||
| `extra_positive` | string | `""` | Additional positive prompt tags appended to the generated prompt |
|
||||
| `extra_negative` | string | `""` | Additional negative prompt tags |
|
||||
| `seed` | int | random | Fixed seed for reproducible generation |
|
||||
| `width` | int | — | Output width in pixels (must provide both width and height) |
|
||||
| `height` | int | — | Output height in pixels (must provide both width and height) |
|
||||
|
||||
**Response (202):**
|
||||
|
||||
```json
|
||||
{
|
||||
"jobs": [
|
||||
{ "job_id": "783f0268-ba85-4426-8ca2-6393c844c887", "status": "queued" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
|
||||
| Status | Cause |
|
||||
|--------|-------|
|
||||
| `400` | Invalid parameters (bad count, seed, or mismatched width/height) |
|
||||
| `404` | Preset slug not found |
|
||||
| `500` | Internal generation error |
|
||||
|
||||
### Check Job Status
|
||||
|
||||
```
|
||||
GET /api/v1/job/<job_id>
|
||||
```
|
||||
|
||||
Poll this endpoint to track generation progress.
|
||||
|
||||
**Response:**
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "783f0268-ba85-4426-8ca2-6393c844c887",
|
||||
"label": "Preset: Example Preset – preview",
|
||||
"status": "done",
|
||||
"error": null,
|
||||
"result": {
|
||||
"image_url": "/static/uploads/presets/example_01/gen_1773601346.png",
|
||||
"relative_path": "presets/example_01/gen_1773601346.png",
|
||||
"seed": 927640517599332
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Job statuses:**
|
||||
|
||||
| Status | Meaning |
|
||||
|--------|---------|
|
||||
| `pending` | Waiting in queue |
|
||||
| `processing` | Currently generating |
|
||||
| `done` | Complete — `result` contains image info |
|
||||
| `failed` | Error occurred — check `error` field |
|
||||
|
||||
The `result` object is only present when status is `done`. Use `seed` from the result to reproduce the exact same image later.
|
||||
|
||||
**Retrieving the image:** The `image_url` is a path relative to the server root. Fetch it directly:
|
||||
|
||||
```
|
||||
GET http://<host>:5782/static/uploads/presets/example_01/gen_1773601346.png
|
||||
```
|
||||
|
||||
Image retrieval does not require authentication.
|
||||
|
||||
## Examples
|
||||
|
||||
### Generate a single image and wait for it
|
||||
|
||||
```bash
|
||||
API_KEY="your-key-here"
|
||||
HOST="http://localhost:5782"
|
||||
|
||||
# Queue generation
|
||||
JOB_ID=$(curl -s -X POST \
|
||||
-H "X-API-Key: $API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{}' \
|
||||
"$HOST/api/v1/generate/example_01" | python3 -c "import sys,json; print(json.load(sys.stdin)['jobs'][0]['job_id'])")
|
||||
|
||||
echo "Job: $JOB_ID"
|
||||
|
||||
# Poll until done
|
||||
while true; do
|
||||
RESULT=$(curl -s -H "X-API-Key: $API_KEY" "$HOST/api/v1/job/$JOB_ID")
|
||||
STATUS=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['status'])")
|
||||
echo "Status: $STATUS"
|
||||
if [ "$STATUS" = "done" ] || [ "$STATUS" = "failed" ]; then
|
||||
echo "$RESULT" | python3 -m json.tool
|
||||
break
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
```
|
||||
|
||||
### Generate 3 images with extra prompts
|
||||
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "X-API-Key: $API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"count": 3,
|
||||
"extra_positive": "smiling, outdoors",
|
||||
"extra_negative": "blurry"
|
||||
}' \
|
||||
"$HOST/api/v1/generate/example_01"
|
||||
```
|
||||
|
||||
### Reproduce a specific image
|
||||
|
||||
```bash
|
||||
curl -X POST \
|
||||
-H "X-API-Key: $API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"seed": 927640517599332}' \
|
||||
"$HOST/api/v1/generate/example_01"
|
||||
```
|
||||
|
||||
### Python example
|
||||
|
||||
```python
|
||||
import requests
|
||||
import time
|
||||
|
||||
HOST = "http://localhost:5782"
|
||||
API_KEY = "your-key-here"
|
||||
HEADERS = {"X-API-Key": API_KEY, "Content-Type": "application/json"}
|
||||
|
||||
# List presets
|
||||
presets = requests.get(f"{HOST}/api/v1/presets", headers=HEADERS).json()
|
||||
print(f"Available presets: {[p['name'] for p in presets['presets']]}")
|
||||
|
||||
# Generate
|
||||
resp = requests.post(
|
||||
f"{HOST}/api/v1/generate/{presets['presets'][0]['slug']}",
|
||||
headers=HEADERS,
|
||||
json={"count": 1},
|
||||
).json()
|
||||
|
||||
job_id = resp["jobs"][0]["job_id"]
|
||||
print(f"Queued job: {job_id}")
|
||||
|
||||
# Poll
|
||||
while True:
|
||||
status = requests.get(f"{HOST}/api/v1/job/{job_id}", headers=HEADERS).json()
|
||||
print(f"Status: {status['status']}")
|
||||
if status["status"] in ("done", "failed"):
|
||||
break
|
||||
time.sleep(5)
|
||||
|
||||
if status["status"] == "done":
|
||||
image_url = f"{HOST}{status['result']['image_url']}"
|
||||
print(f"Image: {image_url}")
|
||||
print(f"Seed: {status['result']['seed']}")
|
||||
```
|
||||
598
CLAUDE.md
Normal file
598
CLAUDE.md
Normal file
@@ -0,0 +1,598 @@
|
||||
# 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
|
||||
generation.py # Shared generation logic (generate_from_preset)
|
||||
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
|
||||
api.py # REST API v1 (preset generation, auth)
|
||||
regenerate.py # Tag regeneration (single + bulk, via LLM queue)
|
||||
search.py # Global search across resources and gallery images
|
||||
```
|
||||
|
||||
### 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
|
||||
│ └── generation.py ← prompts, workflow, job_queue, sync, models
|
||||
└── 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`
|
||||
|
||||
The `Settings` model stores LLM provider config, LoRA/checkpoint directory paths, default checkpoint, and `api_key` for REST API authentication.
|
||||
|
||||
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/`
|
||||
- `is_favourite` — boolean (DB-only, not in JSON; toggled from detail pages)
|
||||
- `is_nsfw` — boolean (mirrored in both DB column and JSON `tags.nsfw`; synced on rescan)
|
||||
|
||||
### 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
|
||||
|
||||
Two independent queues with separate worker threads:
|
||||
|
||||
- **ComfyUI queue** (`_job_queue` + `_queue_worker`): Image generation jobs.
|
||||
- **`_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.
|
||||
- **LLM queue** (`_llm_queue` + `_llm_queue_worker`): LLM task jobs (tag regeneration, bulk create with overwrite).
|
||||
- **`_enqueue_task(label, task_fn)`** — Adds an LLM task job. `task_fn` receives the job dict and runs inside `app.app_context()`.
|
||||
- **Shared**: Both queues share `_job_history` (for status lookup by job ID) and `_job_queue_lock`.
|
||||
- **`_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 both worker threads.
|
||||
|
||||
### `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. Safe to call from background threads (uses `has_request_context()` fallback for OpenRouter HTTP-Referer header).
|
||||
- **`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.
|
||||
- **`_sync_nsfw_from_tags(entity, data)`** — Reads `data['tags']['nsfw']` and sets `entity.is_nsfw`. Called in every sync function on both create and update paths.
|
||||
- **`_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/generation.py` — Shared Generation Logic
|
||||
|
||||
- **`generate_from_preset(preset, overrides=None)`** — Core preset generation function used by both the web route and the REST API. Resolves entities, builds prompts, wires the workflow, and enqueues the job. The `overrides` dict accepts: `action`, `checkpoint`, `extra_positive`, `extra_negative`, `seed`, `width`, `height`. Has no `request` or `session` dependencies.
|
||||
|
||||
### `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()`, `_write_sidecar()` — gallery image sidecar JSON I/O
|
||||
- `routes/regenerate.py`: Tag regeneration routes (single + category bulk + all), tag migration
|
||||
- `routes/search.py`: `_search_resources()`, `_search_images()` — global search across resources and gallery
|
||||
|
||||
---
|
||||
|
||||
## 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": { "origin_series": "Final Fantasy VII", "origin_type": "game", "nsfw": false },
|
||||
"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": { "outfit_type": "Uniform", "nsfw": false }
|
||||
}
|
||||
```
|
||||
|
||||
### 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": { "participants": "1girl", "nsfw": false }
|
||||
}
|
||||
```
|
||||
|
||||
### 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": { "scene_type": "Outdoor", "nsfw": false }
|
||||
}
|
||||
```
|
||||
|
||||
### 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": "" },
|
||||
"tags": { "style_type": "Watercolor", "nsfw": false }
|
||||
}
|
||||
```
|
||||
|
||||
### 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": "" },
|
||||
"tags": { "associated_resource": "skin", "adetailer_targets": ["face", "hands"], "nsfw": false }
|
||||
}
|
||||
```
|
||||
|
||||
### 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": { "origin_series": "Final Fantasy VII", "origin_type": "game", "nsfw": false }
|
||||
}
|
||||
```
|
||||
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>/` — library with favourite/NSFW filter controls
|
||||
- `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>/favourite` — toggle `is_favourite` (AJAX)
|
||||
- `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`
|
||||
|
||||
### REST API (`/api/v1/`)
|
||||
Authenticated via `X-API-Key` header (or `api_key` query param). Key is stored in `Settings.api_key` and managed from the Settings page.
|
||||
- `GET /api/v1/presets` — list all presets (id, slug, name, has_cover)
|
||||
- `POST /api/v1/generate/<preset_slug>` — queue generation from a preset; accepts JSON body with optional `checkpoint`, `extra_positive`, `extra_negative`, `seed`, `width`, `height`, `count` (1–20); returns `{"jobs": [{"job_id": ..., "status": "queued"}]}`
|
||||
- `GET /api/v1/job/<job_id>` — poll job status; returns `{"id", "label", "status", "error", "result"}`
|
||||
- `POST /api/key/regenerate` — generate a new API key (Settings page)
|
||||
|
||||
See `API_GUIDE.md` for full usage examples.
|
||||
|
||||
### 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.
|
||||
|
||||
### Search
|
||||
- `GET /search` — global search page; query params: `q` (search term), `category` (all/characters/outfits/etc.), `nsfw` (all/sfw/nsfw), `type` (all/resources/images)
|
||||
|
||||
### Tag Regeneration
|
||||
- `POST /api/<category>/<slug>/regenerate_tags` — single entity tag regeneration via LLM queue
|
||||
- `POST /admin/bulk_regenerate_tags/<category>` — queue LLM tag regeneration for all entities in a category
|
||||
- `POST /admin/bulk_regenerate_tags` — queue LLM tag regeneration for all resources across all categories
|
||||
- `POST /admin/migrate_tags` — convert old list-format tags to new dict format
|
||||
|
||||
### Gallery Image Metadata
|
||||
- `POST /gallery/image/favourite` — toggle favourite on a gallery image (writes sidecar JSON)
|
||||
- `POST /gallery/image/nsfw` — toggle NSFW on a gallery image (writes sidecar JSON)
|
||||
|
||||
### 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. The `random_gen_image(category, slug)` template global returns a random image path from `static/uploads/<category>/<slug>/` for use as a fallback cover when `image_path` is not set.
|
||||
- **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
|
||||
- **Fallback covers** (library pages): When a resource has no assigned `image_path` but has generated images in its upload folder, a random image is shown at 50% opacity (CSS class `fallback-cover`). The image changes on each page load. Resources with no generations show "No Image".
|
||||
|
||||
---
|
||||
|
||||
## 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`
|
||||
- `preset_system.txt` — preset JSON schema
|
||||
- `regenerate_tags_system.txt` — tag regeneration schema (all per-category tag structures)
|
||||
|
||||
Used by: character/outfit/action/scene/style create forms, bulk_create routes, and tag regeneration. All system prompts include NSFW awareness preamble.
|
||||
|
||||
### 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.
|
||||
|
||||
---
|
||||
|
||||
## Tagging System
|
||||
|
||||
Tags are **semantic metadata** for organizing and filtering resources. They are **not injected into generation prompts** — tags are purely for the UI (search, filtering, categorization).
|
||||
|
||||
### Tag Schema Per Category
|
||||
|
||||
| Category | Tag fields | Example |
|
||||
|----------|-----------|---------|
|
||||
| Character | `origin_series`, `origin_type`, `nsfw` | `{"origin_series": "Final Fantasy VII", "origin_type": "game", "nsfw": false}` |
|
||||
| Look | `origin_series`, `origin_type`, `nsfw` | same as Character |
|
||||
| Outfit | `outfit_type`, `nsfw` | `{"outfit_type": "Uniform", "nsfw": false}` |
|
||||
| Action | `participants`, `nsfw` | `{"participants": "1girl, 1boy", "nsfw": true}` |
|
||||
| Style | `style_type`, `nsfw` | `{"style_type": "Anime", "nsfw": false}` |
|
||||
| Scene | `scene_type`, `nsfw` | `{"scene_type": "Indoor", "nsfw": false}` |
|
||||
| Detailer | `associated_resource`, `adetailer_targets`, `nsfw` | `{"associated_resource": "skin", "adetailer_targets": ["face", "hands"], "nsfw": false}` |
|
||||
| Checkpoint | `art_style`, `base_model`, `nsfw` | `{"art_style": "anime", "base_model": "Illustrious", "nsfw": false}` |
|
||||
|
||||
### Favourite / NSFW Columns
|
||||
|
||||
- `is_favourite` — DB-only boolean. Toggled via `POST /<category>/<slug>/favourite`. Not stored in JSON (user preference, not asset metadata).
|
||||
- `is_nsfw` — DB column **and** `tags.nsfw` in JSON. Synced from JSON on rescan via `_sync_nsfw_from_tags()`. Editable from edit pages.
|
||||
|
||||
### Library Filtering
|
||||
|
||||
All library index pages support query params:
|
||||
- `?favourite=on` — show only favourites
|
||||
- `?nsfw=sfw|nsfw|all` — filter by NSFW status
|
||||
- Results are ordered by `is_favourite DESC, name ASC` (favourites sort first).
|
||||
|
||||
### Gallery Image Sidecar Files
|
||||
|
||||
Gallery images can have per-image favourite/NSFW metadata stored in sidecar JSON files at `{image_path}.json` (e.g. `static/uploads/characters/tifa/gen_123.png.json`). Sidecar schema: `{"is_favourite": bool, "is_nsfw": bool}`.
|
||||
|
||||
---
|
||||
|
||||
## 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. In generate routes, the detailer prompt is injected directly into `prompts['main']` after `build_prompt()` returns (not via tags or `build_prompt` itself).
|
||||
- **`_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"`.
|
||||
- **LLM queue runs without request context**: `_enqueue_task()` callbacks execute in a background thread with only `app.app_context()`. Do not access `flask.request`, `flask.session`, or other request-scoped objects inside `task_fn`. Use `has_request_context()` guard if code is shared between HTTP handlers and background tasks.
|
||||
- **Tags are metadata only**: Tags (`data['tags']`) are never injected into generation prompts. They are purely for UI filtering and search. The old pattern of `parts.extend(data.get('tags', []))` in prompt building has been removed.
|
||||
@@ -1,51 +0,0 @@
|
||||
# Feature Development Guide: Gallery Pages & Character Integration
|
||||
|
||||
This guide outlines the architectural patterns and best practices developed during the implementation of the **Actions**, **Outfits**, and **Styles** galleries. Use this as a blueprint for adding similar features (e.g., "Scenes", "Props", "Effects").
|
||||
|
||||
## 1. Data Model & Persistence
|
||||
- **Database Model:** Add a new class in `models.py`. Include `default_fields` (JSON) to support persistent prompt selections.
|
||||
- **JSON Sync:** Implement a `sync_[feature]()` function in `app.py` to keep the SQLite database in sync with the `data/[feature]/*.json` files.
|
||||
- **Slugs:** Use URL-safe slugs generated from the ID for clean routing.
|
||||
|
||||
## 2. Quadruple LoRA Chaining
|
||||
Our workflow supports chaining up to four distinct LoRAs from specific directories:
|
||||
1. **Character:** `Illustrious/Looks/` (Node 16)
|
||||
2. **Outfit:** `Illustrious/Clothing/` (Node 17)
|
||||
3. **Action:** `Illustrious/Poses/` (Node 18)
|
||||
4. **Style:** `Illustrious/Styles/` (Node 19)
|
||||
|
||||
**Implementation Detail:**
|
||||
In `_prepare_workflow`, LoRAs must be chained sequentially. If a previous LoRA is missing, the next one must "reach back" to the Checkpoint (Node 4) or the last valid node in the chain to maintain the model/CLIP connection. Node 19 is the terminal LoRA loader before terminal consumers (KSampler, Detailers).
|
||||
|
||||
## 3. Style Prompt Construction
|
||||
Artistic styles follow specific formatting rules in the `build_prompt` engine:
|
||||
- **Artist Attribution:** Artist names are prefixed with "by " (e.g., "by Sabu").
|
||||
- **Artistic Styles:** Raw descriptive style tags (e.g., "watercolor painting") are appended to the prompt.
|
||||
- **Priority:** Style tags are applied after identity and wardrobe tags but before trigger words.
|
||||
|
||||
## 4. Adetailer Routing
|
||||
To improve generation quality, route specific JSON sub-fields to targeted Adetailers:
|
||||
- **Face Detailer (Node 14):** Receives `character_name`, `expression`, and action-specific `head`/`eyes` tags.
|
||||
- **Hand Detailer (Node 15):** Receives priority hand tags (Wardrobe Gloves > Wardrobe Hands > Identity Hands) and action-specific `arms`/`hands` tags.
|
||||
|
||||
## 5. Character-Integrated Previews
|
||||
The "Killer Feature" is previewing a standalone item (like an Action, Outfit, or Style) on a specific character.
|
||||
|
||||
**Logic Flow:**
|
||||
1. **Merge Data:** Copy `character.data`.
|
||||
2. **Override/Merge:** Replace character `defaults` with feature-specific tags (e.g., Action pose overrides Character pose).
|
||||
3. **Context Injection:** Append character-specific styles (e.g., `[primary_color] simple background`) to the main prompt.
|
||||
4. **Auto-Selection:** When a character is selected, ensure their essential identity and active wardrobe fields are automatically included in the prompt.
|
||||
|
||||
## 6. UI/UX Patterns
|
||||
- **Selection Boxes:** Use checkboxes next to field labels to allow users to toggle specific tags.
|
||||
- **Default Selection:** Implement a "Save as Default Selection" button that persists the current checkbox state to the database.
|
||||
- **Session State:** Store the last selected character and field preferences in the Flask `session` to provide a seamless experience.
|
||||
- **AJAX Generation:** Use the WebSocket + Polling hybrid pattern in the frontend to show real-time progress bars without page reloads.
|
||||
|
||||
## 7. Directory Isolation
|
||||
Always isolate LoRAs by purpose to prevent dropdown clutter:
|
||||
- `get_available_loras()` -> Characters
|
||||
- `get_available_clothing_loras()` -> Outfits
|
||||
- `get_available_action_loras()` -> Actions/Poses
|
||||
- `get_available_style_loras()` -> Styles
|
||||
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"]
|
||||
37
README.md
37
README.md
@@ -7,17 +7,23 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
||||
- **Character Gallery**: Automatically scans your `characters/` folder and builds a searchable, sortable database.
|
||||
- **Outfit Gallery**: Manage reusable outfit presets that can be applied to any character.
|
||||
- **Actions Gallery**: A library of reusable poses and actions (e.g., "Belly Dancing", "Sword Fighting") that can be previewed on any character model.
|
||||
- **AI-Powered Creation**: Create new characters, outfits, and actions using AI to generate profiles from descriptions, or manually create blank templates.
|
||||
- **character-Integrated Previews**: Standalone items (Outfits/Actions) can be previewed directly on a specific character's model with automatic style injection (e.g., background color matching).
|
||||
- **Styles Gallery**: Manage art style / artist LoRA presets with AI-assisted bulk creation from your styles LoRA folder.
|
||||
- **Scenes Gallery**: Background and environment LoRA presets, previewable with any character.
|
||||
- **Detailers Gallery**: Detail enhancement LoRA presets for fine-tuning face, hands, and other features.
|
||||
- **Checkpoints Gallery**: Browse all your installed SDXL checkpoints (Illustrious & Noob families). Stores per-checkpoint generation settings (steps, CFG, sampler, VAE, base prompts) via JSON files in `data/checkpoints/`. Supports AI-assisted metadata generation from accompanying HTML files.
|
||||
- **AI-Powered Creation**: Create and populate gallery entries using AI to generate profiles from descriptions or LoRA HTML files, or manually create blank templates.
|
||||
- **Character-Integrated Previews**: Standalone items (Outfits/Actions/Styles/Scenes/Detailers/Checkpoints) can be previewed directly on a specific character's model.
|
||||
- **Granular Prompt Control**: Every field in your JSON models (Identity, Wardrobe, Styles, Action details) has a checkbox. You decide exactly what is sent to the AI.
|
||||
- **ComfyUI Integration**:
|
||||
- **SDXL Optimized**: Designed for high-quality SDXL/Illustrious workflows.
|
||||
- **Localized ADetailer**: Automated Face and Hand detailing with focused prompts (e.g., only eye color and expression are sent to the face detailer).
|
||||
- **Triple LoRA Chaining**: Chains up to three distinct LoRAs (Character + Outfit + Action) sequentially in the generation workflow.
|
||||
- **Quad LoRA Chaining**: Chains up to four distinct LoRAs (Character + Outfit + Action + Style/Detailer/Scene) sequentially in the generation workflow.
|
||||
- **Per-Checkpoint Settings**: Steps, CFG, sampler name, VAE, and base prompts are applied automatically from each checkpoint's JSON profile.
|
||||
- **Real-time Progress**: Live progress bars and queue status via WebSockets (with a reliable polling fallback).
|
||||
- **Batch Processing**:
|
||||
- **Fill Missing**: Generate covers for every character missing one with a single click.
|
||||
- **Advanced Generator**: A dedicated page to mix-and-match characters with different checkpoints (Illustrious/Noob support) and custom prompt additions.
|
||||
- **Fill Missing**: Generate covers for every item missing one with a single click, across all galleries.
|
||||
- **Bulk Create from LoRAs/Checkpoints**: Auto-generate JSON metadata for entire directories using an LLM.
|
||||
- **Advanced Generator**: A dedicated mix-and-match page combining any character, outfit, action, style, scene, and detailer in a single generation.
|
||||
- **Smart URLs**: Sanitized, human-readable URLs (slugs) that handle special characters and slashes gracefully.
|
||||
|
||||
## Prerequisites
|
||||
@@ -33,6 +39,20 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
||||
|
||||
## 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.
|
||||
2. **Configure Paths**: Open `app.py` and update the following variables to match your system:
|
||||
```python
|
||||
@@ -70,8 +90,13 @@ A local web-based GUI for managing character profiles (JSON) and generating cons
|
||||
- `/data/characters`: Character JSON files.
|
||||
- `/data/clothing`: Outfit preset JSON files.
|
||||
- `/data/actions`: Action/Pose preset JSON files.
|
||||
- `/data/styles`: Art style / artist LoRA JSON files.
|
||||
- `/data/scenes`: Scene/background LoRA JSON files.
|
||||
- `/data/detailers`: Detailer LoRA JSON files.
|
||||
- `/data/checkpoints`: Per-checkpoint metadata JSON files (steps, CFG, sampler, VAE, base prompts).
|
||||
- `/data/prompts`: LLM system prompts used by the AI-assisted bulk creation features.
|
||||
- `/static/uploads`: Generated images (organized by subfolders).
|
||||
- `app.py`: Flask backend and prompt-building logic.
|
||||
- `comfy_workflow.json`: The API-format workflow used for generations.
|
||||
- `models.py`: SQLAlchemy database models.
|
||||
- `DEVELOPMENT_GUIDE.md`: Architectual patterns for extending the browser.
|
||||
- `DEVELOPMENT_GUIDE.md`: Architectural patterns for extending the browser.
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
},
|
||||
"4": {
|
||||
"inputs": {
|
||||
"ckpt_name": "Noob/oneObsession_v19Atypical.safetensors"
|
||||
"ckpt_name": ""
|
||||
},
|
||||
"class_type": "CheckpointLoaderSimple"
|
||||
},
|
||||
@@ -199,5 +199,15 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
24
data/actions/3p_sex_000037.json
Normal file
24
data/actions/3p_sex_000037.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "3p_sex_000037",
|
||||
"action_name": "3P Sex 000037",
|
||||
"action": {
|
||||
"base": "threesome, group_sex, 3_people",
|
||||
"head": "blush, half-closed_eyes, sweat",
|
||||
"upper_body": "nude, reaching",
|
||||
"lower_body": "sex, spread_legs, intercourse",
|
||||
"hands": "groping",
|
||||
"feet": "toes_curled",
|
||||
"additional": "panting, orgasm, 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": {
|
||||
"participants": "threesome",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/4p_sex.json
Normal file
24
data/actions/4p_sex.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "4p_sex",
|
||||
"action_name": "4P Sex",
|
||||
"action": {
|
||||
"base": "group_sex, foursome, 4p, multiple_partners, sexual_act",
|
||||
"head": "moaning, open_mouth, closed_eyes, ahegao, heart_eyes, heavy_breathing, flushed_face, sweat",
|
||||
"upper_body": "nude, arching_back, standing_on_all_fours, breasts_press, breast_grab, fingers_in_mouth",
|
||||
"lower_body": "vaginal_intercourse, anal_intercourse, double_penetration, legs_apart, kneeing, missionary_position",
|
||||
"hands": "breast_fondling, clutching_sheets, on_partner, touching_self",
|
||||
"feet": "toes_curled, barefoot",
|
||||
"additional": "bodily_fluids, semen, sweat, messy, erotic, intimate"
|
||||
},
|
||||
"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": {
|
||||
"participants": "4people",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"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, oral_sex",
|
||||
"head": "looking_up, mouth_open, intense_expression, half-closed_eyes",
|
||||
"upper_body": "forward_bend, reaching_forward",
|
||||
"lower_body": "kneeling, legs_spread",
|
||||
"hands": "grabbing_partner, hand_on_thigh",
|
||||
"feet": "barefoot",
|
||||
"additional": "afterimage, motion_blur, multiple_tongues, speed_lines, saliva_drool"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "actually_reliable_penis_kissing_3_variants_illustrious",
|
||||
"action_name": "Actually Reliable Penis Kissing 3 Variants Illustrious",
|
||||
"action": {
|
||||
"base": "kneeling, fellatio, oral sex, kissing penis",
|
||||
"head": "eyes closed, half-closed eyes, looking up, kissing, tongue",
|
||||
"upper_body": "arched back, leaning forward",
|
||||
"lower_body": "kneeling",
|
||||
"hands": "holding penis, hand on thigh",
|
||||
"feet": "",
|
||||
"additional": "saliva, slime, connection"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "after_sex_fellatio_illustriousxl_lora_nochekaiser_r1",
|
||||
"action_name": "After Sex Fellatio Illustriousxl Lora Nochekaiser R1",
|
||||
"action": {
|
||||
"base": "1girl, 1boy, completely_nude, lying, on_back, spread_legs",
|
||||
"head": "looking_at_viewer, tongue, open_mouth, blush, disheveled_hair, half-closed_eyes",
|
||||
"upper_body": "on_bed, large_breasts, nipples, sweat",
|
||||
"lower_body": "pussy, cum_in_pussy, leaking_cum, knees_up, thighs_apart",
|
||||
"hands": "on_bed",
|
||||
"feet": "barefoot",
|
||||
"additional": "after_sex, fellatio, penis, cum, cum_drip, messy_body, sweat, 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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/afterfellatio_ill.json
Normal file
24
data/actions/afterfellatio_ill.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"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, messy_makeup",
|
||||
"upper_body": "arms_down, reaching_towards_viewer",
|
||||
"lower_body": "kneeling",
|
||||
"hands": "hands_on_penis",
|
||||
"feet": "barefoot",
|
||||
"additional": "cum, cum_string, cum_in_mouth, closed_mouth, stringy_cum"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/afteroral.json
Normal file
24
data/actions/afteroral.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "afteroral",
|
||||
"action_name": "Afteroral",
|
||||
"action": {
|
||||
"base": "after_fellatio, post-coital, flushed_face, messy_appearance",
|
||||
"head": "messy_hair, panting, heavy_breathing, half-closed_eyes, dazed, pupil_dilated, flushed, sweat",
|
||||
"upper_body": "smeared_lipstick, runny_makeup, saliva, saliva_trail, cum_on_face, cum_on_mouth, excessive_cum",
|
||||
"lower_body": "",
|
||||
"hands": "hands_near_face, curled_fingers",
|
||||
"feet": "",
|
||||
"additional": "after_fellatio, cum_drip, mess"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/afterpaizuri.json
Normal file
28
data/actions/afterpaizuri.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "afterpaizuri",
|
||||
"action_name": "Afterpaizuri",
|
||||
"action": {
|
||||
"base": "kneeling, sitting, exhausted, post-coital, afterpaizuri",
|
||||
"head": "flushed, messy_hair, panting, mouth_open, tongue_out, half-closed_eyes, dazed, looking_at_viewer",
|
||||
"upper_body": "bare_shoulders, cleavage, semen_on_breasts, disheveled_clothes, bra_removed_under_clothes",
|
||||
"lower_body": "kneeling, thighs_together, buttocks_on_heels",
|
||||
"hands": "hands_on_lap",
|
||||
"feet": "barefoot",
|
||||
"additional": "semen_on_face, heavy_breathing, sweat, moisture, viscous_liquid, creamy_fluid"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/aftersexbreakv2.json
Normal file
24
data/actions/aftersexbreakv2.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"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, rolling_eyes, half-closed_eyes, ahegao",
|
||||
"upper_body": "arms_spread, arms_above_head, sweat, naked, 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_on_bed, sweat_bead"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/against_glass_bs.json
Normal file
28
data/actions/against_glass_bs.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "against_glass_bs",
|
||||
"action_name": "Against Glass Bs",
|
||||
"action": {
|
||||
"base": "against_glass, leaning_forward, pressed_against_surface, glass_surface",
|
||||
"head": "face_pressed, cheek_press, breath_on_glass, looking_at_viewer, intimate_gaze",
|
||||
"upper_body": "chest_pressed_against_glass, leaning_into_glass",
|
||||
"lower_body": "hips_pushed_forward, standing",
|
||||
"hands": "hands_on_glass, palms_on_glass, fingers_spread",
|
||||
"feet": "standing",
|
||||
"additional": "condensation, translucent_surface, distortion"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/amateur_pov_filming.json
Normal file
24
data/actions/amateur_pov_filming.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "amateur_pov_filming",
|
||||
"action_name": "Amateur Pov Filming",
|
||||
"action": {
|
||||
"base": "pov, selfie, solo, indoors, recording, smartphone, holding_phone",
|
||||
"head": "looking_at_viewer, blush, open_mouth",
|
||||
"upper_body": "upper_body, breasts, nipples",
|
||||
"lower_body": "hips",
|
||||
"hands": "holding_phone, holding_id_card",
|
||||
"feet": "barefoot",
|
||||
"additional": "mirror_selfie, 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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/arch_back_sex_v1_1_illustriousxl.json
Normal file
24
data/actions/arch_back_sex_v1_1_illustriousxl.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"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_butt",
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/arm_grab_missionary_ill_10.json
Normal file
24
data/actions/arm_grab_missionary_ill_10.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "arm_grab_missionary_ill_10",
|
||||
"action_name": "Arm Grab Missionary Ill 10",
|
||||
"action": {
|
||||
"base": "missionary, lying, on_back, sex, vaginal_sex",
|
||||
"head": "blushing, open_mouth, one_eye_closed, looking_at_viewer, dilated_pupils",
|
||||
"upper_body": "arms_above_head, pinned, restrained, grabbed_wrists, breasts, nipples, medium_breasts",
|
||||
"lower_body": "legs_spread, lifted_pelvis, spread_legs, legs_up, knees_up",
|
||||
"hands": "interlocked_fingers, holding_hands",
|
||||
"feet": "barefoot",
|
||||
"additional": "faceless_male, sweat, motion_lines"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/ballsdeep_il_v2_2_s.json
Normal file
24
data/actions/ballsdeep_il_v2_2_s.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "ballsdeep_il_v2_2_s",
|
||||
"action_name": "Ballsdeep Il V2 2 S",
|
||||
"action": {
|
||||
"base": "sexual_intercourse, deep_penetration, thrusting, mating_press, from_behind, doggy_style, missionary, cowgirl_position",
|
||||
"head": "eyes_rolled_back, closed_eyes, open_mouth, flushed_face, sweat, expressionless, intense_expression",
|
||||
"upper_body": "arched_back, hands_on_own_body, grabbing, fingers_clenched, sweating",
|
||||
"lower_body": "joined_genitals, spread_legs, wrap_legs, hips_thrusting, stomach_bulge, testicles_pressed",
|
||||
"hands": "finger_clutch, gripping",
|
||||
"feet": "curled_toes",
|
||||
"additional": "intense, deep_pen, skin_on_skin"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/bathingtogether.json
Normal file
24
data/actions/bathingtogether.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "bathingtogether",
|
||||
"action_name": "Bathingtogether",
|
||||
"action": {
|
||||
"base": "bathing, sitting, partially_submerged, bathtub",
|
||||
"head": "looking_at_viewer, eye_contact",
|
||||
"upper_body": "bare_shoulders, skin_to_skin, arms_around_each_other",
|
||||
"lower_body": "underwater, knees_up",
|
||||
"hands": "hands_on_body",
|
||||
"feet": "barefoot",
|
||||
"additional": "bubbles, water, steam, wet, wet_hair, mirror_reflection"
|
||||
},
|
||||
"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": {
|
||||
"participants": "2girls",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/before_after_1230829.json
Normal file
24
data/actions/before_after_1230829.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action": {
|
||||
"base": "2koma, side-by-side, comparison",
|
||||
"head": "facial, cum_on_face, messy_face, eyes_closed, mouth_open, orgasm",
|
||||
"upper_body": "semi-nude, messy, cum_on_breasts",
|
||||
"lower_body": "",
|
||||
"hands": "hands_on_head",
|
||||
"feet": "",
|
||||
"additional": "cum, close-up, ejaculation"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -2,24 +2,27 @@
|
||||
"action_id": "belly_dancing",
|
||||
"action_name": "Belly Dancing",
|
||||
"action": {
|
||||
"full_body": "belly dancing, standing",
|
||||
"base": "belly_dancing, dancing, standing",
|
||||
"head": "",
|
||||
"eyes": "",
|
||||
"arms": "hands above head",
|
||||
"hands": "palms together",
|
||||
"torso": "",
|
||||
"pelvis": "swaying hips",
|
||||
"legs": "",
|
||||
"upper_body": "arms_up",
|
||||
"lower_body": "swaying",
|
||||
"hands": "own_hands_together",
|
||||
"feet": "",
|
||||
"additional": ""
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "false",
|
||||
"orientation": "F"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": ""
|
||||
"lora_triggers": "",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": [
|
||||
"belly dancing",
|
||||
"dance"
|
||||
]
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/bentback.json
Normal file
24
data/actions/bentback.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "bentback",
|
||||
"action_name": "Bentback",
|
||||
"action": {
|
||||
"base": "bent_over, from_behind, arched_back",
|
||||
"head": "looking_back, looking_at_viewer",
|
||||
"upper_body": "twisted_torso, arms_at_sides",
|
||||
"lower_body": "ass_focus, kneepits, spread_legs",
|
||||
"hands": "hands_on_legs",
|
||||
"feet": "barefoot",
|
||||
"additional": "leaning_forward"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/blowjobcomicpart2.json
Normal file
24
data/actions/blowjobcomicpart2.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "blowjobcomicpart2",
|
||||
"action_name": "Blowjobcomicpart2",
|
||||
"action": {
|
||||
"base": "3koma, comic_strip, sequence, vertical_strip",
|
||||
"head": "tongue_out, open_mouth, saliva, empty_eyes, rolled_eyes",
|
||||
"upper_body": "arms_at_sides, torso, standing_on_knees",
|
||||
"lower_body": "sexual_activity, kneeling",
|
||||
"hands": "hands_on_penis, grasping",
|
||||
"feet": "out_of_frame",
|
||||
"additional": "fellatio, irrumatio, licking, ejaculation, cum_in_mouth, 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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/bodybengirl.json
Normal file
24
data/actions/bodybengirl.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "bodybengirl",
|
||||
"action_name": "Bodybengirl",
|
||||
"action": {
|
||||
"base": "suspended_congress, lifted_by_torso, torso_grab",
|
||||
"head": "",
|
||||
"upper_body": "arms_up, bent_over",
|
||||
"lower_body": "legs_up",
|
||||
"hands": "",
|
||||
"feet": "",
|
||||
"additional": "1boy, 1girl, 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": {
|
||||
"participants": "1boy 1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/bodybengirlpart2.json
Normal file
24
data/actions/bodybengirlpart2.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "bodybengirlpart2",
|
||||
"action_name": "Bodybengirlpart2",
|
||||
"action": {
|
||||
"base": "suspended, from_side, bent_over, torso_grab",
|
||||
"head": "embarrassed, sweating, scared, mouth_open, looking_away, downcast",
|
||||
"upper_body": "arms_at_sides, limp_arms",
|
||||
"lower_body": "legs_dangling, knees_together, bare_feet, feet_dangling",
|
||||
"hands": "open_hands, limp_hands",
|
||||
"feet": "bare_feet, 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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
28
data/actions/bored_retrain_000115_1336316.json
Normal file
28
data/actions/bored_retrain_000115_1336316.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "bored_retrain_000115_1336316",
|
||||
"action_name": "Bored Retrain 000115 1336316",
|
||||
"action": {
|
||||
"base": "bored, slouching, leaning_forward, ennui, uninterested",
|
||||
"head": "head_on_hand, blank_stare, half-lidded_eyes",
|
||||
"upper_body": "slumped, leaning_forward, sitting, arms_crossed",
|
||||
"lower_body": "sitting, legs_crossed",
|
||||
"hands": "hand_on_cheek, hand_on_chin",
|
||||
"feet": "",
|
||||
"additional": "sighing, waiting"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/breast_pressh.json
Normal file
24
data/actions/breast_pressh.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "breast_pressh",
|
||||
"action_name": "Breast Pressh",
|
||||
"action": {
|
||||
"base": "1boy, 2girls, sandwiched, standing, height_difference, size_difference",
|
||||
"head": "head_between_breasts, face_between_breasts, cheek_squash",
|
||||
"upper_body": "breast_press, hugging, arms_around_waist, chest_to_chest",
|
||||
"lower_body": "hips_touching, legs_apart",
|
||||
"hands": "hands_on_back",
|
||||
"feet": "barefoot",
|
||||
"additional": "hetero, multiple_girls"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1boy 2girls",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "breast_smother_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Breast Smother Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "breast_smother, face_in_cleavage, intimate, (POV:1.2), side_view",
|
||||
"head": "looking_down, half-closed_eyes, affectionate, dominant",
|
||||
"upper_body": "large_breasts, cleavage, squished_breasts, hugging, embracing, chest_press",
|
||||
"lower_body": "close_contact, standing",
|
||||
"hands": "cradling_head, fingers_in_hair, pressing_head_to_breasts",
|
||||
"feet": "barefoot, feet_on_ground",
|
||||
"additional": "skin_compression, soft_lighting, motorboating"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "breast_sucking_fingering_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Breast Sucking Fingering Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "duo, sex, sexual_intercourse, close-up, breast_sucking, fingering, intimate_embrace",
|
||||
"head": "face_buried_in_breasts, sucking_nipple, nipples_suck, saliva, eyes_closed, heavy_breathing, blush, expression_of_bliss",
|
||||
"upper_body": "reaching_down, holding_partner, arm_around_waist, large_breasts, exposed_breasts, nude_torso, pressing_bodies",
|
||||
"lower_body": "legs_spread, pussy_exposed, vaginal_fingering, m_legs, intertwined_legs",
|
||||
"hands": "fingering, fingers_inside, clitoris_rubbing, squeezing_breasts, groping",
|
||||
"feet": "toes_curled, relaxed_feet",
|
||||
"additional": "saliva_trail, sweat, sweat_drop, 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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/brokenglass_illusxl_incrs_v1.json
Normal file
28
data/actions/brokenglass_illusxl_incrs_v1.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "brokenglass_illusxl_incrs_v1",
|
||||
"action_name": "Brokenglass Illusxl Incrs V1",
|
||||
"action": {
|
||||
"base": "breaking_through_barrier, dynamic_pose, impact_frame, dynamic_angle",
|
||||
"head": "intense_expression, facial_focus, visible_through_glass",
|
||||
"upper_body": "reaching_towards_viewer, twisted_torso, arms_extended",
|
||||
"lower_body": "dynamic_pose, movement",
|
||||
"hands": "hands_up, touching_glass, debris_interaction",
|
||||
"feet": "grounded, dynamic",
|
||||
"additional": "broken_glass, glass_shards, shattered, spiderweb_cracks, cinematic_lighting, refraction, debris, explosive_impact"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
28
data/actions/butt_smother_ag_000043.json
Normal file
28
data/actions/butt_smother_ag_000043.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "butt_smother_ag_000043",
|
||||
"action_name": "Butt Smother Ag 000043",
|
||||
"action": {
|
||||
"base": "1girl, 1boy, facesitting, pov, first-person_view, dominant_woman, submissive_man",
|
||||
"head": "looking_down, looking_away, half-closed_eyes, seductive_expression, facial_expression",
|
||||
"upper_body": "arms_behind_back, arched_back, upper_body_lean",
|
||||
"lower_body": "buttocks, ass_focus, heavy_buttocks, spread_legs, kneeling, thighs_straddling",
|
||||
"hands": "hands_on_thighs, hands_on_head",
|
||||
"feet": "feet_together, curled_toes",
|
||||
"additional": "extreme_close-up, squashed, muffling, soft_lighting, skin_texture"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
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": "buttjob, intercrural_sex, sex_positions",
|
||||
"head": "",
|
||||
"upper_body": "bent_over",
|
||||
"lower_body": "buttjob, genitals_between_buttocks",
|
||||
"hands": "hands_on_own_thighs",
|
||||
"feet": "",
|
||||
"additional": "missionary_position"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/carwashv2.json
Normal file
24
data/actions/carwashv2.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "carwashv2",
|
||||
"action_name": "Carwashv2",
|
||||
"action": {
|
||||
"base": "washing_vehicle, bending_over, suggestive_pose",
|
||||
"head": "wet_hair",
|
||||
"upper_body": "wet_clothes, breast_press, cleavage, breasts_on_glass",
|
||||
"lower_body": "",
|
||||
"hands": "holding_sponge, holding_hose",
|
||||
"feet": "",
|
||||
"additional": "car, motor_vehicle, soap_bubbles, wet, water_splashing"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cat_stretchill.json
Normal file
24
data/actions/cat_stretchill.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cat_stretchill",
|
||||
"action_name": "Cat Stretchill",
|
||||
"action": {
|
||||
"base": "cat_stretch, pose, all_fours",
|
||||
"head": "head_down, looking_at_viewer, closed_eyes",
|
||||
"upper_body": "arched_back, outstretched_arms, chest_support, hands_on_ground",
|
||||
"lower_body": "hips_up, buttocks_up, kneeling, knees_on_ground",
|
||||
"hands": "palms_down",
|
||||
"feet": "feet_up",
|
||||
"additional": "trembling, cat_tail, cat_ears"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/charm_person_magic.json
Normal file
24
data/actions/charm_person_magic.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "charm_person_magic",
|
||||
"action_name": "Charm Person Magic",
|
||||
"action": {
|
||||
"base": "casting_spell, magic_circle, spell_casting",
|
||||
"head": "smile, confident_expression, glowing_eyes, looking_at_viewer",
|
||||
"upper_body": "outstretched_hand, reaching_towards_viewer, arms_up, upper_body",
|
||||
"lower_body": "",
|
||||
"hands": "open_hand, hand_gesture",
|
||||
"feet": "",
|
||||
"additional": "aura, light_particles, glittering, magical_energy"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/cheekbulge.json
Normal file
24
data/actions/cheekbulge.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cheekbulge",
|
||||
"action_name": "Cheekbulge",
|
||||
"action": {
|
||||
"base": "fellatio",
|
||||
"head": "cheek_bulge, head_tilt, saliva, penis_in_mouth, fellatio, looking_up, mouth_fill",
|
||||
"upper_body": "arms_behind_back, upper_body",
|
||||
"lower_body": "kneeling, kneeling_position",
|
||||
"hands": "hands_on_head",
|
||||
"feet": "plantar_flexion",
|
||||
"additional": "deepthroat, pov, penis, male_focus"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/chokehold.json
Normal file
24
data/actions/chokehold.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "chokehold",
|
||||
"action_name": "Chokehold",
|
||||
"action": {
|
||||
"base": "rear_naked_choke, from_behind, struggling, kneeling",
|
||||
"head": "head_back, open_mouth, rolling_eyes, teardrops, veins, suffocation, air_hunger",
|
||||
"upper_body": "arm_around_neck, struggling, grabbing_arm, posture_leaned_forward, arched_back",
|
||||
"lower_body": "kneeling, bent_over, spread_legs",
|
||||
"hands": "clenched_hands, struggling",
|
||||
"feet": "barefoot, toes_curled",
|
||||
"additional": "distress, blushing, drooling, saliva, sweat"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cleavageteasedwnsty_000008.json
Normal file
24
data/actions/cleavageteasedwnsty_000008.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"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",
|
||||
"upper_body": "arms_bent_at_elbows, cleavage, breasts_squeezed_together, areola_slip, bare_shoulders, collarbone",
|
||||
"lower_body": "",
|
||||
"hands": "hands_on_own_chest, pulling_down_clothes, adjusting_clothes",
|
||||
"feet": "",
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/closeup_facial_illus.json
Normal file
24
data/actions/closeup_facial_illus.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action": {
|
||||
"base": "close-up, portrait, face_focus",
|
||||
"head": "open_mouth, tongue, saliva, blush, looking_at_viewer, eyes_visible",
|
||||
"upper_body": "",
|
||||
"lower_body": "",
|
||||
"hands": "",
|
||||
"feet": "",
|
||||
"additional": "cum, messy, fluids"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
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": "faux_figurine, miniature, cum_on_body",
|
||||
"head": "cum_on_face",
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cooperative_grinding.json
Normal file
28
data/actions/cooperative_grinding.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cooperative_grinding",
|
||||
"action_name": "Cooperative Grinding",
|
||||
"action": {
|
||||
"base": "duo, standing, lift_and_carry, straddling, legs_wrapped_around_waist, physical_contact",
|
||||
"head": "head_thrown_back, blushing, panting, eyes_closed, half-closed_eyes, rolled_back_eyes, expressionless_pleasure",
|
||||
"upper_body": "arms_around_neck, holding_buttocks, supporting_thighs, chest_to_chest, close_embrace",
|
||||
"lower_body": "hips_touching, grinding, mating_press, pelvic_curtain, thighs_spread, lifted_legs",
|
||||
"hands": "grabbing, gripping_back, squeezing",
|
||||
"feet": "arched_toes, dangling_feet",
|
||||
"additional": "sweat, motion_lines, intimate, sexual_intercourse, erotic"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1boy 2girls",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cooperativepaizuri.json
Normal file
24
data/actions/cooperativepaizuri.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cooperativepaizuri",
|
||||
"action_name": "Cooperativepaizuri",
|
||||
"action": {
|
||||
"base": "cooperative_paizuri, 2girls, 1boy, sexual_activity, sex_position",
|
||||
"head": "smile, open_mouth, facial, looking_at_partner, eyes_closed, flushed",
|
||||
"upper_body": "arms_around_neck, breasts_between_breasts, large_breasts, cleavage, nipple_tweaking",
|
||||
"lower_body": "penis, glans, erection, kneeling, straddling, cowgirl_position",
|
||||
"hands": "holding_penis, touching_partner, reaching_for_partner",
|
||||
"feet": "barefoot, toes_curled",
|
||||
"additional": "pov, cum_on_body, fluids, (multiple_girls:1.2), erotic, masterpiece"
|
||||
},
|
||||
"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": {
|
||||
"participants": "2girls 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/covering_privates_illustrious_v1_0.json
Normal file
24
data/actions/covering_privates_illustrious_v1_0.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "covering_privates_illustrious_v1_0",
|
||||
"action_name": "Covering Privates Illustrious V1 0",
|
||||
"action": {
|
||||
"base": "covering_genitals, covering_breasts",
|
||||
"head": "blush, embarrassed, looking_at_viewer",
|
||||
"upper_body": "arms_crossed, covering_breasts, upper_body",
|
||||
"lower_body": "legs_together, hips",
|
||||
"hands": "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": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/coveringownmouth_ill_v1.json
Normal file
24
data/actions/coveringownmouth_ill_v1.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "coveringownmouth_ill_v1",
|
||||
"action_name": "Coveringownmouth Ill V1",
|
||||
"action": {
|
||||
"base": "covering_own_mouth, solo",
|
||||
"head": "hand_over_mouth",
|
||||
"upper_body": "arm_raised",
|
||||
"lower_body": "variable",
|
||||
"hands": "palm_inward",
|
||||
"feet": "variable",
|
||||
"additional": "pensive, shy, embarrassed, surprise"
|
||||
},
|
||||
"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": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cowgirl_position_breast_press_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Cowgirl Position Breast Press Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "straddling, pov, on_top, leaning_forward",
|
||||
"head": "looking_at_viewer, intense_gaze, half-closed_eyes",
|
||||
"upper_body": "arms_extended, breasts_pressed_against_viewer, breast_squish, cleavage",
|
||||
"lower_body": "spread_legs, knees_up, straddling_partner",
|
||||
"hands": "on_man's_chest, hand_on_partner",
|
||||
"feet": "out_of_frame",
|
||||
"additional": "breast_deformation, intimate, close-up, first-person_view"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cuckold_ntr_il_nai_py.json
Normal file
28
data/actions/cuckold_ntr_il_nai_py.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"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": "looking_back, flushed, heavy_breathing, facial_expression, looking_at_viewer, tears, heart_shaped_pupils, eyes_rolled_back",
|
||||
"upper_body": "arched_back, leaning_forward",
|
||||
"lower_body": "hips_up, kneeling, legs_spread",
|
||||
"hands": "hands_gripping_bed_sheets",
|
||||
"feet": "curled_toes",
|
||||
"additional": "sweat, messy_hair, man_in_background"
|
||||
},
|
||||
"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": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cum_bathillustrious.json
Normal file
28
data/actions/cum_bathillustrious.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cum_bathillustrious",
|
||||
"action_name": "Cum Bathillustrious",
|
||||
"action": {
|
||||
"base": "cum_bath, bathtub, viscous_white_liquid, partially_submerged",
|
||||
"head": "wet_hair, blush, steam, half-closed_eyes, looking_at_viewer",
|
||||
"upper_body": "nude, wet, cum_on_chest, cum_on_stomach",
|
||||
"lower_body": "submerged, knees_up",
|
||||
"hands": "dripping_cum",
|
||||
"feet": "submerged",
|
||||
"additional": "bathroom, steam, excessive_cum, sticky"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "F"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cum_bathIllustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cum_bathIllustrious",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cum_in_cleavage_illustrious.json
Normal file
24
data/actions/cum_in_cleavage_illustrious.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cum_in_cleavage_illustrious",
|
||||
"action_name": "Cum In Cleavage Illustrious",
|
||||
"action": {
|
||||
"base": "upper_body, focus_on_breasts, intimate",
|
||||
"head": "blush, open_mouth, expressive_eyes, looking_at_viewer, heavy_lidded_eyes",
|
||||
"upper_body": "arms_bent, breasts, cleavage, cum_in_cleavage, bare_breasts, liquid_in_cleavage",
|
||||
"lower_body": "",
|
||||
"hands": "hands_on_breasts, squeezing_breasts",
|
||||
"feet": "",
|
||||
"additional": "messy, erotic, semen, cum_on_skin"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cum_in_cleavage_illustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cum_in_cleavage, holding own breasts",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cum_inside_slime_v0_2.json
Normal file
28
data/actions/cum_inside_slime_v0_2.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cum_inside_slime_v0_2",
|
||||
"action_name": "Cum Inside Slime V0 2",
|
||||
"action": {
|
||||
"base": "front_view, focus_on_midsection, semi-transparent_body, translucent_skin",
|
||||
"head": "flustered, open_mouth, heavy_blush, tongue_out, eyes_rolled_back, heart-shaped_pupils",
|
||||
"upper_body": "bent_arms, hands_on_stomach, visible_internal_cum, stomach_fill, distended_belly",
|
||||
"lower_body": "glowing, slime_texture, dripping, thighs_together",
|
||||
"hands": "cupping_stomach",
|
||||
"feet": "standing, melting",
|
||||
"additional": "internal_cum, x-ray, cross-section, viscous_liquid, bioluminescence"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Cum_inside_slime_v0.2.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Cum_inside_slime_v0.2",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cum_shot.json
Normal file
24
data/actions/cum_shot.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cum_shot",
|
||||
"action_name": "Cum Shot",
|
||||
"action": {
|
||||
"base": "cum_shot, cum, from_above",
|
||||
"head": "cum_on_face, facial, cum_in_eye, cum_in_mouth, open_mouth, messy_face",
|
||||
"upper_body": "cum_on_breasts, cum_on_body, sticky",
|
||||
"lower_body": "",
|
||||
"hands": "",
|
||||
"feet": "",
|
||||
"additional": "white_fluid, dripping, shiny_skin, fluid_on_skin"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cum_shot.safetensors",
|
||||
"lora_weight": 0.8,
|
||||
"lora_triggers": "cum, facial, ejaculation",
|
||||
"lora_weight_min": 0.8,
|
||||
"lora_weight_max": 0.8
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cum_swap.json
Normal file
28
data/actions/cum_swap.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cum_swap",
|
||||
"action_name": "Cum Swap",
|
||||
"action": {
|
||||
"base": "1girl 1girl, duo, close embrace, intimate, body contact",
|
||||
"head": "kissing, deep kiss, open mouth, closed eyes, blush",
|
||||
"upper_body": "arms around neck, arms around waist, chests touching, leaning in",
|
||||
"lower_body": "leg lock, standing, pressing.",
|
||||
"hands": "face_grabbing, hand in hair, touching partner",
|
||||
"feet": "barefoot, grounded",
|
||||
"additional": "cum_swap, spit_take, saliva, seminal_fluid, mess, liquid_bridge"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "false",
|
||||
"orientation": "FF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Cum_Swap.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Cum_Swap",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cumblastfacial.json
Normal file
24
data/actions/cumblastfacial.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cumblastfacial",
|
||||
"action_name": "Cumblastfacial",
|
||||
"action": {
|
||||
"base": "solo, ejaculation, cumshot",
|
||||
"head": "facial, head_tilt, looking_up, cum_in_eye, cum_on_face, covered_in_cum",
|
||||
"upper_body": "arms_at_side, cum_on_upper_body, wet_clothes",
|
||||
"lower_body": "standing",
|
||||
"hands": "hands_at_side",
|
||||
"feet": "standing",
|
||||
"additional": "projectile_cum, excessive_cum, semen, cum_on_hair"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cumblastfacial.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "xcbfacialx",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/cuminhands.json
Normal file
24
data/actions/cuminhands.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cuminhands",
|
||||
"action_name": "Cuminhands",
|
||||
"action": {
|
||||
"base": "after_fellatio, ejaculation",
|
||||
"head": "facial, cum_on_face, cum_in_mouth, cum_string, looking_at_hands",
|
||||
"upper_body": "arms_bent, upper_body",
|
||||
"lower_body": "",
|
||||
"hands": "cupping_hands, cum_on_hands",
|
||||
"feet": "",
|
||||
"additional": "excessive_cum"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cuminhands.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cum on hands, cupping hands, excessive cum, cum on face, cum in mouth, cum string",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cumshot.json
Normal file
28
data/actions/cumshot.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cumshot",
|
||||
"action_name": "Cumshot",
|
||||
"action": {
|
||||
"base": "close-up, high_angle, macro",
|
||||
"head": "head_back, mouth_open, tongue_out, face_covered_in_cum, closed_eyes, rolling_eyes, ecstatic_expression, wet_eyelashes",
|
||||
"upper_body": "bare_shoulders, cleavage",
|
||||
"lower_body": "out_of_frame",
|
||||
"hands": "out_of_frame",
|
||||
"feet": "out_of_frame",
|
||||
"additional": "cum_on_face, facial, seminal_fluid, cum_drip, dynamic_angle, splashing, messy, thick_liquid"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cumshot.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cumshot",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/cumtube_000035.json
Normal file
28
data/actions/cumtube_000035.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "cumtube_000035",
|
||||
"action_name": "Cumtube 000035",
|
||||
"action": {
|
||||
"base": "kneeling, leaning_back",
|
||||
"head": "force_feeding, tube, head_tilted_back, mouth_open, tongue_out, facial_fluids, looking_up, eyes_rolled_back",
|
||||
"upper_body": "arms_raised, holding_object, chest_pushed_forward, fluids_dripping, torso_drenched",
|
||||
"lower_body": "kneeling, legs_together",
|
||||
"hands": "hands_on_object",
|
||||
"feet": "toes, feet_together",
|
||||
"additional": "clear_tube, cum, white_viscous_liquid, messy, splatter, overflow"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cumtube-000035.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cumtube-000035",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "cunnilingus_on_back_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Cunnilingus On Back Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "lying, on_back, spread_legs, nude",
|
||||
"head": "torogao, blush, sweat, half-closed_eyes, tongue_out",
|
||||
"upper_body": "navel, nipples, sweat",
|
||||
"lower_body": "cunnilingus, vulva, spread_legs, thighs",
|
||||
"hands": "hands_on_chest",
|
||||
"feet": "",
|
||||
"additional": "on_bed, pillow, profile"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/cunnilingus-on-back-illustriousxl-lora-nochekaiser.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "cunnilingus on back",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/danglinglegs.json
Normal file
24
data/actions/danglinglegs.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "danglinglegs",
|
||||
"action_name": "Danglinglegs",
|
||||
"action": {
|
||||
"base": "suspended_congress, lifting_person, standing_sex, sex_from_behind",
|
||||
"head": "clenched_teeth, head_back, eyes_closed",
|
||||
"upper_body": "arms_around_neck, body_lifted, breasts_pressed_against_body",
|
||||
"lower_body": "penis_in_vagina, hips_held, legs_apart, feet_off_ground",
|
||||
"hands": "hands_on_shoulders, grabbing_shoulders",
|
||||
"feet": "toes_curled, barefoot",
|
||||
"additional": "size_difference, larger_male, orgasm, sweat"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/danglinglegs.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "dangling legs, lifted by penis, suspended on penis",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/deep_kiss_000007.json
Normal file
28
data/actions/deep_kiss_000007.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "deep_kiss_000007",
|
||||
"action_name": "Deep Kiss 000007",
|
||||
"action": {
|
||||
"base": "1girl, 1boy, duo, kissing, deep_kiss, french_kiss, romantic, passionate, intimacy",
|
||||
"head": "eyes_closed, open_mouth, tongue, tongue_touching, flushed, blushing, tilted_head",
|
||||
"upper_body": "embrace, hugging, holding_each_other, arms_around_neck, arms_around_waist, chest_to_chest",
|
||||
"lower_body": "hips_pressed_together, standing_close",
|
||||
"hands": "cupping_face, hands_in_hair, gripping, back_embrace",
|
||||
"feet": "tiptoes, standing",
|
||||
"additional": "saliva, dripping_saliva, saliva_string, tongue_kiss"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Deep_Kiss-000007.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Deep_Kiss-000007",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/deepthroat_ponytailhandle_anime_il_v1.json
Normal file
24
data/actions/deepthroat_ponytailhandle_anime_il_v1.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "deepthroat_ponytailhandle_anime_il_v1",
|
||||
"action_name": "Deepthroat Ponytailhandle Anime Il V1",
|
||||
"action": {
|
||||
"base": "irrumatio, fellatio, 1boy, 1girl, duo, deepthroat",
|
||||
"head": "forced, head_back, mouth_open, saliva, drooling, crying, tears, expressionless, wide_eyes",
|
||||
"upper_body": "arms_at_sides, upper_body",
|
||||
"lower_body": "",
|
||||
"hands": "hands_on_hair, grabbing_hair",
|
||||
"feet": "",
|
||||
"additional": "penis, ponytail, pov"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Deepthroat_PonytailHandle_Anime_IL_V1.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "deepthroat_ponytailhandle, grabbing another's hair, ponytail",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy 1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/defeat_ntr_il_nai_py.json
Normal file
28
data/actions/defeat_ntr_il_nai_py.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "defeat_ntr_il_nai_py",
|
||||
"action_name": "Defeat Ntr Il Nai Py",
|
||||
"action": {
|
||||
"base": "kneeling, on_all_fours, orz, slumped, defeat, dogeza, sex_from_behind",
|
||||
"head": "bowed_head, looking_down, shadowed_face, crying, tears, empty_eyes, closed_eyes, anguish",
|
||||
"upper_body": "arms_on_ground, hunched_back, leaning_forward",
|
||||
"lower_body": "hips_up, kneeling, on_knees",
|
||||
"hands": "hands_on_ground, palms_down, clenched_hand",
|
||||
"feet": "barefoot, curled_toes",
|
||||
"additional": "gloom, depression, dramatic_shadows, humiliation, emotional_breakdown"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Defeat NTR-IL_NAI_PY.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Defeat NTR-IL_NAI_PY",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/defeat_suspension_il_nai_py.json
Normal file
28
data/actions/defeat_suspension_il_nai_py.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "defeat_suspension_il_nai_py",
|
||||
"action_name": "Defeat Suspension Il Nai Py",
|
||||
"action": {
|
||||
"base": "suspension, hanging, bondage, arms_up, limp, dangling, defeated, total_submission",
|
||||
"head": "head_down, hair_over_eyes, eyes_closed, unconscious, expressionless",
|
||||
"upper_body": "arms_above_head, stretched_arms, chest_up, ribcage",
|
||||
"lower_body": "limp_legs, dangling_legs, sagging_hips",
|
||||
"hands": "bound, wrists_bound, handcuffs",
|
||||
"feet": "barefoot, dangling",
|
||||
"additional": "ropes, chains, dungeon, interior"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Defeat suspension-IL_NAI_PY.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Defeat suspension-IL_NAI_PY",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/defeatspitroast_illustrious.json
Normal file
28
data/actions/defeatspitroast_illustrious.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "defeatspitroast_illustrious",
|
||||
"action_name": "Defeatspitroast Illustrious",
|
||||
"action": {
|
||||
"base": "threesome, double penetration, oral, vaginal, spitroast, suspended, dangling_legs",
|
||||
"head": "head_back, mouth_open, tongue_out, exhausted, eyes_rolled_back, semi-closed_eyes, ahegao",
|
||||
"upper_body": "arms_bent, arched_back, sweaty",
|
||||
"lower_body": "ass_up, kneeling, spread_legs",
|
||||
"hands": "gripping, clenching",
|
||||
"feet": "toes_curled",
|
||||
"additional": "messy_hair, trembling, heavy_breathing, defeated"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MMF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Defeatspitroast_Illustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Defeatspitroast_Illustrious",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 2boys",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/disinterested_sex___bored_female.json
Normal file
28
data/actions/disinterested_sex___bored_female.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "disinterested_sex___bored_female",
|
||||
"action_name": "Disinterested Sex Bored Female",
|
||||
"action": {
|
||||
"base": "1girl, hetero, doggystyle, male_focused, (solo_focus:1.2)",
|
||||
"head": "lying, stomach, on_stomach, pillow, looking_at_phone, bored, uninterested, expressionless",
|
||||
"upper_body": "lying, stomach",
|
||||
"lower_body": "doggystyle",
|
||||
"hands": "holding_phone",
|
||||
"feet": "",
|
||||
"additional": ""
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Disinterested_Sex___Bored_Female.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Disinterested_Sex___Bored_Female",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/display_case_bdsm_illus.json
Normal file
28
data/actions/display_case_bdsm_illus.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "display_case_bdsm_illus",
|
||||
"action_name": "Display Case Bdsm Illus",
|
||||
"action": {
|
||||
"base": "glass_box, confinement, trapped, human_exhibit, enclosure",
|
||||
"head": "looking_at_viewer, open_mouth, empty_eyes, expressionless",
|
||||
"upper_body": "bound, arms_behind_back, arms_pressed_against_glass, restricted_movement",
|
||||
"lower_body": "kneeling, standing",
|
||||
"hands": "hands_pressed_against_glass, bound_hands",
|
||||
"feet": "barefoot",
|
||||
"additional": "reflections, glass, transparent_wall, exhibit, bondage, bdsm"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "F"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/display_case_bdsm_illus.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "display_case_bdsm_illus",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/display_case_illustr.json
Normal file
28
data/actions/display_case_illustr.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "display_case_illustr",
|
||||
"action_name": "Display Case Illustr",
|
||||
"action": {
|
||||
"base": "standing, action_figure, encased, display_box, transparent_packaging",
|
||||
"head": "neutral_expression, face_forward, fixed_gaze, doll_joint",
|
||||
"upper_body": "rigid_posture, standing_stiffly, front_view",
|
||||
"lower_body": "standing_straight, feet_together",
|
||||
"hands": "hands_at_sides, open_palm, pressing_against_glass",
|
||||
"feet": "flat_feet",
|
||||
"additional": "cardboard_backing, toy_packaging, barcode, reflections_on_glass, sealed_box, plastic_container"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "F"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/display_case_illustr.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "display_case_illustr",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/doggydoublefingering.json
Normal file
24
data/actions/doggydoublefingering.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "doggydoublefingering",
|
||||
"action_name": "Doggydoublefingering",
|
||||
"action": {
|
||||
"base": "3girls, group_sex, doggystyle, fingering, multiple_females_fingered",
|
||||
"head": "blushing, sweating, facial_expression, eyes_closed, looking_at_viewer",
|
||||
"upper_body": "leaning_forward, upper_body_focus",
|
||||
"lower_body": "all_fours, spread_legs, hips_up",
|
||||
"hands": "arms_extended, fingers_touching_surface",
|
||||
"feet": "kneeling, soles_of_feet",
|
||||
"additional": "male_focus, male_fingering, multiple_females, group_sex, vaginal_penetration, doggystyle_from_behind, shared_pleasure"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/DoggyDoubleFingering.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "doggydoublefingerfront, from front, 3girls, multiple girls, fingering, sex from behind, doggystyle",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "3girls, 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/dunking_face_in_a_bowl_of_cum_r1.json
Normal file
24
data/actions/dunking_face_in_a_bowl_of_cum_r1.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "dunking_face_in_a_bowl_of_cum_r1",
|
||||
"action_name": "Dunking Face In A Bowl Of Cum R1",
|
||||
"action": {
|
||||
"base": "kneeling, all_fours, head_down, humiliation, close-up, from_below, solo",
|
||||
"head": "face_down, cum_in_mouth, cum_bubble, crying, closed_eyes",
|
||||
"upper_body": "",
|
||||
"lower_body": "",
|
||||
"hands": "clutching_head",
|
||||
"feet": "",
|
||||
"additional": "bowl, cum, drowning, air_bubble"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Dunking_face_in_a_bowl_of_cum_r1.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "gokkun, cum bowl",
|
||||
"lora_weight_min": 0.4,
|
||||
"lora_weight_max": 0.6
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/ekiben_ill_10.json
Normal file
28
data/actions/ekiben_ill_10.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "ekiben_ill_10",
|
||||
"action_name": "Ekiben Ill 10",
|
||||
"action": {
|
||||
"base": "duo, 1boy, 1girl, male_lifting_female, standing, holding, sexual_position, intercourse",
|
||||
"head": "looking_at_each_other, head_back, closed_eyes",
|
||||
"upper_body": "arms_around_neck, chest_to_chest, close_embrace, torso_embrace",
|
||||
"lower_body": "connected, groins_touching, legs_around_male, legs_up, m_legs, bent_knees",
|
||||
"hands": "hands_on_thighs, gripping_thighs, holding_legs",
|
||||
"feet": "dangling_feet, toes_curled",
|
||||
"additional": "strength, suspension, height_difference, lifting_person"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/ekiben_ill-10.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "ekiben_ill-10",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy, 1girl, duo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/elbow_squeeze__concept_lora_000008.json
Normal file
28
data/actions/elbow_squeeze__concept_lora_000008.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "elbow_squeeze__concept_lora_000008",
|
||||
"action_name": "Elbow Squeeze Concept Lora 000008",
|
||||
"action": {
|
||||
"base": "standing, arms_at_sides, upper_body, elbow_squeeze, pushing_together",
|
||||
"head": "looking_at_viewer, shy, teasing",
|
||||
"upper_body": "arms_pressed_against_body, cleavage, breast_compression, arms_crossed_under_breasts",
|
||||
"lower_body": "standing, standing_on_one_leg, knock-kneed",
|
||||
"hands": "hands_together, hand_on_torso",
|
||||
"feet": "barefoot, shoes",
|
||||
"additional": "tight_clothes"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Elbow_Squeeze__Concept_Lora-000008.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Elbow_Squeeze__Concept_Lora-000008",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/extreme_sex_v1_0_illustriousxl.json
Normal file
24
data/actions/extreme_sex_v1_0_illustriousxl.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "extreme_sex_v1_0_illustriousxl",
|
||||
"action_name": "Extreme Sex V1 0 Illustriousxl",
|
||||
"action": {
|
||||
"base": "sexual_activity, sex, multiple_positions",
|
||||
"head": "ahegao, rolling_eyes, head_back, mouth_open, drooling, saliva_trail",
|
||||
"upper_body": "sweaty, flushed, messy_hair, heavy_breathing",
|
||||
"lower_body": "legs_spread, wrapped_around_partner",
|
||||
"hands": "hands_on_partner, gripping",
|
||||
"feet": "curled_toes",
|
||||
"additional": "passionate, climax, facial_flush, intense_expression"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/extreme-sex-v1.0-illustriousxl.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "extreme sex",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/face_grab_illustrious.json
Normal file
24
data/actions/face_grab_illustrious.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "face_grab_illustrious",
|
||||
"action_name": "Face Grab Illustrious",
|
||||
"action": {
|
||||
"base": "pov, first-person_view, close-up, grabbing_another's_face",
|
||||
"head": "forced_expression, open_mouth, tongue_out, pout, crying, streaming_tears, looking_at_viewer",
|
||||
"upper_body": "upper_body, nude, partially_clad",
|
||||
"lower_body": "out_of_frame",
|
||||
"hands": "pov_hands, grabbing_face",
|
||||
"feet": "out_of_frame",
|
||||
"additional": "after_fellatio, cum_on_tongue, cum_on_face"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/face_grab_illustrious.safetensors",
|
||||
"lora_weight": 0.5,
|
||||
"lora_triggers": "fcgrb, face grab, grabbing another's face, pov, pov hand, open mouth, tongue out",
|
||||
"lora_weight_min": 0.5,
|
||||
"lora_weight_max": 0.5
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/facesit_08.json
Normal file
24
data/actions/facesit_08.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "facesit_08",
|
||||
"action_name": "Facesit 08",
|
||||
"action": {
|
||||
"base": "sitting_on_face, cunnilingus, oral",
|
||||
"head": "looking_at_viewer, looking_down",
|
||||
"upper_body": "hand_on_head, nude, close-up",
|
||||
"lower_body": "pussy, spread_legs, vaginal_fluids, clitoris",
|
||||
"hands": "hands_on_head",
|
||||
"feet": "out_of_frame",
|
||||
"additional": "yuri, female_pov, 2girls"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/facesit-08.safetensors",
|
||||
"lora_weight": 0.8,
|
||||
"lora_triggers": "2girls, female pov, close-up, looking at viewer, sitting on face, oral, cunnilingus, spread legs, pussy juice, clitoris",
|
||||
"lora_weight_min": 0.8,
|
||||
"lora_weight_max": 0.8
|
||||
},
|
||||
"tags": {
|
||||
"participants": "2girls",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "fellatio_from_below_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Fellatio From Below Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "fellatio, from_below, squatting",
|
||||
"head": "looking_at_viewer, open_mouth, looking_down",
|
||||
"upper_body": "nude, navel, breasts, nipples",
|
||||
"lower_body": "nude, pussy, spread_legs, bent_legs",
|
||||
"hands": "hands_on_ground",
|
||||
"feet": "barefoot",
|
||||
"additional": "penis, testicles, fellatio, sweat, cum"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/fellatio-from-below-illustriousxl-lora-nochekaiser.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "fellatio from below, fellatio, from below, squatting, hetero, penis, testicles, completely nude, oral",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "fellatio_on_couch_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Fellatio On Couch Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "fellatio, oral, sitting, on_couch, sex, hetero",
|
||||
"head": "blush, sweat, head_down, eyes_closed, looking_down",
|
||||
"upper_body": "nude, breasts, breast_press, leaning_forward",
|
||||
"lower_body": "sitting, spread_legs, nude",
|
||||
"hands": "hands_on_legs",
|
||||
"feet": "feet_on_floor",
|
||||
"additional": "couch, penis, testicles, focus_on_penis"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/fellatio-on-couch-illustriousxl-lora-nochekaiser.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "fellatio on couch, hetero, penis, oral, sitting, fellatio, testicles, blush, couch, sweat, breast press, nipples, completely nude, uncensored",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/femdom_face_between_breasts.json
Normal file
28
data/actions/femdom_face_between_breasts.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "femdom_face_between_breasts",
|
||||
"action_name": "Femdom Face Between Breasts",
|
||||
"action": {
|
||||
"base": "upper_body, 1girl, 1boy, couple, breast_smother",
|
||||
"head": "looking_down, dominant, smirk, narrowed_eyes, looking_at_viewer",
|
||||
"upper_body": "arms_around_head, chest, breasts_pressed_together, cleavage, breast_smother",
|
||||
"lower_body": "standing",
|
||||
"hands": "hands_in_hair, holding_head",
|
||||
"feet": "",
|
||||
"additional": "face_buried_in_breasts, squished_face, dominance, sexual_intercourse, suggestive"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/femdom_face_between_breasts.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "femdom_face_between_breasts",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/femdom_held_down_illust.json
Normal file
24
data/actions/femdom_held_down_illust.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "femdom_held_down_illust",
|
||||
"action_name": "Femdom Held Down Illust",
|
||||
"action": {
|
||||
"base": "straddling, pin, 1girl, 1boy, lying_on_back",
|
||||
"head": "looking_down, looking_at_viewer, intense_expression",
|
||||
"upper_body": "arms_above_head, holding_wrists, dominant_female",
|
||||
"lower_body": "spread_legs, crotch_straddle",
|
||||
"hands": "hands_holding, grasping, clenched_hand",
|
||||
"feet": "barefoot",
|
||||
"additional": "femdom, power_dynamic, struggle, restraint"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Femdom_Held_Down_Illust.safetensors",
|
||||
"lora_weight": 0.8,
|
||||
"lora_triggers": "fdom_held",
|
||||
"lora_weight_min": 0.8,
|
||||
"lora_weight_max": 0.8
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "fertilization_illustriousxl_lora_nochekaiser",
|
||||
"action_name": "Fertilization Illustriousxl Lora Nochekaiser",
|
||||
"action": {
|
||||
"base": "sex, vaginal, on_bed, nude, cowboy_shot, ejaculation",
|
||||
"head": "ahegao, flushed, open_mouth, head_back, rolled_eyes, half-closed_eyes",
|
||||
"upper_body": "nude, nipples, navel, arms_at_sides",
|
||||
"lower_body": "pussy, cum_in_pussy, internal_cumshot, penis, hetero, spread_legs, legs_up",
|
||||
"hands": "clenched_hands",
|
||||
"feet": "bare_feet",
|
||||
"additional": "cross-section, fertilization, pregnancy, uterus, ovum, sperm_cell, ovaries"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/fertilization-illustriousxl-lora-nochekaiser.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "fertilization, ovum, impregnation, sperm cell, cross-section, cum in pussy, internal cumshot, uterus, cum, sex, vaginal, ovaries, penis, hetero, ejaculation",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/fff_imminent_masturbation.json
Normal file
24
data/actions/fff_imminent_masturbation.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "fff_imminent_masturbation",
|
||||
"action_name": "Fff Imminent Masturbation",
|
||||
"action": {
|
||||
"base": "hand_on_crotch, trembling, legs_together, knock-kneed, blushing, arousal",
|
||||
"head": "heavy_breathing, sweat, looking_down, narrowed_eyes, half-closed_eyes, dilated_pupils, flushed",
|
||||
"upper_body": "arched_back, squirming, knees_together",
|
||||
"lower_body": "hips_forward, standing, legs_together",
|
||||
"hands": "hand_on_crotch, grasping, squeezing, rubbing_crotch",
|
||||
"feet": "standing, feet_together",
|
||||
"additional": "clothed_masturbation, urgency, arousal, intimate_touch"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFF_imminent_masturbation.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "FFF_grabbing_own_crotch, trembling, sweat, breath, imminent_masturbation",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/ffm3some_footjob_efeme3ftfe_il_1475115.json
Normal file
28
data/actions/ffm3some_footjob_efeme3ftfe_il_1475115.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "ffm3some_footjob_efeme3ftfe_il_1475115",
|
||||
"action_name": "Ffm3Some Footjob Efeme3Ftfe Il 1475115",
|
||||
"action": {
|
||||
"base": "ffm, threesome, 1boy, 2girls, footjob, multiple_partners, sexual_activity",
|
||||
"head": "looking_down, male focus, arousal, eyes_closed, looking_at_penis, eye_contact",
|
||||
"upper_body": "supine, bare_torso, torso_focus, arms_at_sides, reclining",
|
||||
"lower_body": "spread_legs, legs_up, legs_spread",
|
||||
"hands": "gripping_sheets, hands_on_bed, hands_on_legs",
|
||||
"feet": "barefoot, soles, toes_curling, sandwich, four_feet",
|
||||
"additional": "indoors, bed, crumpled_sheets, climax, sweaty"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "false",
|
||||
"orientation": "FFM"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFM3SOME-footjob-EFEME3ftfe-IL_1475115.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "FFM3SOME-footjob-EFEME3ftfe-IL_1475115",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy, 2girls, ffm, threesome",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "ffm_threesome___kiss_and_fellatio_illustrious",
|
||||
"action_name": "Ffm Threesome Kiss And Fellatio Illustrious",
|
||||
"action": {
|
||||
"base": "ffm_threesome, 2girls, 1boy, group_sex, sandwich_position",
|
||||
"head": "kissing, fellatio, head_grab, closed_eyes, tilted_head",
|
||||
"upper_body": "arms_around_neck, hand_on_head, leaning_forward, physical_contact, messy_hair, collarbone",
|
||||
"lower_body": "kneeling, sitting, straddling, spread_legs, barefoot",
|
||||
"hands": "stroking, hand_on_penis",
|
||||
"feet": "barefoot",
|
||||
"additional": "indoor, couch, faceless_male, saliva, blush, intimate, pleasure"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFM_threesome_-_Kiss_and_Fellatio_Illustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "ffm_threesome_kiss_and_fellatio",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy, 2girls",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "ffm_threesome_doggy_style_front_view_illustrious",
|
||||
"action_name": "Ffm Threesome Doggy Style Front View Illustrious",
|
||||
"action": {
|
||||
"base": "threesome, 2girls, 1boy, doggy_style, from_front, all_fours, kneeling, bodies_overlapping",
|
||||
"head": "looking_at_viewer, head_raised, blushes, sweat, tongue_out, open_eyes, heart_pupils, eye_contact",
|
||||
"upper_body": "arms_straight, hands_on_ground, leaning_forward, arched_back, breasts_hanging",
|
||||
"lower_body": "hips_raised, buttocks, knees_bent, kneeling, legs_spread",
|
||||
"hands": "palms_flat, fingers_spread, on_bed",
|
||||
"feet": "toes_curled, feet_relaxed",
|
||||
"additional": "sex, penetration, vaginal_intercourse, motion_lines, saliva_trail, indoors, bed"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "false",
|
||||
"orientation": "FFM"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFM_Threesome_doggy_style_front_view_Illustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "FFM_Threesome_doggy_style_front_view_Illustrious",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "2girls 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "ffm_threesome_girl_sandwichdouble_dip_illustrious",
|
||||
"action_name": "Ffm Threesome Girl Sandwichdouble Dip Illustrious",
|
||||
"action": {
|
||||
"base": "ffm_threesome, 2girls, 1boy, sandwiched, bed, messy_bed",
|
||||
"head": "ahegao, flushed, closed_eyes, rolled_back_eyes, looking_at_viewer",
|
||||
"upper_body": "embracing, cleavage, breasts_pressed_together, holding_bed_sheet",
|
||||
"lower_body": "straddling, legs_spread, pelvis_against_pelvis, implied_penetration",
|
||||
"hands": "grabbing_sheet, touching_partner",
|
||||
"feet": "barefoot",
|
||||
"additional": "group_sex, orgasm, erotic, indoors"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFM_threesome_girl_sandwichdouble_dip_Illustrious.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "ffm_threesome_double_dip",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy, 2girls",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
24
data/actions/ffm_threesome_one_girl_on_top_and_bj.json
Normal file
24
data/actions/ffm_threesome_one_girl_on_top_and_bj.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "ffm_threesome_one_girl_on_top_and_bj",
|
||||
"action_name": "Ffm Threesome One Girl On Top And Bj",
|
||||
"action": {
|
||||
"base": "ffm_threesome, cowgirl_position, straddling, lying, on_back",
|
||||
"head": "blush, half-closed_eyes, heavy_breathing, open_mouth",
|
||||
"upper_body": "nude, breasts",
|
||||
"lower_body": "legs_apart, straddling, kneeling, bent_legs",
|
||||
"hands": "hands_on_body, touching_self",
|
||||
"feet": "barefoot",
|
||||
"additional": "fellatio, penis, testicles, multiple_girls, 2girls, 1boy, sex"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FFM_threesome_one_girl_on_top_and_BJ.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "ffm_threesome_straddling_fellatio",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy 1girl",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/ffmnursinghandjob_ill_v3.json
Normal file
28
data/actions/ffmnursinghandjob_ill_v3.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "ffmnursinghandjob_ill_v3",
|
||||
"action_name": "Ffmnursinghandjob Ill V3",
|
||||
"action": {
|
||||
"base": "threesome, 2girls, 1boy, ffm, male_lying_on_back, females_kneeling, straddle",
|
||||
"head": "blush, looking_down, ecstatic, tongue_out, half-closed_eyes, heart-shaped_pupils, looking_at_penis",
|
||||
"upper_body": "holding_breasts, reaching_for_penis, exposed_breasts, leaning_forward, nipples",
|
||||
"lower_body": "kneeling, spread_legs, phallus_straddle",
|
||||
"hands": "double_handjob, stroking_penis, squeezing_breasts",
|
||||
"feet": "barefoot",
|
||||
"additional": "lactation, breast_milk, saliva, mess"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "false",
|
||||
"orientation": "FFM"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/ffmNursingHandjob_ill_v3.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "ffmNursingHandjob_ill_v3",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy, 2girls, threesome",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/finish_blow_ill_v0_90_000004.json
Normal file
28
data/actions/finish_blow_ill_v0_90_000004.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "finish_blow_ill_v0_90_000004",
|
||||
"action_name": "Finish Blow Ill V0 90 000004",
|
||||
"action": {
|
||||
"base": "dynamic_pose, fighting_stance, lunging, aerial_pose, mid-air",
|
||||
"head": "intense_expression, screaming, gritted_teeth, flowing_hair, fierce_eyes, glare",
|
||||
"upper_body": "weapon_swing, motion_blur, torso_twist, dynamic_angle",
|
||||
"lower_body": "wide_stance, knees_bent, rotated_hips, foreshortening",
|
||||
"hands": "grip, clenched_hand, holding_weapon, two-handed_weapon",
|
||||
"feet": "standing_on_ground, mid-air",
|
||||
"additional": "speed_lines, impact_frames, shockwave, cinematic_lighting, dutch_angle, smear_frame"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/finish_blow_ill_v0.90-000004.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "finish_blow_ill_v0.90-000004",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
28
data/actions/fixed_perspective_v3_1558768.json
Normal file
28
data/actions/fixed_perspective_v3_1558768.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "fixed_perspective_v3_1558768",
|
||||
"action_name": "Fixed Perspective V3 1558768",
|
||||
"action": {
|
||||
"base": "foreshortening, exaggerated_perspective, depth, 3d, cinematic_composition",
|
||||
"head": "extreme_close_up, looking_at_viewer, eye_contact, detailed_eyes, face_focus",
|
||||
"upper_body": "reaching_towards_viewer, hand_in_foreground, perspective_distortion, angled_body",
|
||||
"lower_body": "diminutive, distant, perspective_shift",
|
||||
"hands": "enlarged_hand, fingers_spread, reaching, holding_frame",
|
||||
"feet": "",
|
||||
"additional": "fisheye, low_angle, depth_of_field, wide_angle_lens, distortion"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/fixed_perspective_v3_1558768.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "fixed_perspective_v3_1558768",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/fixed_point_v2.json
Normal file
24
data/actions/fixed_point_v2.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "fixed_point_v2",
|
||||
"action_name": "Fixed Point V2",
|
||||
"action": {
|
||||
"base": "kneeling, on_floor, indoors, bedroom",
|
||||
"head": "looking_at_viewer, open_eyes",
|
||||
"upper_body": "leaning_on_bed, torso_facing_viewer",
|
||||
"lower_body": "kneeling, legs_together",
|
||||
"hands": "hands_resting",
|
||||
"feet": "barefoot",
|
||||
"additional": "fxdpt, wide_shot, room_interior"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/fixed_point_v2.safetensors",
|
||||
"lora_weight": 0.8,
|
||||
"lora_triggers": "fxdpt, full room view",
|
||||
"lora_weight_min": 0.8,
|
||||
"lora_weight_max": 0.8
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
24
data/actions/flaccid_after_cum_illustrious_000009.json
Normal file
24
data/actions/flaccid_after_cum_illustrious_000009.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"action_id": "flaccid_after_cum_illustrious_000009",
|
||||
"action_name": "Flaccid After Cum Illustrious 000009",
|
||||
"action": {
|
||||
"base": "post-coital, exhausted, lying, bed",
|
||||
"head": "flushed_face, eyes_rolled_back, messy_hair, half-closed_eyes, expressionless",
|
||||
"upper_body": "sweaty, bare_chest, heaving_chest",
|
||||
"lower_body": "flaccid_penis, soft_penis, semen, legs_spread",
|
||||
"hands": "relaxed_hands",
|
||||
"feet": "relaxed_feet",
|
||||
"additional": "messy_bed, steam"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Flaccid_After_Cum_Illustrious-000009.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "flaccid after cum",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "fleshlight_position_doggystyle_dangling_legs_sex_from_behind_hanging_legs_ponyilsdsdxl",
|
||||
"action_name": "Fleshlight Position Doggystyle Dangling Legs Sex From Behind Hanging Legs Ponyilsdsdxl",
|
||||
"action": {
|
||||
"base": "doggystyle, sex, vaginal, from_behind, hanging_legs",
|
||||
"head": "looking_back, expressionless, open_mouth, closed_eyes",
|
||||
"upper_body": "arched_back, leaning_forward, elbows_on_bed",
|
||||
"lower_body": "raised_hips, legs_dangling, dangling",
|
||||
"hands": "hands_on_bed, gripping_bedclothes",
|
||||
"feet": "barefoot, curled_toes",
|
||||
"additional": "on_bed, from_behind, sex_position"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Fleshlight_Position_Doggystyle_Dangling_Legs_Sex_From_Behind_Hanging_Legs_PonyILSDSDXL.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Fleshlight_Position_Doggystyle_Dangling_Legs_Sex_From_Behind_Hanging_Legs_PonyILSDSDXL",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/folded_xl_illustrious_v1_0.json
Normal file
28
data/actions/folded_xl_illustrious_v1_0.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "folded_xl_illustrious_v1_0",
|
||||
"action_name": "Folded Xl Illustrious V1 0",
|
||||
"action": {
|
||||
"base": "standing, crossed_arms, posture",
|
||||
"head": "looking_at_viewer, chin_up, confident_expression, skeptical_expression, annoyed",
|
||||
"upper_body": "crossed_arms",
|
||||
"lower_body": "standing, hip_cocked",
|
||||
"hands": "hands_on_upper_arms",
|
||||
"feet": "feet_together, standing",
|
||||
"additional": "arrogance, defiance"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Folded XL illustrious V1.0.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Folded XL illustrious V1.0",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": false
|
||||
}
|
||||
}
|
||||
28
data/actions/forced_cunnilingus.json
Normal file
28
data/actions/forced_cunnilingus.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "forced_cunnilingus",
|
||||
"action_name": "Forced Cunnilingus",
|
||||
"action": {
|
||||
"base": "cunnilingus, oral_sex, lying_on_back, legs_spread, partner_positioning, 1girl, 1boy",
|
||||
"head": "head_tilted_back, blushing, distressed, tears, mouth_open, looking_away, teary_eyes",
|
||||
"upper_body": "arms_pinned, arched_back, chest_heaving",
|
||||
"lower_body": "hips_lifted, spread_legs, m_legs, knees_bent, exposed_crotch",
|
||||
"hands": "clenched_hands, held_wrists",
|
||||
"feet": "curled_toes",
|
||||
"additional": "saliva, head_between_thighs, struggle, non-consensual"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Forced_cunnilingus.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Forced_cunnilingus",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/foreskin_fellatio_ilxl.json
Normal file
28
data/actions/foreskin_fellatio_ilxl.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "foreskin_fellatio_ilxl",
|
||||
"action_name": "Foreskin Fellatio Ilxl",
|
||||
"action": {
|
||||
"base": "fellatio, oral, oral_sex, close_up, body_focus",
|
||||
"head": "kneeling, head_between_legs, looking_up, mouth_open, tongue",
|
||||
"upper_body": "leaning_forward",
|
||||
"lower_body": "kneeling, knees_together",
|
||||
"hands": "hands_on_penis, gripping, foreskin_retraction",
|
||||
"feet": "barefoot",
|
||||
"additional": "uncut, foreskin, glans, saliva, cum_on_penis"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/foreskin_fellatio-ILXL.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "foreskin_fellatio-ILXL",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/foreskinplay_r1.json
Normal file
28
data/actions/foreskinplay_r1.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "foreskinplay_r1",
|
||||
"action_name": "Foreskinplay R1",
|
||||
"action": {
|
||||
"base": "1boy, solo, close-up, genital_focus",
|
||||
"head": "looking_down",
|
||||
"upper_body": "reaching_down, abs",
|
||||
"lower_body": "erection, uncircumcised, glans, thighs, spread_legs",
|
||||
"hands": "hands_on_penis, pulling_foreskin",
|
||||
"feet": "",
|
||||
"additional": "skin_stretching"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/foreskinplay_r1.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "foreskinplay_r1",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "solo",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/frenchkissv1il_000010.json
Normal file
28
data/actions/frenchkissv1il_000010.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "frenchkissv1il_000010",
|
||||
"action_name": "Frenchkissv1Il 000010",
|
||||
"action": {
|
||||
"base": "kissing, french_kiss, intimate, duo, 1girl, 1boy, close_up, upper_body",
|
||||
"head": "deep_kiss, mouth_open, tongue, closed_eyes, tilted_head, blushing, flushed_face",
|
||||
"upper_body": "embrace, hugging, arms_around_waist, arms_around_neck, body_contact, breasts_pressed_against_body",
|
||||
"lower_body": "close_contact, pelvis_pressed_together",
|
||||
"hands": "hands_in_hair, hand_on_neck, hand_on_hip",
|
||||
"feet": "tiptoes",
|
||||
"additional": "saliva, tongue_interaction, passion, dramatic_lighting, cinematic_lighting"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/FrenchKissV1IL-000010.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "FrenchKissV1IL-000010",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
28
data/actions/frog_embrace_position_il_nai_py.json
Normal file
28
data/actions/frog_embrace_position_il_nai_py.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"action_id": "frog_embrace_position_il_nai_py",
|
||||
"action_name": "Frog Embrace Position Il Nai Py",
|
||||
"action": {
|
||||
"base": "frog_pose, mating_press, lying_on_back, intimate_couple_pose, intercourse, sex, penetration",
|
||||
"head": "head_tilted_back, looking_up, expressionless, pleasure, heavy_blushing, half-closed_eyes, eyes_rolled_back, ahegao, open_mouth",
|
||||
"upper_body": "arms_around_partner, holding_partner, arched_back, upper_body_focus",
|
||||
"lower_body": "pelvis_lifted, legs_spread_wide, knees_up, m-shape_legs, legs_wrapped_around_partner",
|
||||
"hands": "hands_on_back, hands_grabbing, clutching_bedsheets",
|
||||
"feet": "toes_curled, feet_up",
|
||||
"additional": "sweat, heart_symbol, motion_lines, messy_bed"
|
||||
},
|
||||
"participants": {
|
||||
"solo_focus": "true",
|
||||
"orientation": "MF"
|
||||
},
|
||||
"lora": {
|
||||
"lora_name": "Illustrious/Poses/Frog embrace position-IL_NAI_PY.safetensors",
|
||||
"lora_weight": 1.0,
|
||||
"lora_triggers": "Frog embrace position-IL_NAI_PY",
|
||||
"lora_weight_min": 1.0,
|
||||
"lora_weight_max": 1.0
|
||||
},
|
||||
"tags": {
|
||||
"participants": "1girl 1boy",
|
||||
"nsfw": true
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user