diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4f600ff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.png
+*.jpeg
+*.jpg
+.idea/
\ No newline at end of file
diff --git a/.junie/models/local-ollama.json b/.junie/models/local-ollama.json
new file mode 100644
index 0000000..cbf518a
--- /dev/null
+++ b/.junie/models/local-ollama.json
@@ -0,0 +1,13 @@
+{
+ "baseUrl": "http://localhost:11434/v1/responses",
+ "id": "qwen3-coder:30b",
+ "apiType": "OpenAIResponses",
+ "temperature": 0.3,
+ "primaryModel": {
+ "id": "qwen3-coder:30b",
+ "temperature": 0.3
+ },
+ "fasterModel": {
+ "id": "qwen2.5-coder:1.5b"
+ }
+}
diff --git a/.junie/models/local-qwen25.json b/.junie/models/local-qwen25.json
new file mode 100644
index 0000000..304bf22
--- /dev/null
+++ b/.junie/models/local-qwen25.json
@@ -0,0 +1,14 @@
+{
+ "baseUrl": "http://localhost:11434/v1/responses",
+ "id": "qwen25-coder-32b-64k:latest",
+ "apiType": "OpenAIResponses",
+ "temperature": 0.3,
+ "primaryModel": {
+ "id": "qwen25-coder-32b-64k:latest",
+ "temperature": 0.2
+ },
+ "fasterModel": {
+ "id": "qwen25-coder-32b-64k:latest",
+ "temperature": 0.2
+ }
+}
diff --git a/Modelfile.qwen25-coder-32b-64k b/Modelfile.qwen25-coder-32b-64k
new file mode 100644
index 0000000..f63e476
--- /dev/null
+++ b/Modelfile.qwen25-coder-32b-64k
@@ -0,0 +1,5 @@
+FROM qwen2.5-coder:32b
+
+PARAMETER num_ctx 64000
+PARAMETER temperature 0.15
+PARAMETER top_p 0.9
diff --git a/a6000-comfy/bootstrap.sh b/a6000-comfy/bootstrap.sh
new file mode 100755
index 0000000..21122a5
--- /dev/null
+++ b/a6000-comfy/bootstrap.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# One-time (idempotent) host setup for the Qwen-Image-Edit service on the CUDA box.
+# Runs as the service user (NO sudo). Safe to re-run: existing pieces are skipped.
+#
+# Builds, under $BASE (default ~/comfyui, outside the git repo):
+# venv/ CUDA torch + ComfyUI deps (RTX A6000 / sm_86)
+# ComfyUI/ latest master + ComfyUI-GGUF custom node
+# ComfyUI/models/{unet,text_encoders,vae}/ the v23 Q8 GGUF + encoder + vae
+#
+# CUDA lifts every MI50 workaround: no rocm wheel, no v0.3.77 pin (that pin only
+# existed because rocm-torch 2.3.1 lacks torch.library.custom_op), no lowvram.
+set -e
+
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+GGUF_NODE="$COMFY/custom_nodes/ComfyUI-GGUF"
+
+echo "[bootstrap] BASE=$BASE VENV=$VENV"
+mkdir -p "$BASE"
+
+# --- ComfyUI (latest) -------------------------------------------------------
+if [ ! -d "$COMFY/.git" ]; then
+ echo "[bootstrap] cloning ComfyUI (latest master) ..."
+ git clone --depth 1 https://github.com/comfyanonymous/ComfyUI.git "$COMFY"
+fi
+
+# --- venv + python deps -----------------------------------------------------
+# Build from the real system interpreter, NOT whatever venv is currently active.
+if [ ! -d "$VENV" ]; then
+ echo "[bootstrap] creating venv at $VENV ..."
+ /usr/bin/python3.13 -m venv "$VENV"
+fi
+source "$VENV/bin/activate"
+python -m pip install --upgrade pip wheel
+echo "[bootstrap] installing torch (CUDA cu124) ..."
+# torchaudio MUST come from the cu124 index too. Latest ComfyUI imports torchaudio
+# at startup (comfy/sd.py -> audio_vae); the PyPI default build links libcudart.so.13
+# (CUDA 13) and crashes against our cu124 torch. The matching +cu124 build fixes it.
+pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
+echo "[bootstrap] installing ComfyUI requirements ..."
+pip install -r "$COMFY/requirements.txt"
+# ComfyUI's requirements can re-pull a mismatched torchaudio from PyPI; re-pin it.
+pip install torchaudio --index-url https://download.pytorch.org/whl/cu124
+
+# --- ComfyUI-GGUF custom node ----------------------------------------------
+if [ ! -d "$GGUF_NODE" ]; then
+ echo "[bootstrap] cloning ComfyUI-GGUF ..."
+ git clone --depth 1 https://github.com/city96/ComfyUI-GGUF.git "$GGUF_NODE"
+fi
+pip install -r "$GGUF_NODE/requirements.txt" || pip install gguf
+
+# --- API deps ---------------------------------------------------------------
+pip install fastapi "uvicorn[standard]" websocket-client python-multipart pillow requests
+
+# --- models (resume-safe; skipped if already complete) ----------------------
+# Identical files/URLs to tour-comfy/bootstrap.sh.
+M="$COMFY/models"
+mkdir -p "$M/unet" "$M/text_encoders" "$M/vae"
+dl() { # url dest
+ if [ -s "$2" ]; then echo "[bootstrap] have $(basename "$2")"; return; fi
+ echo "[bootstrap] downloading $(basename "$2") ..."
+ wget -c -q --show-progress -O "$2" "$1"
+}
+dl "https://huggingface.co/Novice25/Qwen-Image-Edit-Rapid-AIO-GGUF/resolve/main/v23/Qwen-Rapid-NSFW-v23_Q8_0.gguf" \
+ "$M/unet/Qwen-Rapid-NSFW-v23_Q8_0.gguf"
+dl "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors" \
+ "$M/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors"
+dl "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors" \
+ "$M/vae/qwen_image_vae.safetensors"
+
+echo "[bootstrap] verifying torch + GPU ..."
+python -c "import torch; print('torch', torch.__version__, 'cuda', torch.cuda.is_available(), torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'NO GPU')"
+echo "[bootstrap] BOOTSTRAP_DONE"
diff --git a/a6000-comfy/deploy.sh b/a6000-comfy/deploy.sh
new file mode 100755
index 0000000..6f60f94
--- /dev/null
+++ b/a6000-comfy/deploy.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Install/refresh systemd services for Qwen-Image-Edit on the A6000 (CUDA) box.
+# Installs 3 services + 1 target; run with sudo.
+set -e
+
+if [[ $EUID -ne 0 ]]; then
+ echo "This script must be run as root (use sudo)"
+ exit 1
+fi
+
+A6K="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # a6000-comfy/
+REPO="$( cd "$A6K/.." && pwd )" # repo root
+TOUR="$REPO/tour-comfy"
+TEMPLATES="$A6K/systemd"
+
+SVC_USER="${SUDO_USER:-$(stat -c '%U' "$A6K")}"
+SVC_GROUP="$(id -gn "$SVC_USER")"
+
+echo "Installing services: user=$SVC_USER group=$SVC_GROUP"
+echo " a6k=$A6K"
+echo " tour=$TOUR"
+
+for unit in comfyui-backend comfyui-api comfyui-watcher; do
+ sed -e "s|__USER__|$SVC_USER|g" \
+ -e "s|__GROUP__|$SVC_GROUP|g" \
+ -e "s|__A6K__|$A6K|g" \
+ -e "s|__TOUR__|$TOUR|g" \
+ "$TEMPLATES/$unit.service" > "/etc/systemd/system/$unit.service"
+ echo " wrote /etc/systemd/system/$unit.service"
+done
+
+cp "$TEMPLATES/comfyui.target" /etc/systemd/system/comfyui.target
+echo " wrote /etc/systemd/system/comfyui.target"
+
+echo "Reloading systemd daemon..."
+systemctl daemon-reload
+
+echo "Enabling services + target..."
+systemctl enable comfyui-backend.service comfyui-api.service comfyui-watcher.service comfyui.target
+
+echo "Starting system..."
+systemctl start comfyui.target
+
+echo "Deployment complete."
+echo "Check status with: systemctl status comfyui.target comfyui-backend comfyui-api comfyui-watcher"
diff --git a/a6000-comfy/env.sh b/a6000-comfy/env.sh
new file mode 100755
index 0000000..7744622
--- /dev/null
+++ b/a6000-comfy/env.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Shared path resolver for the Qwen-Image-Edit service on the CUDA box (RTX A6000).
+# Sourced by bootstrap.sh / run_comfyui.sh / start_api.sh.
+#
+# Unlike tour-comfy/env.sh (which derives BASE from the script location and dodges
+# an NTFS venv), this box installs into a dedicated dir OUTSIDE the git repo so the
+# ~31GB model tree + ComfyUI checkout never land in `git status`. Override with
+# COMFY_BASE / COMFY_VENV if you want it elsewhere.
+
+ENV_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # repo/a6000-comfy
+BASE="${COMFY_BASE:-$HOME/comfyui}" # install root (ext4)
+COMFY="$BASE/ComfyUI"
+VENV="${COMFY_VENV:-$BASE/venv}"
+
+# The FastAPI service + workflow are backend-agnostic; reuse them from tour-comfy
+# (pure HTTP to ComfyUI on :8188 — nothing ROCm-specific in there).
+API_DIR="$( cd "$ENV_DIR/../tour-comfy" && pwd )"
diff --git a/a6000-comfy/run_comfyui.sh b/a6000-comfy/run_comfyui.sh
new file mode 100755
index 0000000..19ab4cf
--- /dev/null
+++ b/a6000-comfy/run_comfyui.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Launch the ComfyUI backend (headless) for the Qwen-Image-Edit API on the A6000.
+# CUDA / Ampere: none of the MI50 OOM workarounds are needed. The 46GB card holds
+# the 20B Q8 model + encoder + reference latents resident, so we skip --lowvram and
+# --use-split-cross-attention (both only existed to fit 32GB) -> faster.
+set -e
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+cd "$COMFY"
+source "$VENV/bin/activate"
+
+# --highvram keeps weights pinned on-GPU between requests (we have the headroom).
+exec python main.py \
+ --listen 127.0.0.1 \
+ --port 8188 \
+ --highvram \
+ "$@"
diff --git a/a6000-comfy/start_api.sh b/a6000-comfy/start_api.sh
new file mode 100755
index 0000000..7957419
--- /dev/null
+++ b/a6000-comfy/start_api.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Launch the FastAPI edit service (talks to the local ComfyUI on :8188).
+# Reuses tour-comfy/edit_api.py + workflow verbatim (they're backend-agnostic).
+set -e
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+source "$VENV/bin/activate"
+cd "$API_DIR"
+
+export COMFY_URL="http://127.0.0.1:8188"
+export HOST="0.0.0.0"
+export PORT="8500"
+# The A6000 is fast and not VRAM-bound on this model, so default to a full ~1MP
+# output budget (tour caps at 0.65MP to survive the MI50). Override via MAX_AREA.
+export MAX_AREA="${MAX_AREA:-1048576}"
+
+exec python edit_api.py
diff --git a/a6000-comfy/systemd/comfyui-api.service b/a6000-comfy/systemd/comfyui-api.service
new file mode 100644
index 0000000..af7684c
--- /dev/null
+++ b/a6000-comfy/systemd/comfyui-api.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Qwen-Image-Edit FastAPI (A6000)
+After=comfyui-backend.service
+Requires=comfyui-backend.service
+
+[Service]
+Type=simple
+User=__USER__
+Group=__GROUP__
+ExecStart=/bin/bash __A6K__/start_api.sh
+Restart=on-failure
+RestartSec=5
+StandardOutput=journal
+StandardError=journal
+
+[Install]
+WantedBy=comfyui.target
diff --git a/a6000-comfy/systemd/comfyui-backend.service b/a6000-comfy/systemd/comfyui-backend.service
new file mode 100644
index 0000000..f5149d5
--- /dev/null
+++ b/a6000-comfy/systemd/comfyui-backend.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=ComfyUI Backend (A6000 / CUDA)
+After=network.target
+
+[Service]
+Type=simple
+User=__USER__
+Group=__GROUP__
+ExecStart=/bin/bash __A6K__/run_comfyui.sh
+Restart=on-failure
+RestartSec=5
+StandardOutput=journal
+StandardError=journal
+
+[Install]
+WantedBy=comfyui.target
diff --git a/a6000-comfy/systemd/comfyui-watcher.service b/a6000-comfy/systemd/comfyui-watcher.service
new file mode 100644
index 0000000..c9ebf8a
--- /dev/null
+++ b/a6000-comfy/systemd/comfyui-watcher.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Qwen-Image-Edit Folder Watcher (A6000)
+After=comfyui-api.service
+Requires=comfyui-api.service
+
+[Service]
+Type=simple
+User=__USER__
+Group=__GROUP__
+ExecStart=/bin/bash __TOUR__/start_watcher.sh
+Restart=on-failure
+RestartSec=5
+StandardOutput=journal
+StandardError=journal
+
+[Install]
+WantedBy=comfyui.target
diff --git a/a6000-comfy/systemd/comfyui.target b/a6000-comfy/systemd/comfyui.target
new file mode 100644
index 0000000..127cb9a
--- /dev/null
+++ b/a6000-comfy/systemd/comfyui.target
@@ -0,0 +1,7 @@
+[Unit]
+Description=Qwen-Image-Edit Complete System (A6000)
+Wants=comfyui-backend.service comfyui-api.service comfyui-watcher.service
+After=comfyui-watcher.service
+
+[Install]
+WantedBy=multi-user.target
diff --git a/example.py b/example.py
new file mode 100644
index 0000000..7eb6f0b
--- /dev/null
+++ b/example.py
@@ -0,0 +1,23 @@
+def calculate_area(length, width):
+ """
+ Calculate the area of a rectangle.
+
+ Args:
+ length (float): The length of the rectangle
+ width (float): The width of the rectangle
+
+ Returns:
+ float: The area of the rectangle
+ """
+ if length <= 0 or width <= 0:
+ raise ValueError("Length and width must be positive numbers")
+
+ return length * width
+
+# Example usage
+if __name__ == "__main__":
+ try:
+ area = calculate_area(5, 3)
+ print(f"The area is: {area}")
+ except ValueError as e:
+ print(f"Error: {e}")
\ No newline at end of file
diff --git a/tour-comfy/README.md b/tour-comfy/README.md
index 818bf90..6bd29aa 100644
--- a/tour-comfy/README.md
+++ b/tour-comfy/README.md
@@ -59,7 +59,16 @@ Compute-bound — the 20.8GB unet stays resident; only the text encoder swaps.
- The audio custom-node import errors in the ComfyUI log (`libcudart.so.13`) are
harmless — a CUDA `torchaudio` got pulled in; image editing doesn't use it.
-## Manage (systemd)
+## Manage (local machine)
+From this machine, use the `deploy_api.sh` script:
+```bash
+cd tour-comfy
+./deploy_api.sh deploy tour # sync files and (re)start services
+./deploy_api.sh stop tour # stop and disable services
+./deploy_api.sh status tour # check service status and logs
+```
+
+## Manage (on `tour`)
```bash
sudo bash /media/tour/APPS/comfyui/api/deploy.sh # (re)install and start services
sudo bash /media/tour/APPS/comfyui/api/stop.sh # stop and disable services
diff --git a/tour-comfy/bootstrap.sh b/tour-comfy/bootstrap.sh
new file mode 100755
index 0000000..8853be9
--- /dev/null
+++ b/tour-comfy/bootstrap.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+# One-time (idempotent) host setup for the Qwen-Image-Edit service.
+# Runs as the service user (NO sudo). Safe to re-run: existing pieces are skipped.
+#
+# Builds, under the project BASE (the parent of this api/ dir):
+# venv/ torch 2.3.1+rocm5.7 + ComfyUI deps (gfx906 / ROCm 5.7)
+# ComfyUI/ pinned to v0.3.77 + ComfyUI-GGUF custom node
+# ComfyUI/models/{unet,text_encoders,vae}/ the v23 Q8 GGUF + encoder + vae
+set -e
+
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+GGUF_NODE="$COMFY/custom_nodes/ComfyUI-GGUF"
+COMFY_TAG="v0.3.77" # newest tag that runs on torch 2.3.1 (no comfy_kitchen)
+
+echo "[bootstrap] BASE=$BASE VENV=$VENV"
+
+# --- ComfyUI (pinned) -------------------------------------------------------
+if [ ! -d "$COMFY/.git" ]; then
+ echo "[bootstrap] cloning ComfyUI @ $COMFY_TAG ..."
+ git clone --depth 1 --branch "$COMFY_TAG" \
+ https://github.com/comfyanonymous/ComfyUI.git "$COMFY"
+fi
+
+# --- venv + python deps -----------------------------------------------------
+if [ ! -d "$VENV" ]; then
+ echo "[bootstrap] creating venv at $VENV ..."
+ python3 -m venv "$VENV"
+fi
+source "$VENV/bin/activate"
+python -m pip install --upgrade pip wheel
+echo "[bootstrap] installing torch (rocm5.7) ..."
+pip install torch==2.3.1+rocm5.7 torchvision==0.18.1+rocm5.7 \
+ --index-url https://download.pytorch.org/whl/rocm5.7
+echo "[bootstrap] installing ComfyUI requirements ..."
+pip install -r "$COMFY/requirements.txt"
+
+# --- ComfyUI-GGUF custom node ----------------------------------------------
+if [ ! -d "$GGUF_NODE" ]; then
+ echo "[bootstrap] cloning ComfyUI-GGUF ..."
+ git clone --depth 1 https://github.com/city96/ComfyUI-GGUF.git "$GGUF_NODE"
+fi
+pip install -r "$GGUF_NODE/requirements.txt" || pip install gguf
+
+# --- API deps ---------------------------------------------------------------
+pip install fastapi "uvicorn[standard]" websocket-client python-multipart pillow requests
+
+# --- models (resume-safe; skipped if already complete) ----------------------
+M="$COMFY/models"
+mkdir -p "$M/unet" "$M/text_encoders" "$M/vae"
+dl() { # url dest
+ if [ -s "$2" ]; then echo "[bootstrap] have $(basename "$2")"; return; fi
+ echo "[bootstrap] downloading $(basename "$2") ..."
+ wget -c -q -O "$2" "$1"
+}
+dl "https://huggingface.co/Novice25/Qwen-Image-Edit-Rapid-AIO-GGUF/resolve/main/v23/Qwen-Rapid-NSFW-v23_Q8_0.gguf" \
+ "$M/unet/Qwen-Rapid-NSFW-v23_Q8_0.gguf"
+dl "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors" \
+ "$M/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors"
+dl "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors" \
+ "$M/vae/qwen_image_vae.safetensors"
+
+echo "[bootstrap] verifying torch + GPU ..."
+python -c "import torch; print('torch', torch.__version__, 'cuda', torch.cuda.is_available(), torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'NO GPU')"
+echo "[bootstrap] BOOTSTRAP_DONE"
diff --git a/tour-comfy/config.json b/tour-comfy/config.json
new file mode 100644
index 0000000..a8553c5
--- /dev/null
+++ b/tour-comfy/config.json
@@ -0,0 +1,15 @@
+{
+ "api_url": "http://127.0.0.1:8500/edit",
+ "prompt": "high quality, detailed, female nude",
+ "seed": -1,
+ "max_area": 655360,
+ "margin": 10,
+ "top_margin": 20,
+ "headroom": 0.05,
+ "poll_interval": 2,
+ "stage_dir": "./tour-comfy/stage",
+ "output_dir": "./tour-comfy/output",
+ "failed_dir": "./tour-comfy/failed",
+ "processed_file": "./tour-comfy/processed.json",
+ "log_file": "./tour-comfy/watcher.log"
+}
diff --git a/tour-comfy/deploy.sh b/tour-comfy/deploy.sh
index 94a5410..0db3fbc 100755
--- a/tour-comfy/deploy.sh
+++ b/tour-comfy/deploy.sh
@@ -1,30 +1,41 @@
#!/bin/bash
-# Deploy systemd services for Qwen-Image-Edit
+# Install/refresh the systemd services for Qwen-Image-Edit on THIS host.
+# Host-agnostic: the service user, group and install path are derived at run
+# time, so the same file works on tour, hubby, etc.
+#
+# Run with sudo (needs to write /etc/systemd/system). Assumes bootstrap.sh has
+# already created venv/, ComfyUI/ and the models under BASE.
set -e
-# Must be run with sudo to copy to /etc/systemd/system
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root (use sudo)"
exit 1
fi
-SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-SYSTEMD_DIR="$SCRIPT_DIR/systemd"
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # .../comfyui/api
+BASE="$( cd "$SCRIPT_DIR/.." && pwd )" # .../comfyui
+TEMPLATES="$SCRIPT_DIR/systemd"
-echo "Copying service files..."
-cp "$SYSTEMD_DIR/comfyui-backend.service" /etc/systemd/system/
-cp "$SYSTEMD_DIR/comfyui-api.service" /etc/systemd/system/
+# The service should run as the owner of the project, not root.
+SVC_USER="${SUDO_USER:-$(stat -c '%U' "$SCRIPT_DIR")}"
+SVC_GROUP="$(id -gn "$SVC_USER")"
+
+echo "Installing services: user=$SVC_USER group=$SVC_GROUP base=$BASE"
+
+for unit in comfyui-backend comfyui-api; do
+ sed -e "s|__USER__|$SVC_USER|g" \
+ -e "s|__GROUP__|$SVC_GROUP|g" \
+ -e "s|__BASE__|$BASE|g" \
+ "$TEMPLATES/$unit.service" > "/etc/systemd/system/$unit.service"
+ echo " wrote /etc/systemd/system/$unit.service"
+done
echo "Reloading systemd daemon..."
systemctl daemon-reload
-echo "Enabling services..."
-systemctl enable comfyui-backend.service
-systemctl enable comfyui-api.service
-
-echo "Starting services..."
-systemctl restart comfyui-backend.service
-systemctl restart comfyui-api.service
+echo "Enabling + (re)starting services..."
+systemctl enable comfyui-backend.service comfyui-api.service
+systemctl restart comfyui-backend.service comfyui-api.service
echo "Deployment complete."
echo "Check status with: systemctl status comfyui-backend comfyui-api"
diff --git a/tour-comfy/deploy_api.sh b/tour-comfy/deploy_api.sh
new file mode 100755
index 0000000..feec6e3
--- /dev/null
+++ b/tour-comfy/deploy_api.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+# Deploy/stop/restart/status tour-comfy project on the tour machine.
+#
+# Usage:
+# ./deploy_api.sh
+# ./deploy_api.sh deploy tour|hubby|all
+# ./deploy_api.sh stop tour|hubby|all
+# ./deploy_api.sh restart tour|hubby|all
+# ./deploy_api.sh status tour|hubby|all
+
+set -euo pipefail
+
+SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
+
+ACTION="${1:-deploy}"
+TARGET="${2:-tour}"
+
+REMOTES=()
+
+TOUR_SPEC="tour@192.168.1.160:/media/tour/APPS/comfyui/api"
+HUBBY_SPEC="hubby@192.168.1.171:/home/hubby/comfyui/api"
+
+case "$TARGET" in
+ tour) REMOTES=("$TOUR_SPEC") ;;
+ hubby) REMOTES=("$HUBBY_SPEC") ;;
+ all) REMOTES=("$TOUR_SPEC" "$HUBBY_SPEC") ;;
+ *)
+ echo "Usage: $0 [deploy|stop|restart|status] [tour|hubby|all]"
+ exit 1
+ ;;
+esac
+
+print_header() {
+ local title="$1"
+
+ echo
+ echo "============================================================"
+ echo "$title"
+ echo "============================================================"
+}
+
+stop_one() {
+ local REMOTE_SPEC="$1"
+ local REMOTE="${REMOTE_SPEC%%:*}"
+ local REMOTE_DIR="${REMOTE_SPEC##*:}"
+
+ print_header "Stopping services on $REMOTE"
+
+ ssh "$REMOTE" "sudo bash $REMOTE_DIR/stop.sh"
+}
+
+deploy_one() {
+ local REMOTE_SPEC="$1"
+ local REMOTE="${REMOTE_SPEC%%:*}"
+ local REMOTE_DIR="${REMOTE_SPEC##*:}"
+
+ print_header "Deploying to $REMOTE"
+
+ echo "==> Creating remote directory..."
+ ssh "$REMOTE" "mkdir -p $REMOTE_DIR"
+
+ echo "==> Syncing project files..."
+ # Ship code + config only; never the local test images, watcher data dirs,
+ # logs, or runtime state.
+ rsync -avz \
+ --exclude 'deploy_api.sh' \
+ --exclude '*.png' \
+ --exclude '*.log' \
+ --exclude 'processed.json' \
+ --exclude 'stage/' --exclude 'out/' --exclude 'output/' --exclude 'failed/' \
+ --exclude '__pycache__/' --exclude '*.pyc' --exclude '*.tmp' \
+ "$SCRIPT_DIR/" "$REMOTE:$REMOTE_DIR/"
+
+ echo "==> Bootstrapping host (venv/ComfyUI/models; idempotent — first run downloads ~31GB)..."
+ ssh "$REMOTE" "bash $REMOTE_DIR/bootstrap.sh"
+
+ echo "==> Installing/refreshing systemd services..."
+ ssh "$REMOTE" "sudo bash $REMOTE_DIR/deploy.sh"
+
+ echo "==> Waiting for API startup (port 8500)..."
+
+ for i in {1..60}; do
+ if ssh "$REMOTE" "curl -fsS http://localhost:8500/health >/dev/null 2>&1"; then
+ echo "==> API is ready"
+ break
+ fi
+
+ if [ "$i" -eq 60 ]; then
+ echo
+ echo "ERROR: API failed to become healthy on $REMOTE"
+ echo
+ echo "Check logs with: ssh $REMOTE 'journalctl -u comfyui-api -n 50'"
+ exit 1
+ fi
+
+ sleep 2
+ done
+
+ echo
+ echo "==> Health check:"
+ ssh "$REMOTE" "curl -s http://localhost:8500/health | python3 -m json.tool"
+
+ echo
+ echo "==> Service Status:"
+ ssh "$REMOTE" "systemctl status comfyui-backend comfyui-api --no-pager || true"
+}
+
+status_one() {
+ local REMOTE_SPEC="$1"
+ local REMOTE="${REMOTE_SPEC%%:*}"
+ local REMOTE_DIR="${REMOTE_SPEC##*:}"
+
+ print_header "Status on $REMOTE"
+
+ ssh "$REMOTE" "
+ echo '==> Systemd Services:'
+ systemctl status comfyui-backend comfyui-api --no-pager || true
+
+ echo
+ echo '==> Health (8500):'
+ curl -fsS http://localhost:8500/health 2>/dev/null | python3 -m json.tool || echo 'not healthy'
+
+ echo
+ echo '==> Last 10 backend logs:'
+ journalctl -u comfyui-backend -n 10 --no-pager
+
+ echo
+ echo '==> Last 10 API logs:'
+ journalctl -u comfyui-api -n 10 --no-pager
+ "
+}
+
+case "$ACTION" in
+ deploy)
+ for REMOTE in "${REMOTES[@]}"; do
+ deploy_one "$REMOTE"
+ done
+ echo
+ echo "All deployments completed successfully."
+ ;;
+
+ stop)
+ for REMOTE in "${REMOTES[@]}"; do
+ stop_one "$REMOTE"
+ done
+ echo
+ echo "All services stopped."
+ ;;
+
+ restart)
+ for REMOTE in "${REMOTES[@]}"; do
+ # deploy_one already handles restart via deploy.sh
+ deploy_one "$REMOTE"
+ done
+ echo
+ echo "All services restarted successfully."
+ ;;
+
+ status)
+ for REMOTE in "${REMOTES[@]}"; do
+ status_one "$REMOTE"
+ done
+ ;;
+
+ *)
+ echo "Usage: $0 [deploy|stop|restart|status] [tour|hubby|all]"
+ exit 1
+ ;;
+esac
\ No newline at end of file
diff --git a/tour-comfy/edit_api.py b/tour-comfy/edit_api.py
index 50a8625..041ed56 100644
--- a/tour-comfy/edit_api.py
+++ b/tour-comfy/edit_api.py
@@ -15,13 +15,17 @@ import time
import uuid
import random
import copy
+import threading
import requests
from PIL import Image
from fastapi import FastAPI, UploadFile, File, Form, HTTPException
+from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
+from pydantic import BaseModel
# --- config -----------------------------------------------------------------
+CONFIG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.json")
COMFY = os.environ.get("COMFY_URL", "http://127.0.0.1:8188").rstrip("/")
WORKFLOW_PATH = os.environ.get(
"WORKFLOW_PATH",
@@ -45,6 +49,12 @@ with open(WORKFLOW_PATH, "r", encoding="utf-8") as f:
BASE_WORKFLOW = json.load(f)
app = FastAPI(title="Qwen-Image-Edit Rapid-AIO API", version="1.0")
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=["*"],
+ allow_methods=["GET", "POST"],
+ allow_headers=["*"],
+)
# --- helpers ----------------------------------------------------------------
@@ -58,6 +68,41 @@ def _target_size(w: int, h: int, max_area: int) -> tuple[int, int]:
return _round16(w * scale), _round16(h * scale)
+def _prep_image(pil: Image.Image, max_area: int) -> tuple[Image.Image, int, int]:
+ """
+ Prepare image for ComfyUI:
+ 1. If area > max_area, crop from bottom if height remains >= 256.
+ 2. Otherwise scale (up or down) to fit area while preserving aspect.
+ 3. Ensure dimensions are rounded to 16.
+ """
+ w, h = pil.width, pil.height
+ if w * h > max_area:
+ # Try to keep width and crop height from bottom
+ rw = _round16(w)
+ th = max_area // rw
+ if th >= 256:
+ rh = (th // 16) * 16
+ if rh < 16: rh = 16
+
+ # To avoid black bars from .crop((0,0,rw,rh)) when rw > w,
+ # we crop to original w first, then resize to rw.
+ pil = pil.crop((0, 0, w, min(h, (rh * w) // rw)))
+ pil = pil.resize((rw, rh), resample=Image.LANCZOS)
+ return pil, rw, rh
+ else:
+ # Too wide to keep width and have decent height, scale both down
+ rw, rh = _target_size(w, h, max_area)
+ pil = pil.resize((rw, rh), resample=Image.LANCZOS)
+ return pil, rw, rh
+ else:
+ # Fits or is too small: scale UP to match the max_area budget
+ # (Legacy behavior that gives better model performance)
+ rw, rh = _target_size(w, h, max_area)
+ if rw != w or rh != h:
+ pil = pil.resize((rw, rh), resample=Image.LANCZOS)
+ return pil, rw, rh
+
+
def _comfy_upload(img_bytes: bytes, filename: str) -> str:
"""Upload an image to ComfyUI's input dir; return the stored name."""
r = requests.post(
@@ -122,7 +167,122 @@ def _comfy_fetch_image(outputs: dict) -> bytes:
return r.content
+# --- pipeline helper ---------------------------------------------------------
+
+def _run_pipeline(
+ pil: Image.Image,
+ prompt: str,
+ seed: int = -1,
+ max_area: int = 0,
+ steps: int = 4,
+ cfg: float = 1.0,
+ sampler_name: str = "euler_ancestral",
+ scheduler: str = "beta",
+) -> bytes:
+ area = max_area if max_area > 0 else MAX_AREA
+ pil, w, h = _prep_image(pil, area)
+ buf = io.BytesIO()
+ pil.save(buf, format="PNG")
+ stored = _comfy_upload(buf.getvalue(), f"in_{uuid.uuid4().hex[:8]}.png")
+ if seed is None or seed < 0:
+ seed = random.randint(0, MAX_SEED)
+ graph = copy.deepcopy(BASE_WORKFLOW)
+ graph[NODE_LOADIMAGE]["inputs"]["image"] = stored
+ graph[NODE_POSITIVE]["inputs"]["prompt"] = prompt
+ graph[NODE_LATENT]["inputs"]["width"] = w
+ graph[NODE_LATENT]["inputs"]["height"] = h
+ ks = graph[NODE_KSAMPLER]["inputs"]
+ ks.update(seed=seed, steps=steps, cfg=cfg, sampler_name=sampler_name, scheduler=scheduler)
+ client_id = uuid.uuid4().hex
+ prompt_id = _comfy_queue(graph, client_id)
+ outputs = _comfy_wait(prompt_id, time.time() + GEN_TIMEOUT)
+ return _comfy_fetch_image(outputs)
+
+
+# --- batch state -------------------------------------------------------------
+
+jobs: dict[str, dict] = {}
+
+
+def _load_output_dir() -> str:
+ with open(CONFIG_PATH, "r") as f:
+ conf = json.load(f)
+ d = conf["output_dir"]
+ if not os.path.isabs(d):
+ d = os.path.normpath(os.path.join(os.path.dirname(CONFIG_PATH), "..", d))
+ return d
+
+
+def _batch_worker(job_id: str, filenames: list, prompt: str, seed: int, max_area: int):
+ output_dir = _load_output_dir()
+ for fname in filenames:
+ fpath = os.path.join(output_dir, fname)
+ try:
+ pil = Image.open(fpath).convert("RGB")
+ png = _run_pipeline(pil, prompt, seed, max_area)
+ ts = time.strftime("%Y%m%d_%H%M%S")
+ out_name = f"{ts}_{fname}"
+ with open(os.path.join(output_dir, out_name), "wb") as f:
+ f.write(png)
+ jobs[job_id]["done"] += 1
+ except Exception as e:
+ jobs[job_id]["failed"] += 1
+ jobs[job_id]["status"] = "done"
+
+
# --- routes -----------------------------------------------------------------
+
+class ConfigUpdate(BaseModel):
+ prompt: str | None = None
+ seed: int | None = None
+
+
+@app.get("/config")
+def get_config():
+ with open(CONFIG_PATH, "r") as f:
+ return json.load(f)
+
+
+@app.post("/config")
+def update_config(update: ConfigUpdate):
+ with open(CONFIG_PATH, "r") as f:
+ conf = json.load(f)
+ if update.prompt is not None:
+ conf["prompt"] = update.prompt
+ if update.seed is not None:
+ conf["seed"] = update.seed
+ with open(CONFIG_PATH, "w") as f:
+ json.dump(conf, f, indent=2)
+ return {"prompt": conf["prompt"], "seed": conf["seed"]}
+
+
+class BatchRequest(BaseModel):
+ filenames: list[str]
+ prompt: str
+ seed: int = -1
+ max_area: int = 0
+
+
+@app.post("/batch")
+def start_batch(req: BatchRequest):
+ job_id = uuid.uuid4().hex[:8]
+ jobs[job_id] = {"status": "running", "total": len(req.filenames), "done": 0, "failed": 0}
+ t = threading.Thread(
+ target=_batch_worker,
+ args=(job_id, req.filenames, req.prompt, req.seed, req.max_area),
+ daemon=True,
+ )
+ t.start()
+ return {"job_id": job_id, "total": len(req.filenames)}
+
+
+@app.get("/batch/{job_id}")
+def get_batch(job_id: str):
+ if job_id not in jobs:
+ raise HTTPException(404, "Job not found")
+ return jobs[job_id]
+
+
@app.get("/health")
def health():
try:
@@ -149,40 +309,8 @@ async def edit(
except Exception as e:
raise HTTPException(400, f"Invalid image: {e}")
- area = max_area if max_area > 0 else MAX_AREA
- w, h = _target_size(pil.width, pil.height, area)
-
- buf = io.BytesIO()
- pil.save(buf, format="PNG")
- stored = _comfy_upload(buf.getvalue(), f"in_{uuid.uuid4().hex[:8]}.png")
-
- if seed is None or seed < 0:
- seed = random.randint(0, MAX_SEED)
-
- graph = copy.deepcopy(BASE_WORKFLOW)
- graph[NODE_LOADIMAGE]["inputs"]["image"] = stored
- graph[NODE_POSITIVE]["inputs"]["prompt"] = prompt
- graph[NODE_LATENT]["inputs"]["width"] = w
- graph[NODE_LATENT]["inputs"]["height"] = h
- ks = graph[NODE_KSAMPLER]["inputs"]
- ks.update(seed=seed, steps=steps, cfg=cfg,
- sampler_name=sampler_name, scheduler=scheduler)
-
- client_id = uuid.uuid4().hex
- prompt_id = _comfy_queue(graph, client_id)
- outputs = _comfy_wait(prompt_id, time.time() + GEN_TIMEOUT)
- png = _comfy_fetch_image(outputs)
-
- return Response(
- content=png,
- media_type="image/png",
- headers={
- "X-Seed": str(seed),
- "X-Width": str(w),
- "X-Height": str(h),
- "X-Prompt-Id": prompt_id,
- },
- )
+ png = _run_pipeline(pil, prompt, seed, max_area, steps, cfg, sampler_name, scheduler)
+ return Response(content=png, media_type="image/png")
if __name__ == "__main__":
diff --git a/tour-comfy/env.sh b/tour-comfy/env.sh
new file mode 100644
index 0000000..c0fdd8a
--- /dev/null
+++ b/tour-comfy/env.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+# Shared path resolver for the Qwen-Image-Edit service scripts.
+# Sourced by bootstrap.sh / run_comfyui.sh / start_api.sh.
+#
+# Why this exists: a Python venv CANNOT live on the NTFS (fuseblk) mount used
+# on tour (/media/tour/APPS). Its interpreter symlinks turn into
+# "unsupported reparse tag 0x..." after a reboot/remount, so `python`
+# vanishes and every service dies. ComfyUI code and the model files are plain
+# files and are fine on NTFS -- only the venv must be on a native fs.
+#
+# So: if BASE is on a non-native filesystem, the venv goes under $HOME (ext4);
+# otherwise it stays at $BASE/venv. Override explicitly with COMFY_VENV.
+
+ENV_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # .../comfyui/api
+API_DIR="$ENV_DIR"
+BASE="$( cd "$ENV_DIR/.." && pwd )" # .../comfyui
+COMFY="$BASE/ComfyUI"
+
+_basefs="$(stat -f -c %T "$BASE" 2>/dev/null || echo unknown)"
+case "$_basefs" in
+ fuseblk|ntfs|ntfs3|exfat|vfat|msdos|9p|cifs|smb*)
+ VENV="${COMFY_VENV:-$HOME/comfyui-venv}" ;; # NTFS-ish BASE -> venv on home
+ *)
+ VENV="${COMFY_VENV:-$BASE/venv}" ;; # native fs -> venv beside code
+esac
diff --git a/tour-comfy/output/car.html b/tour-comfy/output/car.html
new file mode 100644
index 0000000..1097258
--- /dev/null
+++ b/tour-comfy/output/car.html
@@ -0,0 +1,931 @@
+
+
+
+
+
+ Live Image Monitor
+
+
+
+
+
+
+
+
+
No images found
+
Place this HTML file in your image folder, or configure the path below.
+
+
+
+
+
+
+
0 selected
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tour-comfy/processed.json b/tour-comfy/processed.json
new file mode 100644
index 0000000..d5f3f06
--- /dev/null
+++ b/tour-comfy/processed.json
@@ -0,0 +1,108 @@
+{
+ "img_2.png": "2a721fdedc31f4ee11fd7c8ab85a4b33",
+ "img_19.png": "82660461b10e0545165fe8dade87d4d2",
+ "img.png": "6023644b2237fe301e43431e28a9d2e9",
+ "img_4.png": "3c87ca4219c2ed6f275c044fa888afc0",
+ "img_3.png": "3c87ca4219c2ed6f275c044fa888afc0",
+ "img_5.png": "3c87ca4219c2ed6f275c044fa888afc0",
+ "imgxx.png": "861b244b0aa205b8fdff4015a128a5a4",
+ "img_1.png": "4c09437df56a8beb2a620f420a4d4d5a",
+ "img_6.png": "7ad3913d8fea47ea120a8e958dd2fc62",
+ "img_7.png": "2ad545906c6b99cac1a78305a37a5eed",
+ "img_8.png": "4c453e8e332e92478bf0d49e663dedc9",
+ "img_9.png": "7e35f295100f51a9a58533c8d1f1fc80",
+ "test_timestamp.png": "d41b2ed22d4562d6aa0b7dd2248f18a2",
+ "img_91.png": "7e35f295100f51a9a58533c8d1f1fc80",
+ "test.png": "e569b50c015080e05e36f21307550e1a",
+ "img_19_2.png": "e745ea158afbf416df6c53835c11f4c7",
+ "img_93.png": "ab83477ac7782d7a7b38369ccfa7df80",
+ "img_92.png": "7e35f295100f51a9a58533c8d1f1fc80",
+ "imgxxx.png": "8965337a6abd7bfec6cb774978b4198b",
+ "img_10.png": "10635b82a1cfcefb2c97af2ebd61d889",
+ "img_12.png": "3b126df55d41bb48829650a766e3c6f3",
+ "img_11.png": "c5e036773ead71f40a1f1966f74abc2b",
+ "other.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
+ "others.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
+ "img_6v1.png": "7ad3913d8fea47ea120a8e958dd2fc62",
+ "image.png": "7ad3913d8fea47ea120a8e958dd2fc62",
+ "test123.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
+ "img_13.png": "5fb9fc29ca1d32c4ab6816160fcfdfe1",
+ "img_14.png": "759b2e7532f7bf3a0d956a7f1c4cb7af",
+ "img_15.png": "cbd90cb2e2edf2e4eff746c586657ad5",
+ "img_16.png": "9c76b232aacf1f18739b323f5b6887d7",
+ "img_17.png": "9955e08008340d6b2acd945cc4d9505a",
+ "img_18.png": "5a50839c5d5a726b5b0e770bb266f6d6",
+ "img_20.png": "29d28ef9f53d71c066798c46341d30a9",
+ "img_run.png": "72ddfe64a1cea5611ea61425f4f61fd2",
+ "img_21.png": "82660461b10e0545165fe8dade87d4d2",
+ "img_22.png": "4c9adb619b5f191d9b76d1493df211c6",
+ "img_23.png": "2ab193e0c19cec124764f9f54383ef2d",
+ "img_24.png": "942d5409a0e4c70b4f960bc6468269e2",
+ "imgxxxx.png": "8965337a6abd7bfec6cb774978b4198b",
+ "img_25.png": "1d51cc605017423c0ae114f0b883bfea",
+ "img_26.png": "23ef7f416f21ca3d5d237ecfdc88833e",
+ "img_27.png": "9bb13a4ca7292c964fedd91065af64a0",
+ "img_28.png": "37a7ac25c45ec63a87e04c9fe3b73aab",
+ "img_29.png": "5ed1e8acd413beb7165da9880d6b052d",
+ "img_30.png": "d907cf83d022af0545b55842f2573581",
+ "img_31.png": "312874252c58cbb89c8cad46bc17e7e7",
+ "img_32.png": "4d5ca98a255d51d5775725136f13a162",
+ "img_34.png": "c5f814c539acc7cdef0da3279544e55f",
+ "img_33.png": "c5f814c539acc7cdef0da3279544e55f",
+ "img_37.png": "fefa5a1bb755fb0d4f03d966ac04dae3",
+ "img_35.png": "ed1e95446696a97f46d84b246d01e0f7",
+ "img_36.png": "ed1e95446696a97f46d84b246d01e0f7",
+ "img_38.png": "dad813a6e3e919454ba1ff0fb3f8df22",
+ "img_39.png": "732cda29c3f658a9847239d23cbe759b",
+ "img_40.png": "6022fd6b8a4580ef4451c3c87e469b85",
+ "img_42.png": "a4578fb780c2424581d72c862e14af6c",
+ "img_41.png": "8871248c6da117c9b4318bcc6942c17a",
+ "img_45.png": "2329402c6d8c5b7555a7432eb1aeccd9",
+ "img_43.png": "e1d75f3326dd89c39fa91b9aaa0b54f9",
+ "img_44.png": "6196e5ba2bb6fb46459c44543e0eeb64",
+ "img_46.png": "3c73192c04ca22cc4ecb450565315798",
+ "img_47.png": "2fb600fb8f3717bd79a9f56fa32efb0b",
+ "20150913_211324.jpg": "bb75b92835207e81287a392f17f88eaf",
+ "20160903_200935.jpg": "1cf5a582c8a40610640898ebaee2ade3",
+ "20160903_200728.jpg": "7c93ad8f71045b07aeb390e0c906d5f2",
+ "img_49.png": "bd72afa8e00ffff04dc8e860af058d0d",
+ "img_48.png": "b6daebc286bc1c22a586ee1233c5b420",
+ "img_50.png": "6f8b764e0973cb5c34b0c02f79b202ca",
+ "img_51.png": "851612780583d06942c119b2c99b7b06",
+ "img_52.png": "935946efb74fc333f41146691a61cc8f",
+ "img_57.png": "514f89464e3c79bba7928b69ed01650e",
+ "img_53.png": "ce7e90270592666da95b0c638d10d745",
+ "img_58.png": "4fae0cf0017c9be9a550792167d60ce3",
+ "img_54.png": "0d70e4782c2823f2f8d2b4c149a38e0b",
+ "img_55.png": "ce7e90270592666da95b0c638d10d745",
+ "img_56.png": "1501a3128f19392124e727121a8f2bd4",
+ "img_59.png": "4fae0cf0017c9be9a550792167d60ce3",
+ "img_60.png": "2c31cb016cad120daaf4e441a720a56c",
+ "img_61.png": "68b1c7a9596ab2f0ff038bb585d7c4d4",
+ "img_62.png": "c2c444a31001421a69dbc9ecf8588149",
+ "img_64.png": "d5b235b57e6ec07e790f35b9cda399fb",
+ "img_63.png": "b454d1869a8fc62ed1dc988467b541db",
+ "img_66.png": "59e227fc6b06a2cd27659a9facf43c0d",
+ "img_65.png": "c442724f5a29468eed4e9563e25e06e8",
+ "img_68.png": "4c7fbe72509ab5b08ccdab726b5ff035",
+ "img_67.png": "1970b9952e14688c22f8f54ea7d7b4ec",
+ "img_69.png": "0bcf667d5603a157159052baddbb6e50",
+ "img_70.png": "0bcf667d5603a157159052baddbb6e50",
+ "img_71.png": "b3e79f4ff2882360b24f77a295f16650",
+ "img_72.png": "ebd8cd52977b7fccc6ecff7ee2f392b5",
+ "img_73.png": "28c91d6bc883ed6de89b62755d5417b9",
+ "img_74.png": "b7c41d0f4c062cc7d7da240173a1f075",
+ "img_75.png": "7b405fc4a4e022a272e5f09c7c485712",
+ "img_76.png": "29b9c219a777155d576b9f35a3f41cca",
+ "img_77.png": "6db31602d0ed36abc2d92a88fdcc21b0",
+ "img_78.png": "15e83866d2f2afb2ee1e8d2a06a70b9d",
+ "img_79.png": "ab18eb4ce243db0f81f608d744596885",
+ "img_80.png": "de8dfcb0d6eeda8187783e8417f04b8b",
+ "img_81.png": "072948a36c4ba79f4e761a9491f3d8eb",
+ "img_82.png": "724fcb641da5f3294aa800ce0a9b93e4",
+ "img_84.png": "f5dea766c46abfa4011c23d3c466d8dc",
+ "img_85.png": "f48059d59efd33ec8cce4daa44bbd46d",
+ "img_83.png": "501207e02d72776b65d705db9f28a179",
+ "img_86.png": "9e831c994a69ee1e18a6d279d69c072f",
+ "img_87.png": "4ce165b53df962d9e371124bfdec64bd"
+}
\ No newline at end of file
diff --git a/tour-comfy/run_comfyui.sh b/tour-comfy/run_comfyui.sh
old mode 100644
new mode 100755
index 536bf01..5134c49
--- a/tour-comfy/run_comfyui.sh
+++ b/tour-comfy/run_comfyui.sh
@@ -2,18 +2,22 @@
# Launch the ComfyUI backend (headless) for the Qwen-Image-Edit API.
# gfx906 (MI50) has no flash-attention, so use the pytorch cross-attention path.
set -e
-BASE=/media/tour/APPS/comfyui
-cd "$BASE/ComfyUI"
-source "$BASE/venv/bin/activate"
+# env.sh resolves BASE/COMFY/VENV (and keeps the venv off NTFS). Portable
+# across hosts (tour: /media/tour/APPS/comfyui, hubby: /home/hubby/comfyui).
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+cd "$COMFY"
+source "$VENV/bin/activate"
# MI50 / Vega20 is happiest in fp16; avoid bf16 emulation.
-export PYTORCH_HIP_ALLOC_CONF=expandable_segments:True
+export PYTORCH_HIP_ALLOC_CONF="expandable_segments:True,garbage_collection_threshold:0.8"
export HSA_ENABLE_SDMA=0
# Split cross-attention chunks the attention matmul -> much lower peak VRAM,
# which is what lets the 20B Q8 edit model + reference-image sequence fit in 32GB.
+# --lowvram offloads models to CPU RAM when not in use, preventing OOM.
exec python main.py \
--listen 127.0.0.1 \
--port 8188 \
--use-split-cross-attention \
+ --lowvram \
"$@"
diff --git a/tour-comfy/start_api.sh b/tour-comfy/start_api.sh
old mode 100644
new mode 100755
index cc1bc1e..963bea9
--- a/tour-comfy/start_api.sh
+++ b/tour-comfy/start_api.sh
@@ -1,9 +1,10 @@
#!/bin/bash
# Launch the FastAPI edit service (talks to the local ComfyUI on :8188).
set -e
-BASE=/media/tour/APPS/comfyui
-source "$BASE/venv/bin/activate"
-cd "$BASE/api"
+# env.sh resolves API_DIR/VENV (and keeps the venv off NTFS).
+source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/env.sh"
+source "$VENV/bin/activate"
+cd "$API_DIR"
export COMFY_URL="http://127.0.0.1:8188"
export HOST="0.0.0.0"
@@ -11,6 +12,7 @@ export PORT="8500"
# Output pixel budget. MI50 is compute-bound on this 20B model:
# ~0.59MP -> ~110s ~0.79MP -> ~140s ~1.0MP -> ~180s (4 steps)
# 0.79MP is a sane speed/quality default; raise for bigger output.
-export MAX_AREA="${MAX_AREA:-786432}"
+# Lowered to 0.65MP to help prevent GPU OOM on MI50.
+export MAX_AREA="${MAX_AREA:-655360}"
exec python edit_api.py
diff --git a/tour-comfy/start_watcher.sh b/tour-comfy/start_watcher.sh
new file mode 100755
index 0000000..db27ee1
--- /dev/null
+++ b/tour-comfy/start_watcher.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+# Launch the folder watcher service.
+set -e
+API_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+BASE="$( cd "$API_DIR/.." && pwd )"
+
+# Try to activate venv if it exists, otherwise use system python
+if [ -d "$BASE/venv" ]; then
+ source "$BASE/venv/bin/activate"
+fi
+
+cd "$API_DIR"
+exec python3 watcher.py
diff --git a/tour-comfy/systemd/comfyui-api.service b/tour-comfy/systemd/comfyui-api.service
index e5221ef..0a6bca1 100644
--- a/tour-comfy/systemd/comfyui-api.service
+++ b/tour-comfy/systemd/comfyui-api.service
@@ -1,13 +1,14 @@
[Unit]
Description=Qwen-Image-Edit FastAPI Service
After=comfyui-backend.service
+Requires=comfyui-backend.service
[Service]
Type=simple
-User=tour
-Group=tour
-WorkingDirectory=/media/tour/APPS/comfyui/api
-ExecStart=/bin/bash /media/tour/APPS/comfyui/api/start_api.sh
+User=__USER__
+Group=__GROUP__
+WorkingDirectory=__BASE__/api
+ExecStart=/bin/bash __BASE__/api/start_api.sh
Restart=always
RestartSec=5
StandardOutput=journal
diff --git a/tour-comfy/systemd/comfyui-backend.service b/tour-comfy/systemd/comfyui-backend.service
index 8c088e7..434cb11 100644
--- a/tour-comfy/systemd/comfyui-backend.service
+++ b/tour-comfy/systemd/comfyui-backend.service
@@ -4,10 +4,10 @@ After=network.target
[Service]
Type=simple
-User=tour
-Group=tour
-WorkingDirectory=/media/tour/APPS/comfyui
-ExecStart=/bin/bash /media/tour/APPS/comfyui/api/run_comfyui.sh
+User=__USER__
+Group=__GROUP__
+WorkingDirectory=__BASE__
+ExecStart=/bin/bash __BASE__/api/run_comfyui.sh
Restart=always
RestartSec=5
StandardOutput=journal
diff --git a/tour-comfy/watcher.lock b/tour-comfy/watcher.lock
new file mode 100644
index 0000000..e69de29
diff --git a/tour-comfy/watcher.log b/tour-comfy/watcher.log
new file mode 100644
index 0000000..bed37e1
--- /dev/null
+++ b/tour-comfy/watcher.log
@@ -0,0 +1,1139 @@
+2026-06-15 02:40:02,179 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 02:40:02,179 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 02:40:02,179 - INFO - API URL: http://192.168.1.171:8500/edit
+2026-06-15 02:40:03,179 - INFO - Starting processing for img.png...
+2026-06-15 02:40:03,195 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img.png to (33, 87, 217, 495)
+2026-06-15 02:40:03,203 - INFO - Calling API for img.png with prompt: high quality, detailed, make nude
+2026-06-15 02:42:14,812 - INFO - Successfully processed img.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img.png
+2026-06-15 02:42:17,813 - INFO - Starting processing for img_1.png...
+2026-06-15 02:42:17,813 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:42:17,815 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:42:45,018 - ERROR - API failed for img_1.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"f9d9aa31-46b4-4b9a-a3cb-18734cf2286d\", \"timestamp\": 1781484137830}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\"], \"prompt_id\": \"f9d9aa31-46b4-4b9a-a3cb-18734cf2286d\", \"timestamp\": 1781484137831}], [\"execution_error\", {\"prompt_id\": \"f9d9aa31-46b4-4b9a-a3cb-18734cf2286d\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\", \"7\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.94 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6405, 1.0951, ..., 1.9621, -0.3675, 0.7183],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [-0.3282, -0.9704, -2.9816, ..., -5.8886, 4.4257, 1.9400],\\n [ 0.1322, 1.5645, -1.3909, ..., 1.4667, 0.8913, 0.7841],\\n [-3.4778, 0.7706, 2.7181, ..., 0.5556, 0.2290, 0.2909]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2949e-01, -7.1680e-01, -7.8711e-01, ..., -7.6562e-01,\\n -7.1094e-01, -8.0371e-01],\\n [-5.8594e-01, -8.9453e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4766e-01, -6.9629e-01],\\n [-6.3965e-01, -9.0137e-01, -8.9453e-01, ..., -8.7402e-01,\\n -8.4961e-01, -7.4316e-01],\\n ...,\\n [-6.5625e-01, -9.0039e-01, -8.8574e-01, ..., -8.6035e-01,\\n -8.5254e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5449e-01, -8.6523e-01, ..., -8.4863e-01,\\n -8.4961e-01, -6.4453e-01],\\n [-5.7324e-01, -5.9082e-01, -6.1426e-01, ..., -5.7520e-01,\\n -4.7949e-01, -7.5000e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4197e-01, 1.8127e-01, ..., 1.8799e-01,\\n 1.9275e-01, -5.5542e-03],\\n [-1.5869e-03, 6.8970e-02, 6.7383e-02, ..., 9.2285e-02,\\n 1.0474e-01, -2.3376e-02],\\n [-5.0598e-02, -6.3171e-03, 3.4241e-02, ..., 5.6213e-02,\\n 4.7424e-02, -4.4769e-02],\\n ...,\\n [-4.1107e-02, 9.0332e-03, 4.9194e-02, ..., 6.7688e-02,\\n 6.0303e-02, -3.0197e-02],\\n [ 2.3193e-02, 5.3223e-02, 5.1880e-02, ..., 9.8267e-02,\\n 6.1829e-02, -5.9998e-02],\\n [ 2.6416e-01, 1.7175e-01, 1.7798e-01, ..., 1.7712e-01,\\n 1.7773e-01, -1.1859e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1074e+00, -3.0547e+00, ..., -3.0352e+00,\\n -3.0156e+00, -2.8047e+00],\\n [-2.8730e+00, -3.2090e+00, -3.2344e+00, ..., -3.2012e+00,\\n -3.1738e+00, -2.9785e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2012e+00, ..., -3.1602e+00,\\n -3.1191e+00, -2.9512e+00],\\n ...,\\n [-2.8438e+00, -3.1816e+00, -3.1914e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n [-2.7559e+00, -3.1250e+00, -3.1582e+00, ..., -3.1348e+00,\\n -3.1152e+00, -2.9941e+00],\\n [-2.6641e+00, -3.2559e+00, -3.2402e+00, ..., -3.2559e+00,\\n -3.2168e+00, -2.9434e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4612e-01, 2.8198e-01, 1.4429e-01, ..., 1.3354e-01,\\n 2.6392e-01, -1.3623e-01],\\n [ 1.6370e-01, 2.2205e-01, 1.8274e-01, ..., 1.8762e-01,\\n 2.7368e-01, -1.8091e-01],\\n [ 1.2122e-01, 2.1289e-01, 1.7700e-01, ..., 1.8689e-01,\\n 2.6611e-01, -2.3633e-01],\\n ...,\\n [ 1.2830e-01, 2.1509e-01, 1.9592e-01, ..., 2.3132e-01,\\n 2.8564e-01, -2.0947e-01],\\n [ 8.3740e-02, 2.3218e-01, 1.8860e-01, ..., 2.0007e-01,\\n 2.9810e-01, -2.2388e-01],\\n [-2.5146e-01, 7.9529e-02, -7.5928e-02, ..., -2.2583e-02,\\n 1.5381e-02, -3.2544e-01]]],\\n\\n\\n [[[-1.4385e+00, -1.8330e+00, -1.8330e+00, ..., -1.8291e+00,\\n -1.8545e+00, -1.8096e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3516e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4219e+00,\\n -2.4688e+00, -2.2656e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4297e+00,\\n -2.4844e+00, -2.3008e+00],\\n [-2.0977e+00, -2.6172e+00, -2.5117e+00, ..., -2.5508e+00,\\n -2.5742e+00, -2.3359e+00],\\n [-1.7188e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1836e+00, -1.9072e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9697e+00, ..., -1.9385e+00,\\n -1.8818e+00, -1.7061e+00],\\n [-2.2324e+00, -2.3340e+00, -2.2891e+00, ..., -2.2676e+00,\\n -2.2227e+00, -1.9355e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7471e+00, -1.9541e+00, -1.9385e+00, ..., -1.9209e+00,\\n -1.8867e+00, -1.3193e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2827, 0.9421, ..., 4.2095, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [2390406537], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"9\", \"3\", \"5\", \"1\", \"8\", \"2\", \"10\", \"6\", \"4\", \"7\"], \"timestamp\": 1781484164843}]]}"}
+2026-06-15 02:42:48,018 - INFO - Starting processing for img_1.png...
+2026-06-15 02:42:48,019 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:42:48,021 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:43:06,133 - ERROR - API failed for img_1.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"03201b31-87d4-4945-9a97-722314cadb84\", \"timestamp\": 1781484168035}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\", \"7\"], \"prompt_id\": \"03201b31-87d4-4945-9a97-722314cadb84\", \"timestamp\": 1781484168036}], [\"execution_error\", {\"prompt_id\": \"03201b31-87d4-4945-9a97-722314cadb84\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.94 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0950, ..., 1.9621, -0.3675, 0.7182],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6715, 2.5958, 0.9986],\\n ...,\\n [-0.3282, -0.9704, -2.9816, ..., -5.8885, 4.4257, 1.9399],\\n [ 0.1322, 1.5644, -1.3910, ..., 1.4667, 0.8913, 0.7841],\\n [-3.4778, 0.7706, 2.7181, ..., 0.5556, 0.2290, 0.2909]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2949e-01, -7.1680e-01, -7.8711e-01, ..., -7.6562e-01,\\n -7.1094e-01, -8.0371e-01],\\n [-5.8594e-01, -8.9453e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4766e-01, -6.9629e-01],\\n [-6.3965e-01, -9.0137e-01, -8.9453e-01, ..., -8.7402e-01,\\n -8.4961e-01, -7.4316e-01],\\n ...,\\n [-6.5625e-01, -9.0039e-01, -8.8574e-01, ..., -8.6035e-01,\\n -8.5254e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5449e-01, -8.6523e-01, ..., -8.4863e-01,\\n -8.4961e-01, -6.4453e-01],\\n [-5.7324e-01, -5.9082e-01, -6.1426e-01, ..., -5.7520e-01,\\n -4.7949e-01, -7.5000e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4197e-01, 1.8127e-01, ..., 1.8799e-01,\\n 1.9275e-01, -5.5542e-03],\\n [-1.5869e-03, 6.8970e-02, 6.7383e-02, ..., 9.2285e-02,\\n 1.0474e-01, -2.3376e-02],\\n [-5.0598e-02, -6.3171e-03, 3.4241e-02, ..., 5.6213e-02,\\n 4.7424e-02, -4.4769e-02],\\n ...,\\n [-4.1107e-02, 9.0332e-03, 4.9194e-02, ..., 6.7688e-02,\\n 6.0303e-02, -3.0197e-02],\\n [ 2.3193e-02, 5.3223e-02, 5.1880e-02, ..., 9.8267e-02,\\n 6.1829e-02, -5.9998e-02],\\n [ 2.6416e-01, 1.7175e-01, 1.7798e-01, ..., 1.7712e-01,\\n 1.7773e-01, -1.1859e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1074e+00, -3.0547e+00, ..., -3.0352e+00,\\n -3.0156e+00, -2.8047e+00],\\n [-2.8730e+00, -3.2090e+00, -3.2344e+00, ..., -3.2012e+00,\\n -3.1738e+00, -2.9785e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2012e+00, ..., -3.1602e+00,\\n -3.1191e+00, -2.9512e+00],\\n ...,\\n [-2.8438e+00, -3.1816e+00, -3.1914e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n [-2.7559e+00, -3.1250e+00, -3.1582e+00, ..., -3.1348e+00,\\n -3.1152e+00, -2.9941e+00],\\n [-2.6641e+00, -3.2559e+00, -3.2402e+00, ..., -3.2559e+00,\\n -3.2168e+00, -2.9434e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4612e-01, 2.8198e-01, 1.4429e-01, ..., 1.3354e-01,\\n 2.6392e-01, -1.3623e-01],\\n [ 1.6370e-01, 2.2205e-01, 1.8274e-01, ..., 1.8762e-01,\\n 2.7368e-01, -1.8091e-01],\\n [ 1.2122e-01, 2.1289e-01, 1.7700e-01, ..., 1.8689e-01,\\n 2.6611e-01, -2.3633e-01],\\n ...,\\n [ 1.2830e-01, 2.1509e-01, 1.9592e-01, ..., 2.3132e-01,\\n 2.8564e-01, -2.0947e-01],\\n [ 8.3740e-02, 2.3218e-01, 1.8860e-01, ..., 2.0007e-01,\\n 2.9810e-01, -2.2388e-01],\\n [-2.5146e-01, 7.9529e-02, -7.5928e-02, ..., -2.2583e-02,\\n 1.5381e-02, -3.2544e-01]]],\\n\\n\\n [[[-1.4385e+00, -1.8330e+00, -1.8330e+00, ..., -1.8291e+00,\\n -1.8545e+00, -1.8096e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3516e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4219e+00,\\n -2.4688e+00, -2.2656e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4297e+00,\\n -2.4844e+00, -2.3008e+00],\\n [-2.0977e+00, -2.6172e+00, -2.5117e+00, ..., -2.5508e+00,\\n -2.5742e+00, -2.3359e+00],\\n [-1.7188e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1836e+00, -1.9072e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9697e+00, ..., -1.9385e+00,\\n -1.8818e+00, -1.7061e+00],\\n [-2.2324e+00, -2.3340e+00, -2.2891e+00, ..., -2.2676e+00,\\n -2.2227e+00, -1.9355e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7471e+00, -1.9541e+00, -1.9385e+00, ..., -1.9209e+00,\\n -1.8867e+00, -1.3193e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2827, 0.9421, ..., 4.2095, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [1474987008], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"9\", \"3\", \"5\", \"1\", \"8\", \"2\", \"10\", \"6\", \"4\", \"7\"], \"timestamp\": 1781484185711}]]}"}
+2026-06-15 02:43:09,134 - INFO - Starting processing for img_1.png...
+2026-06-15 02:43:09,135 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:43:09,137 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:43:28,249 - ERROR - API failed for img_1.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"4c14cc7a-46d1-4e09-94d5-53cedfa5f94a\", \"timestamp\": 1781484189151}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\", \"7\"], \"prompt_id\": \"4c14cc7a-46d1-4e09-94d5-53cedfa5f94a\", \"timestamp\": 1781484189153}], [\"execution_error\", {\"prompt_id\": \"4c14cc7a-46d1-4e09-94d5-53cedfa5f94a\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.94 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1259, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0951, ..., 1.9622, -0.3675, 0.7183],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [-0.3282, -0.9703, -2.9816, ..., -5.8887, 4.4254, 1.9399],\\n [ 0.1323, 1.5644, -1.3909, ..., 1.4667, 0.8912, 0.7841],\\n [-3.4778, 0.7706, 2.7181, ..., 0.5556, 0.2289, 0.2908]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2949e-01, -7.1680e-01, -7.8711e-01, ..., -7.6562e-01,\\n -7.1094e-01, -8.0371e-01],\\n [-5.8594e-01, -8.9453e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4766e-01, -6.9629e-01],\\n [-6.3965e-01, -9.0137e-01, -8.9453e-01, ..., -8.7402e-01,\\n -8.4961e-01, -7.4316e-01],\\n ...,\\n [-6.5625e-01, -9.0039e-01, -8.8574e-01, ..., -8.6035e-01,\\n -8.5254e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5449e-01, -8.6523e-01, ..., -8.4863e-01,\\n -8.4961e-01, -6.4453e-01],\\n [-5.7324e-01, -5.9082e-01, -6.1426e-01, ..., -5.7520e-01,\\n -4.7949e-01, -7.5000e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4197e-01, 1.8127e-01, ..., 1.8799e-01,\\n 1.9275e-01, -5.5542e-03],\\n [-1.5869e-03, 6.8970e-02, 6.7383e-02, ..., 9.2285e-02,\\n 1.0474e-01, -2.3376e-02],\\n [-5.0598e-02, -6.3171e-03, 3.4241e-02, ..., 5.6213e-02,\\n 4.7424e-02, -4.4769e-02],\\n ...,\\n [-4.1107e-02, 9.0332e-03, 4.9194e-02, ..., 6.7688e-02,\\n 6.0303e-02, -3.0197e-02],\\n [ 2.3193e-02, 5.3223e-02, 5.1880e-02, ..., 9.8267e-02,\\n 6.1829e-02, -5.9998e-02],\\n [ 2.6416e-01, 1.7175e-01, 1.7798e-01, ..., 1.7712e-01,\\n 1.7773e-01, -1.1859e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1074e+00, -3.0547e+00, ..., -3.0352e+00,\\n -3.0156e+00, -2.8047e+00],\\n [-2.8730e+00, -3.2090e+00, -3.2344e+00, ..., -3.2012e+00,\\n -3.1738e+00, -2.9785e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2012e+00, ..., -3.1602e+00,\\n -3.1191e+00, -2.9512e+00],\\n ...,\\n [-2.8438e+00, -3.1816e+00, -3.1914e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n [-2.7559e+00, -3.1250e+00, -3.1582e+00, ..., -3.1348e+00,\\n -3.1152e+00, -2.9941e+00],\\n [-2.6641e+00, -3.2559e+00, -3.2402e+00, ..., -3.2559e+00,\\n -3.2168e+00, -2.9434e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4612e-01, 2.8198e-01, 1.4429e-01, ..., 1.3354e-01,\\n 2.6392e-01, -1.3623e-01],\\n [ 1.6370e-01, 2.2205e-01, 1.8274e-01, ..., 1.8762e-01,\\n 2.7368e-01, -1.8091e-01],\\n [ 1.2122e-01, 2.1289e-01, 1.7700e-01, ..., 1.8689e-01,\\n 2.6611e-01, -2.3633e-01],\\n ...,\\n [ 1.2830e-01, 2.1509e-01, 1.9592e-01, ..., 2.3132e-01,\\n 2.8564e-01, -2.0947e-01],\\n [ 8.3740e-02, 2.3218e-01, 1.8860e-01, ..., 2.0007e-01,\\n 2.9810e-01, -2.2388e-01],\\n [-2.5146e-01, 7.9529e-02, -7.5928e-02, ..., -2.2583e-02,\\n 1.5381e-02, -3.2544e-01]]],\\n\\n\\n [[[-1.4385e+00, -1.8330e+00, -1.8330e+00, ..., -1.8291e+00,\\n -1.8545e+00, -1.8096e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3516e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4219e+00,\\n -2.4688e+00, -2.2656e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4297e+00,\\n -2.4844e+00, -2.3008e+00],\\n [-2.0977e+00, -2.6172e+00, -2.5117e+00, ..., -2.5508e+00,\\n -2.5742e+00, -2.3359e+00],\\n [-1.7188e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1836e+00, -1.9072e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9697e+00, ..., -1.9385e+00,\\n -1.8818e+00, -1.7061e+00],\\n [-2.2324e+00, -2.3340e+00, -2.2891e+00, ..., -2.2676e+00,\\n -2.2227e+00, -1.9355e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7471e+00, -1.9541e+00, -1.9385e+00, ..., -1.9209e+00,\\n -1.8867e+00, -1.3193e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2827, 0.9421, ..., 4.2095, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [1271489775], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"9\", \"3\", \"5\", \"1\", \"8\", \"2\", \"10\", \"6\", \"4\", \"7\"], \"timestamp\": 1781484207988}]]}"}
+2026-06-15 02:43:31,250 - INFO - Starting processing for img_1.png...
+2026-06-15 02:43:31,251 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:43:31,253 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:43:49,476 - ERROR - API failed for img_1.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"26fa7deb-0902-481e-a815-0808ddd5e63c\", \"timestamp\": 1781484211268}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\", \"7\"], \"prompt_id\": \"26fa7deb-0902-481e-a815-0808ddd5e63c\", \"timestamp\": 1781484211269}], [\"execution_error\", {\"prompt_id\": \"26fa7deb-0902-481e-a815-0808ddd5e63c\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.94 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0951, ..., 1.9621, -0.3675, 0.7182],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [-0.3282, -0.9704, -2.9816, ..., -5.8887, 4.4254, 1.9399],\\n [ 0.1323, 1.5645, -1.3909, ..., 1.4667, 0.8912, 0.7840],\\n [-3.4778, 0.7706, 2.7181, ..., 0.5557, 0.2289, 0.2908]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2949e-01, -7.1680e-01, -7.8711e-01, ..., -7.6562e-01,\\n -7.1094e-01, -8.0371e-01],\\n [-5.8594e-01, -8.9453e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4766e-01, -6.9629e-01],\\n [-6.3965e-01, -9.0137e-01, -8.9453e-01, ..., -8.7402e-01,\\n -8.4961e-01, -7.4316e-01],\\n ...,\\n [-6.5625e-01, -9.0039e-01, -8.8574e-01, ..., -8.6035e-01,\\n -8.5254e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5449e-01, -8.6523e-01, ..., -8.4863e-01,\\n -8.4961e-01, -6.4453e-01],\\n [-5.7324e-01, -5.9082e-01, -6.1426e-01, ..., -5.7520e-01,\\n -4.7949e-01, -7.5000e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4197e-01, 1.8127e-01, ..., 1.8799e-01,\\n 1.9275e-01, -5.5542e-03],\\n [-1.5869e-03, 6.8970e-02, 6.7383e-02, ..., 9.2285e-02,\\n 1.0474e-01, -2.3376e-02],\\n [-5.0598e-02, -6.3171e-03, 3.4241e-02, ..., 5.6213e-02,\\n 4.7424e-02, -4.4769e-02],\\n ...,\\n [-4.1107e-02, 9.0332e-03, 4.9194e-02, ..., 6.7688e-02,\\n 6.0303e-02, -3.0197e-02],\\n [ 2.3193e-02, 5.3223e-02, 5.1880e-02, ..., 9.8267e-02,\\n 6.1829e-02, -5.9998e-02],\\n [ 2.6416e-01, 1.7175e-01, 1.7798e-01, ..., 1.7712e-01,\\n 1.7773e-01, -1.1859e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1074e+00, -3.0547e+00, ..., -3.0352e+00,\\n -3.0156e+00, -2.8047e+00],\\n [-2.8730e+00, -3.2090e+00, -3.2344e+00, ..., -3.2012e+00,\\n -3.1738e+00, -2.9785e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2012e+00, ..., -3.1602e+00,\\n -3.1191e+00, -2.9512e+00],\\n ...,\\n [-2.8438e+00, -3.1816e+00, -3.1914e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n [-2.7559e+00, -3.1250e+00, -3.1582e+00, ..., -3.1348e+00,\\n -3.1152e+00, -2.9941e+00],\\n [-2.6641e+00, -3.2559e+00, -3.2402e+00, ..., -3.2559e+00,\\n -3.2168e+00, -2.9434e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4612e-01, 2.8198e-01, 1.4429e-01, ..., 1.3354e-01,\\n 2.6392e-01, -1.3623e-01],\\n [ 1.6370e-01, 2.2205e-01, 1.8274e-01, ..., 1.8762e-01,\\n 2.7368e-01, -1.8091e-01],\\n [ 1.2122e-01, 2.1289e-01, 1.7700e-01, ..., 1.8689e-01,\\n 2.6611e-01, -2.3633e-01],\\n ...,\\n [ 1.2830e-01, 2.1509e-01, 1.9592e-01, ..., 2.3132e-01,\\n 2.8564e-01, -2.0947e-01],\\n [ 8.3740e-02, 2.3218e-01, 1.8860e-01, ..., 2.0007e-01,\\n 2.9810e-01, -2.2388e-01],\\n [-2.5146e-01, 7.9529e-02, -7.5928e-02, ..., -2.2583e-02,\\n 1.5381e-02, -3.2544e-01]]],\\n\\n\\n [[[-1.4385e+00, -1.8330e+00, -1.8330e+00, ..., -1.8291e+00,\\n -1.8545e+00, -1.8096e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3516e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4219e+00,\\n -2.4688e+00, -2.2656e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4297e+00,\\n -2.4844e+00, -2.3008e+00],\\n [-2.0977e+00, -2.6172e+00, -2.5117e+00, ..., -2.5508e+00,\\n -2.5742e+00, -2.3359e+00],\\n [-1.7188e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1836e+00, -1.9072e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9697e+00, ..., -1.9385e+00,\\n -1.8818e+00, -1.7061e+00],\\n [-2.2324e+00, -2.3340e+00, -2.2891e+00, ..., -2.2676e+00,\\n -2.2227e+00, -1.9355e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7471e+00, -1.9541e+00, -1.9385e+00, ..., -1.9209e+00,\\n -1.8867e+00, -1.3193e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2827, 0.9421, ..., 4.2095, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [1401812896], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"9\", \"3\", \"5\", \"1\", \"8\", \"2\", \"10\", \"6\", \"4\", \"7\"], \"timestamp\": 1781484229320}]]}"}
+2026-06-15 02:43:52,476 - INFO - Starting processing for img_1.png...
+2026-06-15 02:43:52,477 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:43:52,479 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:44:10,599 - ERROR - API failed for img_1.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"3c5d722b-a64a-463f-86d2-2eb7f94b868a\", \"timestamp\": 1781484232494}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\", \"7\"], \"prompt_id\": \"3c5d722b-a64a-463f-86d2-2eb7f94b868a\", \"timestamp\": 1781484232496}], [\"execution_error\", {\"prompt_id\": \"3c5d722b-a64a-463f-86d2-2eb7f94b868a\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.94 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/home/hubby/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0950, ..., 1.9622, -0.3675, 0.7183],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [-0.3282, -0.9704, -2.9817, ..., -5.8886, 4.4256, 1.9398],\\n [ 0.1323, 1.5644, -1.3910, ..., 1.4667, 0.8913, 0.7841],\\n [-3.4778, 0.7706, 2.7182, ..., 0.5556, 0.2290, 0.2908]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2949e-01, -7.1680e-01, -7.8711e-01, ..., -7.6562e-01,\\n -7.1094e-01, -8.0371e-01],\\n [-5.8594e-01, -8.9453e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4766e-01, -6.9629e-01],\\n [-6.3965e-01, -9.0137e-01, -8.9453e-01, ..., -8.7402e-01,\\n -8.4961e-01, -7.4316e-01],\\n ...,\\n [-6.5625e-01, -9.0039e-01, -8.8574e-01, ..., -8.6035e-01,\\n -8.5254e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5449e-01, -8.6523e-01, ..., -8.4863e-01,\\n -8.4961e-01, -6.4453e-01],\\n [-5.7324e-01, -5.9082e-01, -6.1426e-01, ..., -5.7520e-01,\\n -4.7949e-01, -7.5000e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4197e-01, 1.8127e-01, ..., 1.8799e-01,\\n 1.9275e-01, -5.5542e-03],\\n [-1.5869e-03, 6.8970e-02, 6.7383e-02, ..., 9.2285e-02,\\n 1.0474e-01, -2.3376e-02],\\n [-5.0598e-02, -6.3171e-03, 3.4241e-02, ..., 5.6213e-02,\\n 4.7424e-02, -4.4769e-02],\\n ...,\\n [-4.1107e-02, 9.0332e-03, 4.9194e-02, ..., 6.7688e-02,\\n 6.0303e-02, -3.0197e-02],\\n [ 2.3193e-02, 5.3223e-02, 5.1880e-02, ..., 9.8267e-02,\\n 6.1829e-02, -5.9998e-02],\\n [ 2.6416e-01, 1.7175e-01, 1.7798e-01, ..., 1.7712e-01,\\n 1.7773e-01, -1.1859e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1074e+00, -3.0547e+00, ..., -3.0352e+00,\\n -3.0156e+00, -2.8047e+00],\\n [-2.8730e+00, -3.2090e+00, -3.2344e+00, ..., -3.2012e+00,\\n -3.1738e+00, -2.9785e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2012e+00, ..., -3.1602e+00,\\n -3.1191e+00, -2.9512e+00],\\n ...,\\n [-2.8438e+00, -3.1816e+00, -3.1914e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n [-2.7559e+00, -3.1250e+00, -3.1582e+00, ..., -3.1348e+00,\\n -3.1152e+00, -2.9941e+00],\\n [-2.6641e+00, -3.2559e+00, -3.2402e+00, ..., -3.2559e+00,\\n -3.2168e+00, -2.9434e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4612e-01, 2.8198e-01, 1.4429e-01, ..., 1.3354e-01,\\n 2.6392e-01, -1.3623e-01],\\n [ 1.6370e-01, 2.2205e-01, 1.8274e-01, ..., 1.8762e-01,\\n 2.7368e-01, -1.8091e-01],\\n [ 1.2122e-01, 2.1289e-01, 1.7700e-01, ..., 1.8689e-01,\\n 2.6611e-01, -2.3633e-01],\\n ...,\\n [ 1.2830e-01, 2.1509e-01, 1.9592e-01, ..., 2.3132e-01,\\n 2.8564e-01, -2.0947e-01],\\n [ 8.3740e-02, 2.3218e-01, 1.8860e-01, ..., 2.0007e-01,\\n 2.9810e-01, -2.2388e-01],\\n [-2.5146e-01, 7.9529e-02, -7.5928e-02, ..., -2.2583e-02,\\n 1.5381e-02, -3.2544e-01]]],\\n\\n\\n [[[-1.4385e+00, -1.8330e+00, -1.8330e+00, ..., -1.8291e+00,\\n -1.8545e+00, -1.8096e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3516e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4219e+00,\\n -2.4688e+00, -2.2656e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4297e+00,\\n -2.4844e+00, -2.3008e+00],\\n [-2.0977e+00, -2.6172e+00, -2.5117e+00, ..., -2.5508e+00,\\n -2.5742e+00, -2.3359e+00],\\n [-1.7188e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1836e+00, -1.9072e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9697e+00, ..., -1.9385e+00,\\n -1.8818e+00, -1.7061e+00],\\n [-2.2324e+00, -2.3340e+00, -2.2891e+00, ..., -2.2676e+00,\\n -2.2227e+00, -1.9355e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7471e+00, -1.9541e+00, -1.9385e+00, ..., -1.9209e+00,\\n -1.8867e+00, -1.3193e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2827, 0.9421, ..., 4.2095, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [626835304], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"9\", \"3\", \"5\", \"1\", \"8\", \"2\", \"10\", \"6\", \"4\", \"7\"], \"timestamp\": 1781484250139}]]}"}
+2026-06-15 02:44:13,600 - INFO - Starting processing for img_1.png...
+2026-06-15 02:44:13,600 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:44:13,602 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:45:52,791 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 02:45:52,791 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 02:45:52,791 - INFO - API URL: http://192.168.1.171:8500/edit
+2026-06-15 02:45:53,792 - INFO - Starting processing for test_fail.png...
+2026-06-15 02:45:53,796 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test_fail.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 02:45:53,796 - INFO - Calling API for test_fail.png with prompt: high quality, detailed, make nude
+2026-06-15 02:46:12,792 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 02:46:12,792 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 02:46:12,792 - INFO - API URL: http://localhost:1
+2026-06-15 02:46:13,793 - INFO - Starting processing for test_fail.png...
+2026-06-15 02:46:13,796 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test_fail.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 02:46:13,797 - INFO - Calling API for test_fail.png with prompt: high quality, detailed, make nude
+2026-06-15 02:46:13,798 - ERROR - Error processing test_fail.png: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 198, in _new_conn
+ sock = connection.create_connection(
+ (self._dns_host, self.port),
+ ...<2 lines>...
+ socket_options=self.socket_options,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 85, in create_connection
+ raise err
+ File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 73, in create_connection
+ sock.connect(sa)
+ ~~~~~~~~~~~~^^^^
+ConnectionRefusedError: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 787, in urlopen
+ response = self._make_request(
+ conn,
+ ...<10 lines>...
+ **response_kw,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 493, in _make_request
+ conn.request(
+ ~~~~~~~~~~~~^
+ method,
+ ^^^^^^^
+ ...<6 lines>...
+ enforce_content_length=enforce_content_length,
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ )
+ ^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 445, in request
+ self.endheaders()
+ ~~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3.13/http/client.py", line 1353, in endheaders
+ self._send_output(message_body, encode_chunked=encode_chunked)
+ ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1113, in _send_output
+ self.send(msg)
+ ~~~~~~~~~^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1057, in send
+ self.connect()
+ ~~~~~~~~~~~~^^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 276, in connect
+ self.sock = self._new_conn()
+ ~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 213, in _new_conn
+ raise NewConnectionError(
+ self, f"Failed to establish a new connection: {e}"
+ ) from e
+urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 667, in send
+ resp = conn.urlopen(
+ method=request.method,
+ ...<9 lines>...
+ chunked=chunked,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 841, in urlopen
+ retries = retries.increment(
+ method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 519, in increment
+ raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+ File "/home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/watcher.py", line 122, in process_image
+ response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
+ File "/usr/lib/python3/dist-packages/requests/api.py", line 115, in post
+ return request("post", url, data=data, json=json, **kwargs)
+ File "/usr/lib/python3/dist-packages/requests/api.py", line 59, in request
+ return session.request(method=method, url=url, **kwargs)
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 589, in request
+ resp = self.send(prep, **send_kwargs)
+ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 703, in send
+ r = adapter.send(request, **kwargs)
+ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 700, in send
+ raise ConnectionError(e, request=request)
+requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+2026-06-15 02:46:13,805 - INFO - Flagging image test_fail.png (moving to failed directory)
+2026-06-15 02:46:14,805 - INFO - Starting processing for img_1.png...
+2026-06-15 02:46:14,806 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 02:46:14,808 - INFO - Calling API for img_1.png with prompt: high quality, detailed, make nude
+2026-06-15 02:46:14,808 - ERROR - Error processing img_1.png: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 198, in _new_conn
+ sock = connection.create_connection(
+ (self._dns_host, self.port),
+ ...<2 lines>...
+ socket_options=self.socket_options,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 85, in create_connection
+ raise err
+ File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 73, in create_connection
+ sock.connect(sa)
+ ~~~~~~~~~~~~^^^^
+ConnectionRefusedError: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 787, in urlopen
+ response = self._make_request(
+ conn,
+ ...<10 lines>...
+ **response_kw,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 493, in _make_request
+ conn.request(
+ ~~~~~~~~~~~~^
+ method,
+ ^^^^^^^
+ ...<6 lines>...
+ enforce_content_length=enforce_content_length,
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ )
+ ^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 445, in request
+ self.endheaders()
+ ~~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3.13/http/client.py", line 1353, in endheaders
+ self._send_output(message_body, encode_chunked=encode_chunked)
+ ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1113, in _send_output
+ self.send(msg)
+ ~~~~~~~~~^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1057, in send
+ self.connect()
+ ~~~~~~~~~~~~^^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 276, in connect
+ self.sock = self._new_conn()
+ ~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 213, in _new_conn
+ raise NewConnectionError(
+ self, f"Failed to establish a new connection: {e}"
+ ) from e
+urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 667, in send
+ resp = conn.urlopen(
+ method=request.method,
+ ...<9 lines>...
+ chunked=chunked,
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 841, in urlopen
+ retries = retries.increment(
+ method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]
+ )
+ File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 519, in increment
+ raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+ File "/home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/watcher.py", line 122, in process_image
+ response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
+ File "/usr/lib/python3/dist-packages/requests/api.py", line 115, in post
+ return request("post", url, data=data, json=json, **kwargs)
+ File "/usr/lib/python3/dist-packages/requests/api.py", line 59, in request
+ return session.request(method=method, url=url, **kwargs)
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 589, in request
+ resp = self.send(prep, **send_kwargs)
+ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 703, in send
+ r = adapter.send(request, **kwargs)
+ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 700, in send
+ raise ConnectionError(e, request=request)
+requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))
+2026-06-15 02:46:14,810 - INFO - Flagging image img_1.png (moving to failed directory)
+2026-06-15 02:49:37,379 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 02:49:37,379 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 02:49:37,379 - INFO - API URL: http://192.168.1.171:8500/edit
+2026-06-15 02:50:44,382 - INFO - Starting processing for img_2.png...
+2026-06-15 02:50:44,387 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_2.png to (24, 47, 174, 291)
+2026-06-15 02:50:44,389 - INFO - Calling API for img_2.png with prompt: high quality, detailed, make nude
+2026-06-15 02:52:58,449 - INFO - Successfully processed img_2.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_2.png
+2026-06-15 02:54:39,454 - INFO - Starting processing for img_3.png...
+2026-06-15 02:54:39,454 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_3.png to (16, 66, 124, 388)
+2026-06-15 02:54:39,458 - INFO - Calling API for img_3.png with prompt: high quality, detailed, make nude
+2026-06-15 02:56:24,970 - INFO - Successfully processed img_3.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_3.png
+2026-06-15 02:56:27,971 - INFO - Starting processing for img_4.png...
+2026-06-15 02:56:27,971 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_4.png to (20, 61, 138, 345)
+2026-06-15 02:56:27,974 - INFO - Calling API for img_4.png with prompt: high quality, detailed, make nude
+2026-06-15 02:58:56,641 - INFO - Successfully processed img_4.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_4.png
+2026-06-15 03:00:05,645 - INFO - Starting processing for img_5.png...
+2026-06-15 03:00:05,645 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_5.png to (31, 55, 145, 331)
+2026-06-15 03:00:05,649 - INFO - Calling API for img_5.png with prompt: high quality, detailed, make nude
+2026-06-15 03:02:12,342 - INFO - Successfully processed img_5.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_5.png
+2026-06-15 03:04:17,349 - INFO - Starting processing for img_19.png...
+2026-06-15 03:04:17,350 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_19.png to (23, 17, 151, 161)
+2026-06-15 03:04:17,351 - INFO - Calling API for img_19.png with prompt: high quality, detailed, make nude
+2026-06-15 03:06:35,914 - INFO - Successfully processed img_19.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_19.png
+2026-06-15 13:18:20,424 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:18:20,424 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:18:20,424 - INFO - API URL: http://192.168.1.171:8500/edit
+2026-06-15 13:18:21,424 - INFO - Starting processing for img_7.png...
+2026-06-15 13:18:21,428 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_7.png to (12, 50, 100, 301)
+2026-06-15 13:18:21,430 - INFO - Calling API for img_7.png with prompt: high quality, detailed, make nude
+2026-06-15 13:18:21,431 - ERROR - Error processing img_7.png: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 204, in _new_conn
+ sock = connection.create_connection(
+ (self._dns_host, self.port),
+ ...<2 lines>...
+ socket_options=self.socket_options,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/connection.py", line 85, in create_connection
+ raise err
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/connection.py", line 73, in create_connection
+ sock.connect(sa)
+ ~~~~~~~~~~~~^^^^
+ConnectionRefusedError: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 787, in urlopen
+ response = self._make_request(
+ conn,
+ ...<10 lines>...
+ **response_kw,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 493, in _make_request
+ conn.request(
+ ~~~~~~~~~~~~^
+ method,
+ ^^^^^^^
+ ...<6 lines>...
+ enforce_content_length=enforce_content_length,
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ )
+ ^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 500, in request
+ self.endheaders()
+ ~~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3.13/http/client.py", line 1353, in endheaders
+ self._send_output(message_body, encode_chunked=encode_chunked)
+ ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1113, in _send_output
+ self.send(msg)
+ ~~~~~~~~~^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1057, in send
+ self.connect()
+ ~~~~~~~~~~~~^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 331, in connect
+ self.sock = self._new_conn()
+ ~~~~~~~~~~~~~~^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 219, in _new_conn
+ raise NewConnectionError(
+ self, f"Failed to establish a new connection: {e}"
+ ) from e
+urllib3.exceptions.NewConnectionError: HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/adapters.py", line 644, in send
+ resp = conn.urlopen(
+ method=request.method,
+ ...<9 lines>...
+ chunked=chunked,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 841, in urlopen
+ retries = retries.increment(
+ method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/retry.py", line 519, in increment
+ raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+ File "/home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/watcher.py", line 123, in process_image
+ response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/api.py", line 115, in post
+ return request("post", url, data=data, json=json, **kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/api.py", line 59, in request
+ return session.request(method=method, url=url, **kwargs)
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/sessions.py", line 589, in request
+ resp = self.send(prep, **send_kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/sessions.py", line 703, in send
+ r = adapter.send(request, **kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/adapters.py", line 677, in send
+ raise ConnectionError(e, request=request)
+requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+2026-06-15 13:18:21,435 - INFO - Flagging image img_7.png (moving to failed directory)
+2026-06-15 13:18:22,435 - INFO - Starting processing for img_6.png...
+2026-06-15 13:18:22,435 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6.png to (16, 54, 122, 323)
+2026-06-15 13:18:22,439 - INFO - Calling API for img_6.png with prompt: high quality, detailed, make nude
+2026-06-15 13:18:22,439 - ERROR - Error processing img_6.png: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 204, in _new_conn
+ sock = connection.create_connection(
+ (self._dns_host, self.port),
+ ...<2 lines>...
+ socket_options=self.socket_options,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/connection.py", line 85, in create_connection
+ raise err
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/connection.py", line 73, in create_connection
+ sock.connect(sa)
+ ~~~~~~~~~~~~^^^^
+ConnectionRefusedError: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 787, in urlopen
+ response = self._make_request(
+ conn,
+ ...<10 lines>...
+ **response_kw,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 493, in _make_request
+ conn.request(
+ ~~~~~~~~~~~~^
+ method,
+ ^^^^^^^
+ ...<6 lines>...
+ enforce_content_length=enforce_content_length,
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ )
+ ^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 500, in request
+ self.endheaders()
+ ~~~~~~~~~~~~~~~^^
+ File "/usr/lib/python3.13/http/client.py", line 1353, in endheaders
+ self._send_output(message_body, encode_chunked=encode_chunked)
+ ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1113, in _send_output
+ self.send(msg)
+ ~~~~~~~~~^^^^^
+ File "/usr/lib/python3.13/http/client.py", line 1057, in send
+ self.connect()
+ ~~~~~~~~~~~~^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 331, in connect
+ self.sock = self._new_conn()
+ ~~~~~~~~~~~~~~^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connection.py", line 219, in _new_conn
+ raise NewConnectionError(
+ self, f"Failed to establish a new connection: {e}"
+ ) from e
+urllib3.exceptions.NewConnectionError: HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/adapters.py", line 644, in send
+ resp = conn.urlopen(
+ method=request.method,
+ ...<9 lines>...
+ chunked=chunked,
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/connectionpool.py", line 841, in urlopen
+ retries = retries.increment(
+ method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2]
+ )
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/urllib3/util/retry.py", line 519, in increment
+ raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+ File "/home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/watcher.py", line 123, in process_image
+ response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/api.py", line 115, in post
+ return request("post", url, data=data, json=json, **kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/api.py", line 59, in request
+ return session.request(method=method, url=url, **kwargs)
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/sessions.py", line 589, in request
+ resp = self.send(prep, **send_kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/sessions.py", line 703, in send
+ r = adapter.send(request, **kwargs)
+ File "/home/mike/.venvs/cli/lib/python3.13/site-packages/requests/adapters.py", line 677, in send
+ raise ConnectionError(e, request=request)
+requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.1.171', port=8500): Max retries exceeded with url: /edit (Caused by NewConnectionError("HTTPConnection(host='192.168.1.171', port=8500): Failed to establish a new connection: [Errno 111] Connection refused"))
+2026-06-15 13:18:22,441 - INFO - Flagging image img_6.png (moving to failed directory)
+2026-06-15 13:19:46,409 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:19:46,409 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:19:46,409 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:22:41,734 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:22:41,734 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:22:41,734 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:25:24,892 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:25:24,892 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:25:24,892 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:25:35,893 - INFO - Starting processing for junie_test_real.png...
+2026-06-15 13:25:35,899 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/junie_test_real.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 13:25:35,900 - INFO - Calling API for junie_test_real.png with prompt: high quality, detailed, make nude
+2026-06-15 13:26:39,503 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:26:39,503 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:26:39,503 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:26:41,504 - INFO - Starting processing for junie_test_real.png...
+2026-06-15 13:26:41,507 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/junie_test_real.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 13:26:41,508 - INFO - Calling API for junie_test_real.png with prompt: high quality, detailed, make nude
+2026-06-15 13:28:14,398 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:28:14,398 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:28:14,398 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:28:23,398 - INFO - Starting processing for img_7.png...
+2026-06-15 13:28:23,403 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_7.png to (12, 50, 100, 301)
+2026-06-15 13:28:23,404 - INFO - Calling API for img_7.png with prompt: high quality, detailed, make nude
+2026-06-15 13:30:57,181 - ERROR - API failed for img_7.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"8a50419d-b85e-46c8-8880-068b1fe4874e\", \"timestamp\": 1781523040022}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\"], \"prompt_id\": \"8a50419d-b85e-46c8-8880-068b1fe4874e\", \"timestamp\": 1781523040024}], [\"execution_error\", {\"prompt_id\": \"8a50419d-b85e-46c8-8880-068b1fe4874e\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"5\", \"7\", \"4\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.91 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0951, ..., 1.9621, -0.3675, 0.7182],\\n [ 2.0712, 1.3250, 3.3189, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [ 1.2414, -1.2274, -3.5347, ..., -5.3494, 5.3344, 1.5203],\\n [ 0.3040, 2.1660, -0.7415, ..., 1.3555, 0.8536, 0.6510],\\n [-3.2206, 0.7039, 2.9275, ..., 0.3224, 0.1547, 0.5913]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.2852e-01, -7.1582e-01, -7.8516e-01, ..., -7.6367e-01,\\n -7.0996e-01, -8.0371e-01],\\n [-5.8496e-01, -8.9258e-01, -9.0527e-01, ..., -8.7207e-01,\\n -8.4668e-01, -6.9629e-01],\\n [-6.3867e-01, -9.0039e-01, -8.9355e-01, ..., -8.7305e-01,\\n -8.4863e-01, -7.4219e-01],\\n ...,\\n [-6.5527e-01, -9.0039e-01, -8.8379e-01, ..., -8.5840e-01,\\n -8.5059e-01, -7.3633e-01],\\n [-5.8887e-01, -8.5352e-01, -8.6328e-01, ..., -8.4766e-01,\\n -8.4766e-01, -6.4551e-01],\\n [-5.7324e-01, -5.8984e-01, -6.1328e-01, ..., -5.7520e-01,\\n -4.7998e-01, -7.5293e-01]]],\\n\\n\\n [[[ 1.7090e-02, 1.4233e-01, 1.8127e-01, ..., 1.8738e-01,\\n 1.9275e-01, -7.2021e-03],\\n [-2.1362e-03, 6.7993e-02, 6.8298e-02, ..., 9.2407e-02,\\n 1.0522e-01, -2.3300e-02],\\n [-5.1300e-02, -7.5073e-03, 3.4119e-02, ..., 5.5969e-02,\\n 4.6387e-02, -4.4617e-02],\\n ...,\\n [-4.1473e-02, 7.8735e-03, 4.8889e-02, ..., 6.7017e-02,\\n 6.0059e-02, -3.0487e-02],\\n [ 2.2705e-02, 5.3040e-02, 5.1147e-02, ..., 9.8267e-02,\\n 6.1035e-02, -6.0547e-02],\\n [ 2.6343e-01, 1.7114e-01, 1.7761e-01, ..., 1.7761e-01,\\n 1.7651e-01, -1.2036e-01]]],\\n\\n\\n [[[-2.6543e+00, -3.1035e+00, -3.0508e+00, ..., -3.0312e+00,\\n -3.0098e+00, -2.8008e+00],\\n [-2.8672e+00, -3.2031e+00, -3.2285e+00, ..., -3.1934e+00,\\n -3.1660e+00, -2.9707e+00],\\n [-2.8477e+00, -3.1855e+00, -3.1934e+00, ..., -3.1523e+00,\\n -3.1113e+00, -2.9453e+00],\\n ...,\\n [-2.8398e+00, -3.1738e+00, -3.1836e+00, ..., -3.1543e+00,\\n -3.1113e+00, -2.9453e+00],\\n [-2.7500e+00, -3.1172e+00, -3.1504e+00, ..., -3.1270e+00,\\n -3.1055e+00, -2.9844e+00],\\n [-2.6582e+00, -3.2480e+00, -3.2344e+00, ..., -3.2480e+00,\\n -3.2090e+00, -2.9375e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4160e-01, 2.7490e-01, 1.3794e-01, ..., 1.2756e-01,\\n 2.5684e-01, -1.4209e-01],\\n [ 1.5845e-01, 2.1375e-01, 1.7383e-01, ..., 1.7725e-01,\\n 2.6318e-01, -1.9055e-01],\\n [ 1.1536e-01, 2.0361e-01, 1.6772e-01, ..., 1.7676e-01,\\n 2.5537e-01, -2.4585e-01],\\n ...,\\n [ 1.2201e-01, 2.0557e-01, 1.8530e-01, ..., 2.2095e-01,\\n 2.7441e-01, -2.1899e-01],\\n [ 7.7148e-02, 2.2412e-01, 1.7883e-01, ..., 1.9031e-01,\\n 2.8906e-01, -2.3218e-01],\\n [-2.5586e-01, 7.2510e-02, -8.4839e-02, ..., -3.1189e-02,\\n 7.3242e-03, -3.3032e-01]]],\\n\\n\\n [[[-1.4404e+00, -1.8359e+00, -1.8359e+00, ..., -1.8330e+00,\\n -1.8584e+00, -1.8135e+00],\\n [-2.1484e+00, -2.6406e+00, -2.5117e+00, ..., -2.5352e+00,\\n -2.5547e+00, -2.3555e+00],\\n [-2.0703e+00, -2.5469e+00, -2.4141e+00, ..., -2.4297e+00,\\n -2.4727e+00, -2.2734e+00],\\n ...,\\n [-2.0625e+00, -2.5195e+00, -2.4219e+00, ..., -2.4375e+00,\\n -2.4883e+00, -2.3086e+00],\\n [-2.1016e+00, -2.6250e+00, -2.5195e+00, ..., -2.5586e+00,\\n -2.5820e+00, -2.3438e+00],\\n [-1.7236e+00, -2.1680e+00, -2.1328e+00, ..., -2.1484e+00,\\n -2.1914e+00, -1.9170e+00]]],\\n\\n\\n [[[-1.8721e+00, -1.9971e+00, -1.9668e+00, ..., -1.9346e+00,\\n -1.8779e+00, -1.7031e+00],\\n [-2.2305e+00, -2.3320e+00, -2.2852e+00, ..., -2.2637e+00,\\n -2.2188e+00, -1.9326e+00],\\n [-2.1816e+00, -2.3223e+00, -2.3047e+00, ..., -2.2617e+00,\\n -2.2266e+00, -1.9736e+00],\\n ...,\\n [-2.1914e+00, -2.3164e+00, -2.2871e+00, ..., -2.2461e+00,\\n -2.2168e+00, -1.9600e+00],\\n [-2.0586e+00, -2.2227e+00, -2.2344e+00, ..., -2.2207e+00,\\n -2.1562e+00, -1.9580e+00],\\n [-1.7451e+00, -1.9512e+00, -1.9355e+00, ..., -1.9180e+00,\\n -1.8838e+00, -1.3184e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2828, 0.9421, ..., 4.2095, -1.9805, 0.6990],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [3737140018], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"10\", \"6\", \"3\", \"8\", \"1\", \"5\", \"7\", \"9\", \"4\", \"2\"], \"timestamp\": 1781523057044}]]}"}
+2026-06-15 13:30:57,182 - INFO - Flagging image img_7.png (moving to failed directory)
+2026-06-15 13:31:52,185 - INFO - Starting processing for imgxx.png...
+2026-06-15 13:31:52,186 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxx.png to (0, 0, 105, 186)
+2026-06-15 13:31:52,188 - INFO - Calling API for imgxx.png with prompt: high quality, detailed, make nude
+2026-06-15 13:32:26,457 - ERROR - API failed for imgxx.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"17f62455-5dc2-4d51-8624-8712e1bfc4a8\", \"timestamp\": 1781523112222}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\"], \"prompt_id\": \"17f62455-5dc2-4d51-8624-8712e1bfc4a8\", \"timestamp\": 1781523112229}], [\"execution_error\", {\"prompt_id\": \"17f62455-5dc2-4d51-8624-8712e1bfc4a8\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"5\", \"7\", \"4\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.88 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0950, ..., 1.9622, -0.3675, 0.7183],\\n [ 2.0712, 1.3250, 3.3189, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [ 0.9426, -0.5408, -2.8735, ..., -3.5033, 4.7566, 0.5057],\\n [ 0.0101, 1.6890, -1.1018, ..., 1.5005, 0.5754, 0.6894],\\n [-3.5161, 0.7805, 2.8068, ..., 0.6213, 0.3907, 0.5406]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-0.7334, -0.7227, -0.7930, ..., -0.7715, -0.7197, -0.8164],\\n [-0.5908, -0.9014, -0.9141, ..., -0.8809, -0.8574, -0.7090],\\n [-0.6445, -0.9082, -0.9023, ..., -0.8809, -0.8594, -0.7549],\\n ...,\\n [-0.6621, -0.9072, -0.8936, ..., -0.8672, -0.8613, -0.7490],\\n [-0.5967, -0.8623, -0.8740, ..., -0.8564, -0.8604, -0.6592],\\n [-0.5859, -0.6035, -0.6260, ..., -0.5879, -0.4939, -0.7686]]],\\n\\n\\n [[[ 0.0151, 0.1393, 0.1787, ..., 0.1848, 0.1901, -0.0135],\\n [-0.0043, 0.0657, 0.0649, ..., 0.0896, 0.1031, -0.0298],\\n [-0.0529, -0.0103, 0.0316, ..., 0.0532, 0.0447, -0.0511],\\n ...,\\n [-0.0438, 0.0054, 0.0463, ..., 0.0645, 0.0574, -0.0371],\\n [ 0.0206, 0.0500, 0.0488, ..., 0.0959, 0.0588, -0.0665],\\n [ 0.2551, 0.1615, 0.1688, ..., 0.1692, 0.1687, -0.1326]]],\\n\\n\\n [[[-2.6523, -3.1035, -3.0508, ..., -3.0312, -3.0098, -2.7988],\\n [-2.8652, -3.2051, -3.2285, ..., -3.1953, -3.1680, -2.9727],\\n [-2.8477, -3.1855, -3.1953, ..., -3.1543, -3.1133, -2.9453],\\n ...,\\n [-2.8398, -3.1758, -3.1855, ..., -3.1582, -3.1152, -2.9473],\\n [-2.7500, -3.1211, -3.1523, ..., -3.1309, -3.1074, -2.9844],\\n [-2.6562, -3.2500, -3.2324, ..., -3.2500, -3.2090, -2.9355]]],\\n\\n\\n ...,\\n\\n\\n [[[ 0.1444, 0.2793, 0.1426, ..., 0.1318, 0.2632, -0.1365],\\n [ 0.1624, 0.2202, 0.1805, ..., 0.1847, 0.2727, -0.1815],\\n [ 0.1193, 0.2104, 0.1742, ..., 0.1849, 0.2651, -0.2366],\\n ...,\\n [ 0.1266, 0.2123, 0.1931, ..., 0.2291, 0.2842, -0.2104],\\n [ 0.0818, 0.2303, 0.1865, ..., 0.1989, 0.2969, -0.2249],\\n [-0.2527, 0.0763, -0.0799, ..., -0.0251, 0.0134, -0.3291]]],\\n\\n\\n [[[-1.4385, -1.8330, -1.8330, ..., -1.8301, -1.8564, -1.8135],\\n [-2.1445, -2.6367, -2.5078, ..., -2.5312, -2.5508, -2.3555],\\n [-2.0664, -2.5430, -2.4102, ..., -2.4219, -2.4688, -2.2695],\\n ...,\\n [-2.0586, -2.5156, -2.4180, ..., -2.4297, -2.4844, -2.3047],\\n [-2.0977, -2.6172, -2.5117, ..., -2.5508, -2.5742, -2.3398],\\n [-1.7217, -2.1641, -2.1250, ..., -2.1445, -2.1875, -1.9170]]],\\n\\n\\n [[[-1.8701, -1.9922, -1.9639, ..., -1.9336, -1.8750, -1.7021],\\n [-2.2285, -2.3301, -2.2852, ..., -2.2617, -2.2168, -1.9326],\\n [-2.1797, -2.3203, -2.3008, ..., -2.2598, -2.2227, -1.9727],\\n ...,\\n [-2.1895, -2.3145, -2.2852, ..., -2.2441, -2.2148, -1.9580],\\n [-2.0586, -2.2207, -2.2285, ..., -2.2188, -2.1523, -1.9570],\\n [-1.7422, -1.9463, -1.9316, ..., -1.9160, -1.8799, -1.3164]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2828, 0.9421, ..., 4.2095, -1.9805, 0.6990],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [914198591], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"10\", \"6\", \"3\", \"8\", \"1\", \"5\", \"7\", \"9\", \"4\", \"2\"], \"timestamp\": 1781523146046}]]}"}
+2026-06-15 13:32:26,457 - INFO - Flagging image imgxx.png (moving to failed directory)
+2026-06-15 13:33:25,460 - INFO - Starting processing for imgxx.png...
+2026-06-15 13:33:25,461 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxx.png to (0, 0, 100, 149)
+2026-06-15 13:33:25,463 - INFO - Calling API for imgxx.png with prompt: high quality, detailed, make nude
+2026-06-15 13:36:17,189 - INFO - Successfully processed imgxx.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/imgxx.png
+2026-06-15 13:43:19,473 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:43:19,473 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:43:19,473 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:43:21,473 - INFO - Updating hash for previously processed imgxx.png
+2026-06-15 13:44:33,307 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 13:44:33,308 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 13:44:33,308 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 13:44:35,308 - INFO - Starting processing for img_1.png...
+2026-06-15 13:44:35,314 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (0, 0, 168, 247)
+2026-06-15 13:44:35,324 - INFO - Calling API for img_1.png with prompt: high quality, detailed, female nude
+2026-06-15 13:46:51,796 - INFO - Successfully processed img_1.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_1.png
+2026-06-15 13:48:30,811 - INFO - Updating hash for previously processed img_2.png
+2026-06-15 13:50:39,830 - INFO - Updating hash for previously processed img_3.png
+2026-06-15 13:51:00,834 - INFO - Updating hash for previously processed img_4.png
+2026-06-15 13:51:11,836 - INFO - Updating hash for previously processed img_5.png
+2026-06-15 13:51:19,837 - INFO - Starting processing for img_6.png...
+2026-06-15 13:51:19,838 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6.png to (2, 20, 77, 156)
+2026-06-15 13:51:19,839 - INFO - Calling API for img_6.png with prompt: high quality, detailed, female nude
+2026-06-15 13:53:25,795 - INFO - Successfully processed img_6.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_6.png
+2026-06-15 13:53:34,797 - INFO - Starting processing for img_7.png...
+2026-06-15 13:53:34,798 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_7.png to (17, 55, 126, 337)
+2026-06-15 13:53:34,802 - INFO - Calling API for img_7.png with prompt: high quality, detailed, female nude
+2026-06-15 13:54:06,112 - ERROR - API failed for img_7.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"4a333a86-0977-4b0b-b5d3-fa8f5115c90a\", \"timestamp\": 1781524414818}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\"], \"prompt_id\": \"4a333a86-0977-4b0b-b5d3-fa8f5115c90a\", \"timestamp\": 1781524414820}], [\"execution_error\", {\"prompt_id\": \"4a333a86-0977-4b0b-b5d3-fa8f5115c90a\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"5\", \"7\", \"4\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.85 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0950, ..., 1.9621, -0.3675, 0.7183],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [ 3.6761, 0.4485, -1.8449, ..., -8.1039, -0.2519, 2.6441],\\n [-0.0701, 1.7638, -0.5389, ..., 1.0265, 0.6482, 1.0115],\\n [-3.2631, 1.1544, 2.9430, ..., -0.5577, 0.3365, 0.6254]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.3047e-01, -7.1777e-01, -7.8809e-01, ..., -7.6660e-01,\\n -7.1289e-01, -8.0664e-01],\\n [-5.8594e-01, -8.9551e-01, -9.0820e-01, ..., -8.7402e-01,\\n -8.4863e-01, -6.9727e-01],\\n [-6.4062e-01, -9.0137e-01, -8.9453e-01, ..., -8.7500e-01,\\n -8.5156e-01, -7.4512e-01],\\n ...,\\n [-6.5723e-01, -9.0137e-01, -8.8672e-01, ..., -8.6035e-01,\\n -8.5352e-01, -7.3828e-01],\\n [-5.8984e-01, -8.5645e-01, -8.6719e-01, ..., -8.4961e-01,\\n -8.4961e-01, -6.4648e-01],\\n [-5.7520e-01, -5.9180e-01, -6.1523e-01, ..., -5.7715e-01,\\n -4.8145e-01, -7.5293e-01]]],\\n\\n\\n [[[ 1.7944e-02, 1.4233e-01, 1.8164e-01, ..., 1.8762e-01,\\n 1.9324e-01, -6.4392e-03],\\n [-1.4038e-03, 6.8726e-02, 6.7749e-02, ..., 9.2651e-02,\\n 1.0608e-01, -2.3926e-02],\\n [-4.9683e-02, -6.6223e-03, 3.4607e-02, ..., 5.6946e-02,\\n 4.7668e-02, -4.6265e-02],\\n ...,\\n [-4.0222e-02, 8.7891e-03, 4.9133e-02, ..., 6.8726e-02,\\n 6.0852e-02, -3.1677e-02],\\n [ 2.3254e-02, 5.4016e-02, 5.2124e-02, ..., 9.8755e-02,\\n 6.1951e-02, -6.1218e-02],\\n [ 2.6392e-01, 1.6968e-01, 1.7688e-01, ..., 1.7676e-01,\\n 1.7725e-01, -1.1981e-01]]],\\n\\n\\n [[[-2.6582e+00, -3.1094e+00, -3.0566e+00, ..., -3.0352e+00,\\n -3.0137e+00, -2.8066e+00],\\n [-2.8730e+00, -3.2109e+00, -3.2363e+00, ..., -3.2031e+00,\\n -3.1758e+00, -2.9805e+00],\\n [-2.8535e+00, -3.1914e+00, -3.2031e+00, ..., -3.1621e+00,\\n -3.1211e+00, -2.9531e+00],\\n ...,\\n [-2.8457e+00, -3.1836e+00, -3.1934e+00, ..., -3.1641e+00,\\n -3.1230e+00, -2.9551e+00],\\n [-2.7578e+00, -3.1289e+00, -3.1621e+00, ..., -3.1387e+00,\\n -3.1211e+00, -2.9961e+00],\\n [-2.6680e+00, -3.2598e+00, -3.2422e+00, ..., -3.2598e+00,\\n -3.2207e+00, -2.9473e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4917e-01, 2.8467e-01, 1.4697e-01, ..., 1.3757e-01,\\n 2.6904e-01, -1.2878e-01],\\n [ 1.6809e-01, 2.2754e-01, 1.8823e-01, ..., 1.9324e-01,\\n 2.8125e-01, -1.7236e-01],\\n [ 1.2524e-01, 2.1777e-01, 1.8250e-01, ..., 1.9299e-01,\\n 2.7393e-01, -2.2778e-01],\\n ...,\\n [ 1.3281e-01, 2.2034e-01, 2.0203e-01, ..., 2.3853e-01,\\n 2.9346e-01, -2.0105e-01],\\n [ 8.8928e-02, 2.3914e-01, 1.9617e-01, ..., 2.0850e-01,\\n 3.0933e-01, -2.1362e-01],\\n [-2.4243e-01, 8.9233e-02, -6.7627e-02, ..., -1.3153e-02,\\n 2.6886e-02, -3.1152e-01]]],\\n\\n\\n [[[-1.4355e+00, -1.8311e+00, -1.8311e+00, ..., -1.8271e+00,\\n -1.8525e+00, -1.8076e+00],\\n [-2.1445e+00, -2.6367e+00, -2.5039e+00, ..., -2.5273e+00,\\n -2.5469e+00, -2.3477e+00],\\n [-2.0625e+00, -2.5391e+00, -2.4062e+00, ..., -2.4219e+00,\\n -2.4648e+00, -2.2656e+00],\\n ...,\\n [-2.0547e+00, -2.5156e+00, -2.4141e+00, ..., -2.4297e+00,\\n -2.4805e+00, -2.2969e+00],\\n [-2.0938e+00, -2.6172e+00, -2.5078e+00, ..., -2.5508e+00,\\n -2.5703e+00, -2.3359e+00],\\n [-1.7148e+00, -2.1602e+00, -2.1211e+00, ..., -2.1367e+00,\\n -2.1797e+00, -1.9033e+00]]],\\n\\n\\n [[[-1.8740e+00, -1.9980e+00, -1.9688e+00, ..., -1.9365e+00,\\n -1.8799e+00, -1.7051e+00],\\n [-2.2324e+00, -2.3359e+00, -2.2871e+00, ..., -2.2656e+00,\\n -2.2227e+00, -1.9346e+00],\\n [-2.1836e+00, -2.3262e+00, -2.3066e+00, ..., -2.2637e+00,\\n -2.2305e+00, -1.9766e+00],\\n ...,\\n [-2.1934e+00, -2.3203e+00, -2.2910e+00, ..., -2.2500e+00,\\n -2.2227e+00, -1.9629e+00],\\n [-2.0625e+00, -2.2266e+00, -2.2383e+00, ..., -2.2246e+00,\\n -2.1602e+00, -1.9619e+00],\\n [-1.7480e+00, -1.9551e+00, -1.9385e+00, ..., -1.9229e+00,\\n -1.8887e+00, -1.3223e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4292, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2828, 0.9421, ..., 4.2095, -1.9805, 0.6990],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5245, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [187690847], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"10\", \"6\", \"3\", \"8\", \"1\", \"5\", \"7\", \"9\", \"4\", \"2\"], \"timestamp\": 1781524445880}]]}"}
+2026-06-15 13:54:06,112 - INFO - Flagging image img_7.png (moving to failed directory)
+2026-06-15 14:00:29,367 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:00:29,367 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:00:29,367 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:01:14,373 - INFO - Starting processing for img_7.png...
+2026-06-15 14:01:14,378 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_7.png to (17, 55, 126, 337)
+2026-06-15 14:01:14,381 - INFO - Calling API for img_7.png with prompt: high quality, detailed, female nude
+2026-06-15 14:03:19,709 - INFO - Successfully processed img_7.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_7.png
+2026-06-15 14:04:38,721 - INFO - Starting processing for img_6.png...
+2026-06-15 14:04:38,721 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6.png to (16, 54, 122, 323)
+2026-06-15 14:04:38,725 - INFO - Calling API for img_6.png with prompt: high quality, detailed, female nude
+2026-06-15 14:05:12,947 - ERROR - API failed for img_6.png: 500 - {"detail":"ComfyUI execution error: {\"status_str\": \"error\", \"completed\": false, \"messages\": [[\"execution_start\", {\"prompt_id\": \"3b000353-94c9-4671-8c82-00bc7a885f9d\", \"timestamp\": 1781525078768}], [\"execution_cached\", {\"nodes\": [\"1\", \"2\", \"3\", \"6\"], \"prompt_id\": \"3b000353-94c9-4671-8c82-00bc7a885f9d\", \"timestamp\": 1781525078776}], [\"execution_error\", {\"prompt_id\": \"3b000353-94c9-4671-8c82-00bc7a885f9d\", \"node_id\": \"8\", \"node_type\": \"KSampler\", \"executed\": [\"4\", \"5\", \"7\"], \"exception_message\": \"HIP out of memory. Tried to allocate 4.24 GiB. GPU \\nThis error means you ran out of memory on your GPU.\\n\\nTIPS: If the workflow worked before you might have accidentally set the batch_size to a large number.\", \"exception_type\": \"torch.cuda.OutOfMemoryError\", \"traceback\": [\" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 510, in execute\\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 324, in get_output_data\\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, hidden_inputs=hidden_inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 298, in _async_map_node_over_list\\n await process_inputs(input_dict, i)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/execution.py\\\", line 286, in process_inputs\\n result = f(**inputs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1535, in sample\\n return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/nodes.py\\\", line 1502, in common_ksampler\\n samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/sample.py\\\", line 60, in sample\\n samples = sampler.sample(noise, positive, negative, cfg=cfg, latent_image=latent_image, start_step=start_step, last_step=last_step, force_full_denoise=force_full_denoise, denoise_mask=noise_mask, sigmas=sigmas, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1163, in sample\\n return sample(self.model, noise, positive, negative, cfg, self.device, sampler, sigmas, self.model_options, latent_image=latent_image, denoise_mask=denoise_mask, callback=callback, disable_pbar=disable_pbar, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1053, in sample\\n return cfg_guider.sample(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 1035, in sample\\n output = executor.execute(noise, latent_image, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 997, in outer_sample\\n output = self.inner_sample(noise, latent_image, device, sampler, sigmas, denoise_mask, callback, disable_pbar, seed, latent_shapes=latent_shapes)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 980, in inner_sample\\n samples = executor.execute(self, sigmas, extra_args, callback, noise, latent_image, denoise_mask, disable_pbar)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 752, in sample\\n samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 212, in sample_euler_ancestral\\n return sample_euler_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/utils/_contextlib.py\\\", line 115, in decorate_context\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/k_diffusion/sampling.py\\\", line 241, in sample_euler_ancestral_RF\\n denoised = model(x, sigmas[i] * s_in, **extra_args)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 401, in __call__\\n out = self.inner_model(x, sigma, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 953, in __call__\\n return self.outer_predict_noise(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 960, in outer_predict_noise\\n ).execute(x, timestep, model_options, seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 963, in predict_noise\\n return sampling_function(self.inner_model, x, timestep, self.conds.get(\\\"negative\\\", None), self.conds.get(\\\"positive\\\", None), self.cfg, model_options=model_options, seed=seed)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 381, in sampling_function\\n out = calc_cond_batch(model, conds, x, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 206, in calc_cond_batch\\n return _calc_cond_batch_outer(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 214, in _calc_cond_batch_outer\\n return executor.execute(model, conds, x_in, timestep, model_options)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/samplers.py\\\", line 326, in _calc_cond_batch\\n output = model.apply_model(input_x, timestep_, **c).chunk(batch_chunks)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 161, in apply_model\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/model_base.py\\\", line 203, in _apply_model\\n model_output = self.diffusion_model(xc, t, context=context, control=control, transformer_options=transformer_options, **extra_conds)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 369, in forward\\n return comfy.patcher_extension.WrapperExecutor.new_class_executor(\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/patcher_extension.py\\\", line 112, in execute\\n return self.original(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 455, in _forward\\n encoder_hidden_states, hidden_states = block(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 244, in forward\\n img_attn_output, txt_attn_output = self.attn(\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1532, in _wrapped_call_impl\\n return self._call_impl(*args, **kwargs)\\n\", \" File \\\"/home/tour/comfyui-venv/lib/python3.10/site-packages/torch/nn/modules/module.py\\\", line 1541, in _call_impl\\n return forward_call(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/qwen_image/model.py\\\", line 163, in forward\\n joint_hidden_states = optimized_attention_masked(joint_query, joint_key, joint_value, self.heads,\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 130, in wrapper\\n return func(*args, **kwargs)\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 377, in attention_split\\n raise e\\n\", \" File \\\"/media/tour/APPS/comfyui/ComfyUI/comfy/ldm/modules/attention.py\\\", line 350, in attention_split\\n s1 = einsum('b i d, b j d -> b i j', q[:, i:end], k) * scale\\n\"], \"current_inputs\": {\"model\": [\"\"], \"positive\": [\"[[tensor([[[ 2.7932, 3.2124, 3.1258, ..., 0.1170, 2.0975, 1.4234],\\n [ 3.1452, 1.6406, 1.0951, ..., 1.9621, -0.3675, 0.7182],\\n [ 2.0712, 1.3250, 3.3188, ..., 0.6716, 2.5958, 0.9986],\\n ...,\\n [ 2.2898, 2.2743, -2.7262, ..., -7.1275, 1.4487, 1.1452],\\n [ 0.0967, 1.9226, -0.5821, ..., 1.2608, 0.7570, 0.8646],\\n [-3.6808, 1.6141, 2.9197, ..., -0.1896, 0.6413, 0.4796]]]), {'pooled_output': None, 'reference_latents': [tensor([[[[[-7.3242e-01, -7.1973e-01, -7.9004e-01, ..., -7.6855e-01,\\n -7.1582e-01, -8.0957e-01],\\n [-5.8789e-01, -8.9746e-01, -9.1113e-01, ..., -8.7793e-01,\\n -8.5352e-01, -7.0312e-01],\\n [-6.4258e-01, -9.0430e-01, -8.9746e-01, ..., -8.7695e-01,\\n -8.5449e-01, -7.5000e-01],\\n ...,\\n [-6.5918e-01, -9.0430e-01, -8.8965e-01, ..., -8.6426e-01,\\n -8.5840e-01, -7.4316e-01],\\n [-5.9375e-01, -8.5840e-01, -8.7012e-01, ..., -8.5156e-01,\\n -8.5547e-01, -6.5234e-01],\\n [-5.8105e-01, -5.9766e-01, -6.2109e-01, ..., -5.8203e-01,\\n -4.8853e-01, -7.6172e-01]]],\\n\\n\\n [[[ 1.6479e-02, 1.4087e-01, 1.7993e-01, ..., 1.8591e-01,\\n 1.9055e-01, -1.0437e-02],\\n [-3.2349e-03, 6.7261e-02, 6.5735e-02, ..., 9.0820e-02,\\n 1.0376e-01, -2.7130e-02],\\n [-5.2338e-02, -8.7585e-03, 3.2410e-02, ..., 5.4932e-02,\\n 4.5288e-02, -4.9072e-02],\\n ...,\\n [-4.2603e-02, 7.0496e-03, 4.7852e-02, ..., 6.6284e-02,\\n 5.9875e-02, -3.4698e-02],\\n [ 2.1484e-02, 5.2002e-02, 5.0415e-02, ..., 9.7046e-02,\\n 5.9937e-02, -6.3538e-02],\\n [ 2.5879e-01, 1.6541e-01, 1.7346e-01, ..., 1.7371e-01,\\n 1.7297e-01, -1.2744e-01]]],\\n\\n\\n [[[-2.6543e+00, -3.1035e+00, -3.0508e+00, ..., -3.0312e+00,\\n -3.0098e+00, -2.8008e+00],\\n [-2.8672e+00, -3.2051e+00, -3.2285e+00, ..., -3.1953e+00,\\n -3.1680e+00, -2.9727e+00],\\n [-2.8496e+00, -3.1855e+00, -3.1953e+00, ..., -3.1543e+00,\\n -3.1133e+00, -2.9453e+00],\\n ...,\\n [-2.8398e+00, -3.1758e+00, -3.1855e+00, ..., -3.1562e+00,\\n -3.1152e+00, -2.9492e+00],\\n [-2.7520e+00, -3.1191e+00, -3.1523e+00, ..., -3.1289e+00,\\n -3.1074e+00, -2.9863e+00],\\n [-2.6602e+00, -3.2520e+00, -3.2344e+00, ..., -3.2520e+00,\\n -3.2109e+00, -2.9395e+00]]],\\n\\n\\n ...,\\n\\n\\n [[[ 1.4319e-01, 2.7686e-01, 1.3965e-01, ..., 1.3013e-01,\\n 2.6074e-01, -1.3867e-01],\\n [ 1.5942e-01, 2.1655e-01, 1.7737e-01, ..., 1.8164e-01,\\n 2.6929e-01, -1.8481e-01],\\n [ 1.1707e-01, 2.0752e-01, 1.7139e-01, ..., 1.8115e-01,\\n 2.6123e-01, -2.4048e-01],\\n ...,\\n [ 1.2433e-01, 2.0935e-01, 1.8896e-01, ..., 2.2595e-01,\\n 2.7979e-01, -2.1362e-01],\\n [ 8.0078e-02, 2.2778e-01, 1.8347e-01, ..., 1.9592e-01,\\n 2.9492e-01, -2.2607e-01],\\n [-2.5391e-01, 7.5989e-02, -8.0566e-02, ..., -2.6245e-02,\\n 1.2390e-02, -3.2666e-01]]],\\n\\n\\n [[[-1.4395e+00, -1.8340e+00, -1.8330e+00, ..., -1.8301e+00,\\n -1.8564e+00, -1.8125e+00],\\n [-2.1484e+00, -2.6367e+00, -2.5078e+00, ..., -2.5312e+00,\\n -2.5508e+00, -2.3555e+00],\\n [-2.0664e+00, -2.5430e+00, -2.4102e+00, ..., -2.4258e+00,\\n -2.4688e+00, -2.2695e+00],\\n ...,\\n [-2.0586e+00, -2.5156e+00, -2.4180e+00, ..., -2.4336e+00,\\n -2.4844e+00, -2.3047e+00],\\n [-2.0977e+00, -2.6211e+00, -2.5117e+00, ..., -2.5547e+00,\\n -2.5742e+00, -2.3398e+00],\\n [-1.7227e+00, -2.1641e+00, -2.1250e+00, ..., -2.1406e+00,\\n -2.1875e+00, -1.9131e+00]]],\\n\\n\\n [[[-1.8711e+00, -1.9951e+00, -1.9648e+00, ..., -1.9336e+00,\\n -1.8750e+00, -1.7021e+00],\\n [-2.2305e+00, -2.3320e+00, -2.2832e+00, ..., -2.2617e+00,\\n -2.2168e+00, -1.9326e+00],\\n [-2.1797e+00, -2.3223e+00, -2.3027e+00, ..., -2.2617e+00,\\n -2.2246e+00, -1.9736e+00],\\n ...,\\n [-2.1914e+00, -2.3164e+00, -2.2871e+00, ..., -2.2461e+00,\\n -2.2168e+00, -1.9600e+00],\\n [-2.0586e+00, -2.2227e+00, -2.2324e+00, ..., -2.2207e+00,\\n -2.1543e+00, -1.9590e+00],\\n [-1.7461e+00, -1.9492e+00, -1.9346e+00, ..., -1.9170e+00,\\n -1.8818e+00, -1.3203e+00]]]]])]}]]\"], \"negative\": [\"[[tensor([[[-2.8345, 2.8925, -1.1764, ..., 2.8619, -0.4924, 6.0664],\\n [ 4.5607, -2.6035, -1.0634, ..., -2.6374, 1.4293, 3.6139],\\n [ 1.6222, 1.7951, 3.8607, ..., 6.5530, 1.3724, -0.6262],\\n [ 2.4885, 0.2828, 0.9421, ..., 4.2096, -1.9805, 0.6991],\\n [-1.0774, 3.2587, 0.2587, ..., 1.6220, 1.8625, -0.9349],\\n [-1.5244, 2.9254, 3.4670, ..., 1.6019, 0.8417, -1.0554]]]), {'pooled_output': None}]]\"], \"latent_image\": [\"{'samples': tensor([[[[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n ...,\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]],\\n\\n [[0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n ...,\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.],\\n [0., 0., 0., ..., 0., 0., 0.]]]])}\"], \"seed\": [820056534], \"steps\": [4], \"cfg\": [1.0], \"sampler_name\": [\"euler_ancestral\"], \"scheduler\": [\"beta\"], \"denoise\": [1.0]}, \"current_outputs\": [\"1\", \"2\", \"5\", \"4\", \"6\", \"10\", \"9\", \"3\", \"8\", \"7\"], \"timestamp\": 1781525112562}]]}"}
+2026-06-15 14:05:12,947 - INFO - Flagging image img_6.png (moving to failed directory)
+2026-06-15 14:05:19,948 - INFO - Starting processing for img_1.png...
+2026-06-15 14:05:19,949 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_1.png to (22, 46, 155, 282)
+2026-06-15 14:05:19,951 - INFO - Calling API for img_1.png with prompt: high quality, detailed, female nude
+2026-06-15 14:07:39,324 - INFO - Successfully processed img_1.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_1.png
+2026-06-15 14:07:44,325 - INFO - Starting processing for img_8.png...
+2026-06-15 14:07:44,326 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_8.png to (12, 50, 100, 301)
+2026-06-15 14:07:44,328 - INFO - Calling API for img_8.png with prompt: high quality, detailed, female nude
+2026-06-15 14:10:14,340 - INFO - Successfully processed img_8.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_8.png
+2026-06-15 14:10:24,342 - INFO - Starting processing for img_6.png...
+2026-06-15 14:10:24,342 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6.png to (16, 48, 134, 284)
+2026-06-15 14:10:24,344 - INFO - Calling API for img_6.png with prompt: high quality, detailed, female nude
+2026-06-15 14:13:15,895 - INFO - Successfully processed img_6.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_6.png
+2026-06-15 14:13:32,013 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:13:32,013 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:13:32,013 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:14:06,018 - INFO - Starting processing for img_9.png...
+2026-06-15 14:14:06,023 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_9.png to (23, 46, 154, 283)
+2026-06-15 14:14:06,025 - INFO - Calling API for img_9.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:16:33,480 - INFO - Successfully processed img_9.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/img_9.png
+2026-06-15 14:21:06,643 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:21:06,643 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:21:06,643 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:21:21,645 - INFO - Starting processing for test_timestamp.png...
+2026-06-15 14:21:21,649 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test_timestamp.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 14:21:21,649 - INFO - Calling API for test_timestamp.png -> 20260615_142121_test_timestamp.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:21:34,891 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:21:34,891 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:21:34,891 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:21:36,892 - INFO - Starting processing for test_timestamp.png...
+2026-06-15 14:21:36,896 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test_timestamp.png is mode RGB, not RGBA. Skipping crop.
+2026-06-15 14:21:36,897 - INFO - Calling API for test_timestamp.png -> 20260615_142136_test_timestamp.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:21:50,848 - INFO - Flagging image test_timestamp.png (moving to failed directory as 20260615_142150_test_timestamp.png)
+2026-06-15 14:25:51,916 - INFO - Successfully processed test_timestamp.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_142136_test_timestamp.png
+2026-06-15 14:27:05,019 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:27:05,019 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:27:05,019 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:28:01,027 - INFO - Starting processing for img_91.png...
+2026-06-15 14:28:01,033 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_91.png to (23, 46, 154, 283)
+2026-06-15 14:28:01,036 - INFO - Calling API for img_91.png -> 20260615_142801_img_91.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:28:04,937 - INFO - Starting processing for img_91.png...
+2026-06-15 14:28:04,938 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_91.png to (23, 46, 154, 283)
+2026-06-15 14:28:04,940 - INFO - Calling API for img_91.png -> 20260615_142804_img_91.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:32:36,134 - INFO - Successfully processed img_91.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_142801_img_91.png
+2026-06-15 14:32:36,135 - INFO - Successfully processed img_91.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_142804_img_91.png
+2026-06-15 14:35:08,801 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:35:08,801 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:35:08,801 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:35:14,161 - INFO - Starting processing for img_92.png...
+2026-06-15 14:35:14,162 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_92.png to (23, 46, 154, 283)
+2026-06-15 14:35:14,164 - INFO - Calling API for img_92.png -> 20260615_143514_img_92.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:35:16,803 - INFO - Starting processing for img_92.png...
+2026-06-15 14:35:16,810 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_92.png to (23, 46, 154, 283)
+2026-06-15 14:35:16,812 - INFO - Calling API for img_92.png -> 20260615_143516_img_92.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:36:40,297 - INFO - Successfully processed img_92.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_143514_img_92.png
+2026-06-15 14:37:56,384 - INFO - Successfully processed img_92.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_143516_img_92.png
+2026-06-15 14:43:13,379 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:43:13,379 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:43:13,379 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:45:46,538 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:45:46,538 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:45:46,538 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:45:54,539 - INFO - Starting processing for img_92.png...
+2026-06-15 14:45:54,544 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_92.png to (23, 46, 154, 283)
+2026-06-15 14:45:54,546 - INFO - Calling API for img_92.png -> 20260615_144554_img_92.png with prompt: high quality, detailed, full face, female nude
+2026-06-15 14:48:00,034 - INFO - Successfully processed img_92.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_144554_img_92.png
+2026-06-15 14:50:00,000 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 14:50:00,000 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 14:50:00,000 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 14:50:17,002 - INFO - Starting processing for img_93.png...
+2026-06-15 14:50:17,007 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_93.png to (23, 46, 154, 283)
+2026-06-15 14:50:17,009 - INFO - Calling API for img_93.png -> 20260615_145017_img_93.png with prompt: high quality, detailed, make female nude
+2026-06-15 14:52:17,938 - INFO - Successfully processed img_93.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_145017_img_93.png
+2026-06-15 14:55:45,970 - INFO - Starting processing for img_93.png...
+2026-06-15 14:55:45,970 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_93.png to (0, 0, 80, 204)
+2026-06-15 14:55:45,972 - INFO - Calling API for img_93.png -> 20260615_145545_img_93.png with prompt: high quality, detailed, make female nude
+2026-06-15 14:57:56,500 - INFO - Successfully processed img_93.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_145545_img_93.png
+2026-06-15 15:03:40,557 - INFO - Starting processing for test.png...
+2026-06-15 15:03:40,558 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test.png to (31, 55, 145, 331)
+2026-06-15 15:03:40,562 - INFO - Calling API for test.png -> 20260615_150340_test.png with prompt: high quality, detailed, make female nude
+2026-06-15 15:06:05,604 - INFO - Successfully processed test.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_150340_test.png
+2026-06-15 15:08:12,625 - INFO - Starting processing for img_19_2.png...
+2026-06-15 15:08:12,626 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_19_2.png to (23, 17, 151, 161)
+2026-06-15 15:08:12,627 - INFO - Calling API for img_19_2.png -> 20260615_150812_img_19_2.png with prompt: high quality, detailed, make female nude
+2026-06-15 15:10:44,304 - INFO - Successfully processed img_19_2.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_150812_img_19_2.png
+2026-06-15 15:14:39,448 - INFO - Cropping test_alpha.png to (10, 10, 90, 160) (margin=10, top_margin=40)
+2026-06-15 15:14:39,448 - INFO - Adding 15px headroom to test_alpha.png
+2026-06-15 15:14:39,448 - INFO - Cropping test_alpha.png to (10, 10, 90, 160) (margin=10, top_margin=40)
+2026-06-15 15:16:11,850 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 15:16:11,850 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 15:16:11,850 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 15:16:14,850 - INFO - Starting processing for img_93.png...
+2026-06-15 15:16:14,854 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_93.png to (0, 0, 80, 204) (margin=10, top_margin=40)
+2026-06-15 15:16:14,854 - INFO - Adding 20px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_93.png
+2026-06-15 15:16:14,856 - INFO - Calling API for img_93.png -> 20260615_151614_img_93.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:18:22,878 - INFO - Successfully processed img_93.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_151614_img_93.png
+2026-06-15 15:18:29,880 - INFO - Starting processing for img_92.png...
+2026-06-15 15:18:29,880 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_92.png to (23, 16, 154, 283) (margin=10, top_margin=40)
+2026-06-15 15:18:29,880 - INFO - Adding 26px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_92.png
+2026-06-15 15:18:29,883 - INFO - Calling API for img_92.png -> 20260615_151829_img_92.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:21:24,211 - INFO - Successfully processed img_92.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_151829_img_92.png
+2026-06-15 15:22:52,225 - INFO - Starting processing for imgxxx.png...
+2026-06-15 15:22:52,227 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxxx.png to (0, 0, 168, 247) (margin=10, top_margin=40)
+2026-06-15 15:22:52,227 - INFO - Adding 24px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxxx.png
+2026-06-15 15:22:52,236 - INFO - Calling API for imgxxx.png -> 20260615_152252_imgxxx.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:25:30,461 - INFO - Successfully processed imgxxx.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_152252_imgxxx.png
+2026-06-15 15:28:26,487 - INFO - Starting processing for img.png...
+2026-06-15 15:28:26,487 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img.png to (16, 18, 134, 284) (margin=10, top_margin=40)
+2026-06-15 15:28:26,487 - INFO - Adding 26px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img.png
+2026-06-15 15:28:26,490 - INFO - Calling API for img.png -> 20260615_152826_img.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:31:02,137 - INFO - Successfully processed img.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_152826_img.png
+2026-06-15 15:31:25,141 - INFO - Starting processing for img_10.png...
+2026-06-15 15:31:25,141 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_10.png to (18, 24, 139, 318) (margin=10, top_margin=40)
+2026-06-15 15:31:25,141 - INFO - Adding 29px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_10.png
+2026-06-15 15:31:25,144 - INFO - Calling API for img_10.png -> 20260615_153125_img_10.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:34:13,430 - INFO - Successfully processed img_10.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_153125_img_10.png
+2026-06-15 15:34:26,432 - INFO - Starting processing for img_12.png...
+2026-06-15 15:34:26,433 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_12.png to (14, 54, 166, 456) (margin=10, top_margin=40)
+2026-06-15 15:34:26,433 - INFO - Adding 40px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_12.png
+2026-06-15 15:34:26,438 - INFO - Calling API for img_12.png -> 20260615_153426_img_12.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:37:23,789 - INFO - Successfully processed img_12.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_153426_img_12.png
+2026-06-15 15:37:30,790 - INFO - Starting processing for img_11.png...
+2026-06-15 15:37:30,791 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_11.png to (26, 46, 189, 340) (margin=10, top_margin=20)
+2026-06-15 15:37:30,791 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_11.png
+2026-06-15 15:37:30,795 - INFO - Calling API for img_11.png -> 20260615_153730_img_11.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:37:41,758 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 15:37:41,758 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 15:37:41,758 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 15:37:49,760 - INFO - Starting processing for img_11.png...
+2026-06-15 15:37:49,765 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_11.png to (26, 46, 189, 340) (margin=10, top_margin=20)
+2026-06-15 15:37:49,765 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_11.png
+2026-06-15 15:37:49,768 - INFO - Calling API for img_11.png -> 20260615_153749_img_11.png with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:43:02,749 - INFO - Successfully processed img_11.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_153749_img_11.png
+2026-06-15 15:43:33,754 - INFO - Starting processing for other.jpeg...
+2026-06-15 15:43:33,754 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/other.jpeg is mode RGB, not RGBA. Skipping crop.
+2026-06-15 15:43:34,195 - INFO - Calling API for other.jpeg -> 20260615_154333_other.jpeg with prompt: high quality, detailed, female nude, full head, full hair
+2026-06-15 15:46:23,727 - INFO - Successfully processed other.jpeg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_154333_other.jpeg
+2026-06-15 15:48:12,971 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 15:48:12,971 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 15:48:12,971 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 15:48:52,980 - INFO - Starting processing for other.jpeg...
+2026-06-15 15:48:52,984 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/other.jpeg is mode RGB, not RGBA. Skipping crop.
+2026-06-15 15:48:53,152 - INFO - Calling API for other.jpeg -> 20260615_154852_other.jpeg with prompt: high quality, detailed, female nude, full head, show hair
+2026-06-15 15:51:23,877 - INFO - Successfully processed other.jpeg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_154852_other.jpeg
+2026-06-15 15:53:06,979 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-15 15:53:06,979 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-15 15:53:06,979 - INFO - API URL: http://192.168.1.160:8500/edit
+2026-06-15 15:53:54,987 - INFO - Starting processing for others.jpeg...
+2026-06-15 15:53:54,990 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/others.jpeg is mode RGB, not RGBA. Skipping crop.
+2026-06-15 15:53:55,156 - INFO - Calling API for others.jpeg -> 20260615_155354_others.jpeg with prompt: high quality, detailed, female nude
+2026-06-15 15:55:56,202 - INFO - Successfully processed others.jpeg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_155354_others.jpeg
+2026-06-15 15:57:56,224 - INFO - Starting processing for img_6v1.png...
+2026-06-15 15:57:56,225 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6v1.png to (16, 38, 134, 284) (margin=10, top_margin=20)
+2026-06-15 15:57:56,225 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_6v1.png
+2026-06-15 15:57:56,227 - INFO - Calling API for img_6v1.png -> 20260615_155756_img_6v1.png with prompt: high quality, detailed, female nude
+2026-06-15 16:00:17,637 - INFO - Successfully processed img_6v1.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260615_155756_img_6v1.png
+2026-06-16 00:21:49,045 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-16 00:21:49,045 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-16 00:21:49,045 - INFO - API URL: http://127.0.0.1:8500/edit
+2026-06-16 00:23:02,099 - INFO - Starting processing for image.png...
+2026-06-16 00:23:02,111 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/image.png to (16, 38, 134, 284) (margin=10, top_margin=20)
+2026-06-16 00:23:02,112 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/image.png
+2026-06-16 00:23:02,114 - INFO - Calling API for image.png -> 20260616_002302_image.png with prompt: high quality, detailed, female nude
+2026-06-16 00:23:10,889 - INFO - Successfully processed image.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_002302_image.png
+2026-06-16 00:24:56,913 - INFO - Starting processing for test123.jpeg...
+2026-06-16 00:24:56,913 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/test123.jpeg is mode RGB, not RGBA. Skipping crop.
+2026-06-16 00:24:57,079 - INFO - Calling API for test123.jpeg -> 20260616_002456_test123.jpeg with prompt: high quality, detailed, female nude
+2026-06-16 00:25:05,744 - INFO - Successfully processed test123.jpeg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_002456_test123.jpeg
+2026-06-16 00:35:48,892 - INFO - Starting processing for img.png...
+2026-06-16 00:35:48,893 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img.png to (22, 31, 145, 265) (margin=10, top_margin=20)
+2026-06-16 00:35:48,893 - INFO - Adding 11px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img.png
+2026-06-16 00:35:48,895 - INFO - Calling API for img.png -> 20260616_003548_img.png with prompt: high quality, detailed, female nude
+2026-06-16 00:35:57,461 - INFO - Successfully processed img.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_003548_img.png
+2026-06-16 00:36:29,469 - INFO - Starting processing for img_13.png...
+2026-06-16 00:36:29,470 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_13.png to (24, 62, 155, 412) (margin=10, top_margin=20)
+2026-06-16 00:36:29,470 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_13.png
+2026-06-16 00:36:29,474 - INFO - Calling API for img_13.png -> 20260616_003629_img_13.png with prompt: high quality, detailed, female nude
+2026-06-16 00:36:38,048 - INFO - Successfully processed img_13.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_003629_img_13.png
+2026-06-16 00:38:03,067 - INFO - Starting processing for img_14.png...
+2026-06-16 00:38:03,067 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_14.png to (10, 33, 104, 288) (margin=10, top_margin=20)
+2026-06-16 00:38:03,067 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_14.png
+2026-06-16 00:38:03,070 - INFO - Calling API for img_14.png -> 20260616_003803_img_14.png with prompt: high quality, detailed, female nude
+2026-06-16 00:38:11,644 - INFO - Successfully processed img_14.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_003803_img_14.png
+2026-06-16 00:39:16,656 - INFO - Starting processing for img_15.png...
+2026-06-16 00:39:16,657 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_15.png to (8, 39, 100, 302) (margin=10, top_margin=20)
+2026-06-16 00:39:16,657 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_15.png
+2026-06-16 00:39:16,659 - INFO - Calling API for img_15.png -> 20260616_003916_img_15.png with prompt: high quality, detailed, female nude
+2026-06-16 00:39:25,230 - INFO - Successfully processed img_15.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_003916_img_15.png
+2026-06-16 00:40:01,240 - INFO - Starting processing for img_16.png...
+2026-06-16 00:40:01,241 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_16.png to (16, 32, 125, 265) (margin=10, top_margin=20)
+2026-06-16 00:40:01,241 - INFO - Adding 11px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_16.png
+2026-06-16 00:40:01,242 - INFO - Calling API for img_16.png -> 20260616_004001_img_16.png with prompt: high quality, detailed, female nude
+2026-06-16 00:40:10,215 - INFO - Successfully processed img_16.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_004001_img_16.png
+2026-06-16 00:42:20,246 - INFO - Starting processing for img_17.png...
+2026-06-16 00:42:20,246 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_17.png to (12, 34, 110, 274) (margin=10, top_margin=20)
+2026-06-16 00:42:20,246 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_17.png
+2026-06-16 00:42:20,248 - INFO - Calling API for img_17.png -> 20260616_004220_img_17.png with prompt: high quality, detailed, female nude
+2026-06-16 00:42:29,015 - INFO - Successfully processed img_17.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_004220_img_17.png
+2026-06-16 00:42:50,021 - INFO - Starting processing for img_18.png...
+2026-06-16 00:42:50,022 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_18.png to (14, 13, 110, 175) (margin=10, top_margin=20)
+2026-06-16 00:42:50,022 - INFO - Adding 8px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_18.png
+2026-06-16 00:42:50,023 - INFO - Calling API for img_18.png -> 20260616_004250_img_18.png with prompt: high quality, detailed, female nude
+2026-06-16 00:42:58,799 - INFO - Successfully processed img_18.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_004250_img_18.png
+2026-06-16 00:50:02,887 - INFO - Updating hash for previously processed img_19.png
+2026-06-16 00:52:02,913 - INFO - Starting processing for img_20.png...
+2026-06-16 00:52:02,913 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_20.png to (11, 40, 119, 354) (margin=10, top_margin=20)
+2026-06-16 00:52:02,914 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_20.png
+2026-06-16 00:52:02,916 - INFO - Calling API for img_20.png -> 20260616_005202_img_20.png with prompt: high quality, detailed, female nude
+2026-06-16 00:52:11,483 - INFO - Successfully processed img_20.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_005202_img_20.png
+2026-06-16 00:53:22,502 - INFO - Starting processing for img_run.png...
+2026-06-16 00:53:22,503 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_run.png to (18, 54, 138, 380) (margin=10, top_margin=20)
+2026-06-16 00:53:22,503 - INFO - Adding 16px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_run.png
+2026-06-16 00:53:22,506 - INFO - Calling API for img_run.png -> 20260616_005322_img_run.png with prompt: high quality, detailed, female nude
+2026-06-16 00:53:31,287 - INFO - Successfully processed img_run.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_005322_img_run.png
+2026-06-16 00:57:27,336 - INFO - Starting processing for img_19.png...
+2026-06-16 00:57:27,337 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_19.png to (27, 57, 175, 375) (margin=10, top_margin=20)
+2026-06-16 00:57:27,337 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_19.png
+2026-06-16 00:57:27,341 - INFO - Calling API for img_19.png -> 20260616_005727_img_19.png with prompt: high quality, detailed, female nude
+2026-06-16 00:57:35,914 - INFO - Successfully processed img_19.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_005727_img_19.png
+2026-06-16 00:57:52,918 - INFO - Starting processing for img_21.png...
+2026-06-16 00:57:52,919 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_21.png to (27, 57, 175, 375) (margin=10, top_margin=20)
+2026-06-16 00:57:52,919 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_21.png
+2026-06-16 00:57:52,923 - INFO - Calling API for img_21.png -> 20260616_005752_img_21.png with prompt: high quality, detailed, female nude
+2026-06-16 00:58:01,703 - INFO - Successfully processed img_21.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_005752_img_21.png
+2026-06-16 01:02:28,764 - INFO - Starting processing for img_22.png...
+2026-06-16 01:02:28,765 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_22.png to (12, 15, 97, 173) (margin=10, top_margin=20)
+2026-06-16 01:02:28,765 - INFO - Adding 7px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_22.png
+2026-06-16 01:02:28,766 - INFO - Calling API for img_22.png -> 20260616_010228_img_22.png with prompt: high quality, detailed, female nude
+2026-06-16 01:02:37,535 - INFO - Successfully processed img_22.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_010228_img_22.png
+2026-06-16 01:06:19,583 - INFO - Starting processing for img_23.png...
+2026-06-16 01:06:19,584 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_23.png to (23, 54, 174, 364) (margin=10, top_margin=20)
+2026-06-16 01:06:19,584 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_23.png
+2026-06-16 01:06:19,588 - INFO - Calling API for img_23.png -> 20260616_010619_img_23.png with prompt: high quality, detailed, female nude
+2026-06-16 01:06:28,157 - INFO - Successfully processed img_23.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_010619_img_23.png
+2026-06-16 01:14:47,261 - INFO - Starting processing for img_24.png...
+2026-06-16 01:14:47,262 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_24.png to (11, 42, 111, 304) (margin=10, top_margin=20)
+2026-06-16 01:14:47,262 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_24.png
+2026-06-16 01:14:47,264 - INFO - Calling API for img_24.png -> 20260616_011447_img_24.png with prompt: high quality, detailed, female nude
+2026-06-16 01:14:55,854 - INFO - Successfully processed img_24.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_011447_img_24.png
+2026-06-16 01:18:23,897 - INFO - Starting processing for imgxxxx.png...
+2026-06-16 01:18:23,898 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxxxx.png to (0, 0, 168, 247) (margin=10, top_margin=20)
+2026-06-16 01:18:23,898 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/imgxxxx.png
+2026-06-16 01:18:23,907 - INFO - Calling API for imgxxxx.png -> 20260616_011823_imgxxxx.png with prompt: high quality, detailed, female nude
+2026-06-16 01:18:32,503 - INFO - Successfully processed imgxxxx.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_011823_imgxxxx.png
+2026-06-16 01:29:39,637 - INFO - Starting processing for img_25.png...
+2026-06-16 01:29:39,638 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_25.png to (34, 47, 222, 341) (margin=10, top_margin=20)
+2026-06-16 01:29:39,638 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_25.png
+2026-06-16 01:29:39,642 - INFO - Calling API for img_25.png -> 20260616_012939_img_25.png with prompt: high quality, detailed, female nude
+2026-06-16 01:29:48,415 - INFO - Successfully processed img_25.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_012939_img_25.png
+2026-06-16 01:30:13,420 - INFO - Starting processing for img_26.png...
+2026-06-16 01:30:13,421 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_26.png to (26, 46, 182, 308) (margin=10, top_margin=20)
+2026-06-16 01:30:13,421 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_26.png
+2026-06-16 01:30:13,425 - INFO - Calling API for img_26.png -> 20260616_013013_img_26.png with prompt: high quality, detailed, female nude
+2026-06-16 01:30:21,999 - INFO - Successfully processed img_26.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_013013_img_26.png
+2026-06-16 01:36:03,071 - INFO - Starting processing for img_27.png...
+2026-06-16 01:36:03,072 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_27.png to (23, 52, 145, 346) (margin=10, top_margin=20)
+2026-06-16 01:36:03,072 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_27.png
+2026-06-16 01:36:03,075 - INFO - Calling API for img_27.png -> 20260616_013603_img_27.png with prompt: high quality, detailed, female nude
+2026-06-16 01:36:11,644 - INFO - Successfully processed img_27.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_013603_img_27.png
+2026-06-16 01:37:55,666 - INFO - Starting processing for img_28.png...
+2026-06-16 01:37:55,667 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_28.png to (31, 52, 203, 358) (margin=10, top_margin=20)
+2026-06-16 01:37:55,667 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_28.png
+2026-06-16 01:37:55,671 - INFO - Calling API for img_28.png -> 20260616_013755_img_28.png with prompt: high quality, detailed, female nude
+2026-06-16 01:38:04,232 - INFO - Successfully processed img_28.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_013755_img_28.png
+2026-06-16 01:40:57,271 - INFO - Starting processing for img_29.png...
+2026-06-16 01:40:57,272 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_29.png to (0, 0, 202, 449) (margin=10, top_margin=20)
+2026-06-16 01:40:57,273 - INFO - Adding 22px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_29.png
+2026-06-16 01:40:57,289 - INFO - Calling API for img_29.png -> 20260616_014057_img_29.png with prompt: high quality, detailed, female nude
+2026-06-16 01:41:05,910 - INFO - Successfully processed img_29.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_014057_img_29.png
+2026-06-16 01:42:25,929 - INFO - Starting processing for img_30.png...
+2026-06-16 01:42:25,929 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_30.png to (29, 50, 181, 364) (margin=10, top_margin=20)
+2026-06-16 01:42:25,929 - INFO - Adding 15px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_30.png
+2026-06-16 01:42:25,933 - INFO - Calling API for img_30.png -> 20260616_014225_img_30.png with prompt: high quality, detailed, female nude
+2026-06-16 01:42:34,501 - INFO - Successfully processed img_30.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_014225_img_30.png
+2026-06-16 01:47:57,571 - INFO - Starting processing for img_31.png...
+2026-06-16 01:47:57,572 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_31.png to (24, 49, 152, 335) (margin=10, top_margin=20)
+2026-06-16 01:47:57,572 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_31.png
+2026-06-16 01:47:57,575 - INFO - Calling API for img_31.png -> 20260616_014757_img_31.png with prompt: high quality, detailed, female nude
+2026-06-16 01:48:06,147 - INFO - Successfully processed img_31.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_014757_img_31.png
+2026-06-16 01:53:41,221 - INFO - Starting processing for img_32.png...
+2026-06-16 01:53:41,222 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_32.png to (13, 55, 129, 389) (margin=10, top_margin=20)
+2026-06-16 01:53:41,222 - INFO - Adding 16px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_32.png
+2026-06-16 01:53:41,225 - INFO - Calling API for img_32.png -> 20260616_015341_img_32.png with prompt: high quality, detailed, female nude
+2026-06-16 01:53:49,799 - INFO - Successfully processed img_32.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_015341_img_32.png
+2026-06-16 01:58:50,864 - INFO - Starting processing for img_34.png...
+2026-06-16 01:58:50,865 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_34.png to (40, 69, 180, 423) (margin=10, top_margin=20)
+2026-06-16 01:58:50,865 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_34.png
+2026-06-16 01:58:50,869 - INFO - Calling API for img_34.png -> 20260616_015850_img_34.png with prompt: high quality, detailed, female nude
+2026-06-16 01:58:59,440 - INFO - Successfully processed img_34.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_015850_img_34.png
+2026-06-16 01:59:19,444 - INFO - Starting processing for img_33.png...
+2026-06-16 01:59:19,446 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_33.png to (40, 69, 180, 423) (margin=10, top_margin=20)
+2026-06-16 01:59:19,446 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_33.png
+2026-06-16 01:59:19,449 - INFO - Calling API for img_33.png -> 20260616_015919_img_33.png with prompt: high quality, detailed, female nude
+2026-06-16 01:59:28,256 - INFO - Successfully processed img_33.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_015919_img_33.png
+2026-06-16 01:59:49,261 - INFO - Starting processing for img_37.png...
+2026-06-16 01:59:49,262 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_37.png to (29, 64, 193, 406) (margin=10, top_margin=20)
+2026-06-16 01:59:49,262 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_37.png
+2026-06-16 01:59:49,268 - INFO - Calling API for img_37.png -> 20260616_015949_img_37.png with prompt: high quality, detailed, female nude
+2026-06-16 01:59:58,264 - INFO - Successfully processed img_37.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_015949_img_37.png
+2026-06-16 02:00:20,270 - INFO - Starting processing for img_35.png...
+2026-06-16 02:00:20,271 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_35.png to (34, 75, 262, 473) (margin=10, top_margin=20)
+2026-06-16 02:00:20,271 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_35.png
+2026-06-16 02:00:20,279 - INFO - Calling API for img_35.png -> 20260616_020020_img_35.png with prompt: high quality, detailed, female nude
+2026-06-16 02:00:29,063 - INFO - Successfully processed img_35.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020020_img_35.png
+2026-06-16 02:00:35,065 - INFO - Starting processing for img_36.png...
+2026-06-16 02:00:35,067 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_36.png to (34, 75, 262, 473) (margin=10, top_margin=20)
+2026-06-16 02:00:35,067 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_36.png
+2026-06-16 02:00:35,074 - INFO - Calling API for img_36.png -> 20260616_020035_img_36.png with prompt: high quality, detailed, female nude
+2026-06-16 02:00:43,855 - INFO - Successfully processed img_36.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020035_img_36.png
+2026-06-16 02:00:59,859 - INFO - Starting processing for img_38.png...
+2026-06-16 02:00:59,860 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_38.png to (47, 79, 275, 473) (margin=10, top_margin=20)
+2026-06-16 02:00:59,860 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_38.png
+2026-06-16 02:00:59,868 - INFO - Calling API for img_38.png -> 20260616_020059_img_38.png with prompt: high quality, detailed, female nude
+2026-06-16 02:01:08,530 - INFO - Successfully processed img_38.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020059_img_38.png
+2026-06-16 02:04:03,573 - INFO - Starting processing for img_39.png...
+2026-06-16 02:04:03,573 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_39.png to (15, 19, 127, 193) (margin=10, top_margin=20)
+2026-06-16 02:04:03,573 - INFO - Adding 8px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_39.png
+2026-06-16 02:04:03,575 - INFO - Calling API for img_39.png -> 20260616_020403_img_39.png with prompt: high quality, detailed, female nude
+2026-06-16 02:04:12,137 - INFO - Successfully processed img_39.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020403_img_39.png
+2026-06-16 02:09:08,212 - INFO - Starting processing for img_40.png...
+2026-06-16 02:09:08,213 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_40.png to (20, 49, 152, 347) (margin=10, top_margin=20)
+2026-06-16 02:09:08,213 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_40.png
+2026-06-16 02:09:08,217 - INFO - Calling API for img_40.png -> 20260616_020908_img_40.png with prompt: high quality, detailed, female nude
+2026-06-16 02:09:16,822 - INFO - Successfully processed img_40.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020908_img_40.png
+2026-06-16 02:09:42,828 - INFO - Starting processing for img_42.png...
+2026-06-16 02:09:42,829 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_42.png to (48, 74, 228, 476) (margin=10, top_margin=20)
+2026-06-16 02:09:42,829 - INFO - Adding 20px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_42.png
+2026-06-16 02:09:42,836 - INFO - Calling API for img_42.png -> 20260616_020942_img_42.png with prompt: high quality, detailed, female nude
+2026-06-16 02:09:51,413 - INFO - Successfully processed img_42.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_020942_img_42.png
+2026-06-16 02:10:03,417 - INFO - Starting processing for img_41.png...
+2026-06-16 02:10:03,418 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_41.png to (60, 88, 284, 554) (margin=10, top_margin=20)
+2026-06-16 02:10:03,418 - INFO - Adding 23px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_41.png
+2026-06-16 02:10:03,427 - INFO - Calling API for img_41.png -> 20260616_021003_img_41.png with prompt: high quality, detailed, female nude
+2026-06-16 02:10:12,003 - INFO - Successfully processed img_41.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021003_img_41.png
+2026-06-16 02:10:56,012 - INFO - Starting processing for img_45.png...
+2026-06-16 02:10:56,013 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_45.png to (17, 45, 148, 336) (margin=10, top_margin=20)
+2026-06-16 02:10:56,013 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_45.png
+2026-06-16 02:10:56,017 - INFO - Calling API for img_45.png -> 20260616_021056_img_45.png with prompt: high quality, detailed, female nude
+2026-06-16 02:11:04,586 - INFO - Successfully processed img_45.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021056_img_45.png
+2026-06-16 02:11:16,589 - INFO - Starting processing for img_43.png...
+2026-06-16 02:11:16,591 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_43.png to (32, 75, 208, 481) (margin=10, top_margin=20)
+2026-06-16 02:11:16,591 - INFO - Adding 20px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_43.png
+2026-06-16 02:11:16,599 - INFO - Calling API for img_43.png -> 20260616_021116_img_43.png with prompt: high quality, detailed, female nude
+2026-06-16 02:11:25,400 - INFO - Successfully processed img_43.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021116_img_43.png
+2026-06-16 02:11:50,406 - INFO - Starting processing for img_44.png...
+2026-06-16 02:11:50,407 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_44.png to (32, 57, 220, 396) (margin=10, top_margin=20)
+2026-06-16 02:11:50,407 - INFO - Adding 16px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_44.png
+2026-06-16 02:11:50,412 - INFO - Calling API for img_44.png -> 20260616_021150_img_44.png with prompt: high quality, detailed, female nude
+2026-06-16 02:11:59,073 - INFO - Successfully processed img_44.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021150_img_44.png
+2026-06-16 02:12:14,077 - INFO - Starting processing for img_46.png...
+2026-06-16 02:12:14,077 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_46.png to (32, 61, 207, 409) (margin=10, top_margin=20)
+2026-06-16 02:12:14,077 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_46.png
+2026-06-16 02:12:14,082 - INFO - Calling API for img_46.png -> 20260616_021214_img_46.png with prompt: high quality, detailed, female nude
+2026-06-16 02:12:22,927 - INFO - Successfully processed img_46.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021214_img_46.png
+2026-06-16 02:12:35,930 - INFO - Starting processing for img_47.png...
+2026-06-16 02:12:35,931 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_47.png to (49, 85, 301, 535) (margin=10, top_margin=20)
+2026-06-16 02:12:35,931 - INFO - Adding 22px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_47.png
+2026-06-16 02:12:35,943 - INFO - Calling API for img_47.png -> 20260616_021235_img_47.png with prompt: high quality, detailed, female nude
+2026-06-16 02:12:44,601 - INFO - Successfully processed img_47.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021235_img_47.png
+2026-06-16 02:18:21,671 - INFO - Starting processing for 20150913_211324.jpg...
+2026-06-16 02:18:21,675 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/20150913_211324.jpg is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:18:24,301 - INFO - Calling API for 20150913_211324.jpg -> 20260616_021821_20150913_211324.jpg with prompt: high quality, detailed, female nude
+2026-06-16 02:18:33,371 - INFO - Successfully processed 20150913_211324.jpg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021821_20150913_211324.jpg
+2026-06-16 02:19:38,396 - INFO - Starting processing for 20160903_200935.jpg...
+2026-06-16 02:19:38,396 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/20160903_200935.jpg is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:19:40,616 - INFO - Calling API for 20160903_200935.jpg -> 20260616_021938_20160903_200935.jpg with prompt: high quality, detailed, female nude
+2026-06-16 02:19:49,641 - INFO - Successfully processed 20160903_200935.jpg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021938_20160903_200935.jpg
+2026-06-16 02:19:50,653 - INFO - Starting processing for 20160903_200728.jpg...
+2026-06-16 02:19:50,653 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/20160903_200728.jpg is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:19:53,144 - INFO - Calling API for 20160903_200728.jpg -> 20260616_021950_20160903_200728.jpg with prompt: high quality, detailed, female nude
+2026-06-16 02:20:02,220 - INFO - Successfully processed 20160903_200728.jpg -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_021950_20160903_200728.jpg
+2026-06-16 02:23:40,309 - INFO - Starting processing for img_49.png...
+2026-06-16 02:23:40,309 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_49.png is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:23:40,335 - INFO - Calling API for img_49.png -> 20260616_022340_img_49.png with prompt: high quality, detailed, female nude
+2026-06-16 02:23:48,975 - INFO - Successfully processed img_49.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_022340_img_49.png
+2026-06-16 02:23:49,976 - INFO - Starting processing for img_48.png...
+2026-06-16 02:23:49,976 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_48.png is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:23:50,002 - INFO - Calling API for img_48.png -> 20260616_022349_img_48.png with prompt: high quality, detailed, female nude
+2026-06-16 02:23:58,581 - INFO - Successfully processed img_48.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_022349_img_48.png
+2026-06-16 02:25:43,626 - INFO - Starting processing for img_50.png...
+2026-06-16 02:25:43,637 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_50.png to (0, 0, 636, 1201) (margin=10, top_margin=20)
+2026-06-16 02:25:43,638 - INFO - Adding 60px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_50.png
+2026-06-16 02:25:43,778 - INFO - Calling API for img_50.png -> 20260616_022543_img_50.png with prompt: high quality, detailed, female nude
+2026-06-16 02:25:52,417 - INFO - Successfully processed img_50.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_022543_img_50.png
+2026-06-16 02:32:09,603 - INFO - Starting processing for img_51.png...
+2026-06-16 02:32:09,603 - INFO - Image /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_51.png is mode RGB, not RGBA. Skipping crop.
+2026-06-16 02:32:09,650 - INFO - Calling API for img_51.png -> 20260616_023209_img_51.png with prompt: high quality, detailed, female nude
+2026-06-16 02:32:18,495 - INFO - Successfully processed img_51.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_023209_img_51.png
+2026-06-16 02:33:06,523 - INFO - Starting processing for img_52.png...
+2026-06-16 02:33:06,526 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_52.png to (0, 0, 332, 532) (margin=10, top_margin=20)
+2026-06-16 02:33:06,526 - INFO - Adding 26px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_52.png
+2026-06-16 02:33:06,559 - INFO - Calling API for img_52.png -> 20260616_023306_img_52.png with prompt: high quality, detailed, female nude
+2026-06-16 02:33:15,175 - INFO - Successfully processed img_52.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260616_023306_img_52.png
+2026-06-17 00:48:02,598 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-17 00:48:02,599 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-17 00:48:02,599 - INFO - API URL: http://127.0.0.1:8500/edit
+2026-06-17 00:48:14,615 - INFO - Starting processing for img_57.png...
+2026-06-17 00:48:14,632 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_57.png to (14, 58, 130, 398) (margin=10, top_margin=20)
+2026-06-17 00:48:14,632 - INFO - Adding 17px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_57.png
+2026-06-17 00:48:14,634 - INFO - Calling API for img_57.png -> 20260617_004814_img_57.png with prompt: high quality, detailed, female nude
+2026-06-17 00:49:40,422 - INFO - Successfully processed img_57.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_004814_img_57.png
+2026-06-17 00:49:42,437 - INFO - Starting processing for img_53.png...
+2026-06-17 00:49:42,440 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_53.png to (14, 40, 114, 298) (margin=10, top_margin=20)
+2026-06-17 00:49:42,441 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_53.png
+2026-06-17 00:49:42,444 - INFO - Calling API for img_53.png -> 20260617_004942_img_53.png with prompt: high quality, detailed, female nude
+2026-06-17 00:49:51,098 - INFO - Successfully processed img_53.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_004942_img_53.png
+2026-06-17 00:49:57,119 - INFO - Starting processing for img_58.png...
+2026-06-17 00:49:57,121 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_58.png to (0, 0, 179, 474) (margin=10, top_margin=20)
+2026-06-17 00:49:57,121 - INFO - Adding 23px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_58.png
+2026-06-17 00:49:57,136 - INFO - Calling API for img_58.png -> 20260617_004957_img_58.png with prompt: high quality, detailed, female nude
+2026-06-17 00:50:05,755 - INFO - Successfully processed img_58.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_004957_img_58.png
+2026-06-17 00:50:08,764 - INFO - Starting processing for img_54.png...
+2026-06-17 00:50:08,767 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_54.png to (0, 0, 281, 498) (margin=10, top_margin=20)
+2026-06-17 00:50:08,767 - INFO - Adding 24px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_54.png
+2026-06-17 00:50:08,816 - INFO - Calling API for img_54.png -> 20260617_005008_img_54.png with prompt: high quality, detailed, female nude
+2026-06-17 00:50:17,594 - INFO - Successfully processed img_54.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_005008_img_54.png
+2026-06-17 00:50:26,611 - INFO - Starting processing for img_55.png...
+2026-06-17 00:50:26,611 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_55.png to (14, 40, 114, 298) (margin=10, top_margin=20)
+2026-06-17 00:50:26,612 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_55.png
+2026-06-17 00:50:26,614 - INFO - Calling API for img_55.png -> 20260617_005026_img_55.png with prompt: high quality, detailed, female nude
+2026-06-17 00:50:35,222 - INFO - Successfully processed img_55.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_005026_img_55.png
+2026-06-17 00:50:40,231 - INFO - Starting processing for img_56.png...
+2026-06-17 00:50:40,232 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_56.png to (20, 36, 154, 282) (margin=10, top_margin=20)
+2026-06-17 00:50:40,232 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_56.png
+2026-06-17 00:50:40,234 - INFO - Calling API for img_56.png -> 20260617_005040_img_56.png with prompt: high quality, detailed, female nude
+2026-06-17 00:50:48,801 - INFO - Successfully processed img_56.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_005040_img_56.png
+2026-06-17 00:52:00,959 - INFO - Starting processing for img_59.png...
+2026-06-17 00:52:00,961 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_59.png to (0, 0, 179, 474) (margin=10, top_margin=20)
+2026-06-17 00:52:00,961 - INFO - Adding 23px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_59.png
+2026-06-17 00:52:00,975 - INFO - Calling API for img_59.png -> 20260617_005200_img_59.png with prompt: high quality, detailed, female nude
+2026-06-17 00:52:09,595 - INFO - Successfully processed img_59.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_005200_img_59.png
+2026-06-17 00:55:12,676 - INFO - Starting processing for img_60.png...
+2026-06-17 00:55:12,677 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_60.png to (0, 0, 170, 458) (margin=10, top_margin=20)
+2026-06-17 00:55:12,677 - INFO - Adding 22px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_60.png
+2026-06-17 00:55:12,693 - INFO - Calling API for img_60.png -> 20260617_005512_img_60.png with prompt: high quality, detailed, female nude
+2026-06-17 00:55:21,320 - INFO - Successfully processed img_60.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_005512_img_60.png
+2026-06-17 01:11:32,713 - INFO - Starting processing for img_61.png...
+2026-06-17 01:11:32,714 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_61.png to (9, 49, 121, 336) (margin=10, top_margin=20)
+2026-06-17 01:11:32,714 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_61.png
+2026-06-17 01:11:32,716 - INFO - Calling API for img_61.png -> 20260617_011132_img_61.png with prompt: high quality, detailed, female nude
+2026-06-17 01:11:41,283 - INFO - Successfully processed img_61.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_011132_img_61.png
+2026-06-17 01:21:23,477 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 99 images
+2026-06-17 01:27:09,823 - INFO - Starting processing for img_62.png...
+2026-06-17 01:27:09,825 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_62.png to (12, 43, 114, 306) (margin=10, top_margin=20)
+2026-06-17 01:27:09,825 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_62.png
+2026-06-17 01:27:09,827 - INFO - Calling API for img_62.png -> 20260617_012709_img_62.png with prompt: high quality, detailed, female nude
+2026-06-17 01:27:21,555 - INFO - Successfully processed img_62.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_012709_img_62.png
+2026-06-17 01:30:35,630 - INFO - Starting processing for img_64.png...
+2026-06-17 01:30:35,630 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_64.png to (16, 37, 115, 292) (margin=10, top_margin=20)
+2026-06-17 01:30:35,630 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_64.png
+2026-06-17 01:30:35,632 - INFO - Calling API for img_64.png -> 20260617_013035_img_64.png with prompt: high quality, detailed, female nude
+2026-06-17 01:30:44,913 - INFO - Successfully processed img_64.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013035_img_64.png
+2026-06-17 01:31:11,919 - INFO - Starting processing for img_63.png...
+2026-06-17 01:31:11,919 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_63.png to (27, 46, 188, 329) (margin=10, top_margin=20)
+2026-06-17 01:31:11,919 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_63.png
+2026-06-17 01:31:11,922 - INFO - Calling API for img_63.png -> 20260617_013111_img_63.png with prompt: high quality, detailed, female nude
+2026-06-17 01:31:20,497 - INFO - Successfully processed img_63.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013111_img_63.png
+2026-06-17 01:31:50,517 - INFO - Starting processing for img_66.png...
+2026-06-17 01:31:50,518 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_66.png to (14, 41, 115, 300) (margin=10, top_margin=20)
+2026-06-17 01:31:50,518 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_66.png
+2026-06-17 01:31:50,520 - INFO - Calling API for img_66.png -> 20260617_013150_img_66.png with prompt: high quality, detailed, female nude
+2026-06-17 01:31:59,099 - INFO - Successfully processed img_66.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013150_img_66.png
+2026-06-17 01:32:11,102 - INFO - Starting processing for img_65.png...
+2026-06-17 01:32:11,102 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_65.png to (15, 37, 136, 286) (margin=10, top_margin=20)
+2026-06-17 01:32:11,103 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_65.png
+2026-06-17 01:32:11,105 - INFO - Calling API for img_65.png -> 20260617_013211_img_65.png with prompt: high quality, detailed, female nude
+2026-06-17 01:32:19,734 - INFO - Successfully processed img_65.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013211_img_65.png
+2026-06-17 01:32:31,737 - INFO - Starting processing for img_68.png...
+2026-06-17 01:32:31,738 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png to (14, 41, 115, 300) (margin=10, top_margin=20)
+2026-06-17 01:32:31,738 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png
+2026-06-17 01:32:31,741 - INFO - Calling API for img_68.png -> 20260617_013231_img_68.png with prompt: high quality, detailed, female nude
+2026-06-17 01:32:40,321 - INFO - Successfully processed img_68.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013231_img_68.png
+2026-06-17 01:33:27,346 - INFO - Starting processing for img_67.png...
+2026-06-17 01:33:27,346 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_67.png to (14, 41, 115, 300) (margin=10, top_margin=20)
+2026-06-17 01:33:27,346 - INFO - Adding 12px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_67.png
+2026-06-17 01:33:27,350 - INFO - Calling API for img_67.png -> 20260617_013327_img_67.png with prompt: high quality, detailed, female nude
+2026-06-17 01:33:35,937 - INFO - Successfully processed img_67.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_013327_img_67.png
+2026-06-17 01:43:51,182 - INFO - Starting processing for img_66.png...
+2026-06-17 01:43:51,183 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_66.png to (20, 46, 137, 340) (margin=10, top_margin=20)
+2026-06-17 01:43:51,183 - INFO - Adding 14px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_66.png
+2026-06-17 01:43:51,186 - INFO - Calling API for img_66.png -> 20260617_014351_img_66.png with prompt: high quality, detailed, female nude
+2026-06-17 01:43:59,770 - INFO - Successfully processed img_66.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_014351_img_66.png
+2026-06-17 01:44:46,395 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-17 01:44:46,395 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-17 01:44:46,396 - INFO - API URL: http://127.0.0.1:8500/edit
+2026-06-17 01:45:00,035 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 107 images
+2026-06-17 01:49:32,501 - INFO - Starting processing for img_68.png...
+2026-06-17 01:49:32,513 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png to (9, 28, 93, 249) (margin=10, top_margin=20)
+2026-06-17 01:49:32,513 - INFO - Adding 11px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png
+2026-06-17 01:49:32,515 - INFO - Calling API for img_68.png -> 20260617_014932_img_68.png with prompt: high quality, detailed, female nude
+2026-06-17 01:49:36,385 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-17 01:49:36,385 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-17 01:49:36,385 - INFO - API URL: http://127.0.0.1:8500/edit
+2026-06-17 01:50:07,395 - INFO - Starting processing for img_68.png...
+2026-06-17 01:50:07,399 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png to (9, 28, 93, 249) (margin=10, top_margin=20)
+2026-06-17 01:50:07,399 - INFO - Adding 11px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_68.png
+2026-06-17 01:50:07,401 - INFO - Calling API for img_68.png -> 20260617_015007_img_68.png with prompt: high quality, detailed, female nude
+2026-06-17 01:50:15,983 - INFO - Successfully processed img_68.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_015007_img_68.png
+2026-06-17 01:50:15,984 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 108 images
+2026-06-17 01:56:11,120 - INFO - Starting processing for img_69.png...
+2026-06-17 01:56:11,121 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_69.png to (24, 46, 132, 316) (margin=10, top_margin=20)
+2026-06-17 01:56:11,121 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_69.png
+2026-06-17 01:56:11,123 - INFO - Calling API for img_69.png -> 20260617_015611_img_69.png with prompt: high quality, detailed, female nude
+2026-06-17 01:56:19,913 - INFO - Successfully processed img_69.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_015611_img_69.png
+2026-06-17 01:56:19,913 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 109 images
+2026-06-17 01:57:28,942 - INFO - Starting processing for img_70.png...
+2026-06-17 01:57:28,943 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_70.png to (24, 46, 132, 316) (margin=10, top_margin=20)
+2026-06-17 01:57:28,943 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_70.png
+2026-06-17 01:57:28,945 - INFO - Calling API for img_70.png -> 20260617_015728_img_70.png with prompt: high quality, detailed, female nude
+2026-06-17 01:57:37,735 - INFO - Successfully processed img_70.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_015728_img_70.png
+2026-06-17 01:57:37,736 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 110 images
+2026-06-17 01:59:46,778 - INFO - Starting processing for img_71.png...
+2026-06-17 01:59:46,779 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_71.png to (30, 42, 150, 308) (margin=10, top_margin=20)
+2026-06-17 01:59:46,779 - INFO - Adding 13px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_71.png
+2026-06-17 01:59:46,781 - INFO - Calling API for img_71.png -> 20260617_015946_img_71.png with prompt: high quality, detailed, female nude
+2026-06-17 01:59:55,551 - INFO - Successfully processed img_71.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_015946_img_71.png
+2026-06-17 01:59:55,552 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 111 images
+2026-06-17 07:42:23,692 - INFO - Starting processing for img_72.png...
+2026-06-17 07:42:23,695 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_72.png to (0, 0, 199, 383) (margin=10, top_margin=20)
+2026-06-17 07:42:23,695 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_72.png
+2026-06-17 07:42:23,714 - INFO - Calling API for img_72.png -> 20260617_074223_img_72.png with prompt: high quality, detailed, female nude
+2026-06-17 07:42:36,856 - INFO - Successfully processed img_72.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_074223_img_72.png
+2026-06-17 07:42:36,857 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 112 images
+2026-06-17 07:44:13,893 - INFO - Starting processing for img_73.png...
+2026-06-17 07:44:13,894 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_73.png to (0, 0, 197, 374) (margin=10, top_margin=20)
+2026-06-17 07:44:13,894 - INFO - Adding 18px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_73.png
+2026-06-17 07:44:13,914 - INFO - Calling API for img_73.png -> 20260617_074413_img_73.png with prompt: high quality, detailed, female nude
+2026-06-17 07:44:22,768 - INFO - Successfully processed img_73.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_074413_img_73.png
+2026-06-17 07:44:22,768 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 113 images
+2026-06-17 07:45:56,804 - INFO - Starting processing for img_74.png...
+2026-06-17 07:45:56,805 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_74.png to (0, 0, 172, 190) (margin=10, top_margin=20)
+2026-06-17 07:45:56,805 - INFO - Adding 9px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_74.png
+2026-06-17 07:45:56,815 - INFO - Calling API for img_74.png -> 20260617_074556_img_74.png with prompt: high quality, detailed, female nude
+2026-06-17 07:46:05,478 - INFO - Successfully processed img_74.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_074556_img_74.png
+2026-06-17 07:46:05,479 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 114 images
+2026-06-17 07:46:13,481 - INFO - Starting processing for img_75.png...
+2026-06-17 07:46:13,481 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_75.png to (0, 0, 103, 190) (margin=10, top_margin=20)
+2026-06-17 07:46:13,481 - INFO - Adding 9px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_75.png
+2026-06-17 07:46:13,487 - INFO - Calling API for img_75.png -> 20260617_074613_img_75.png with prompt: high quality, detailed, female nude
+2026-06-17 07:46:22,098 - INFO - Successfully processed img_75.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_074613_img_75.png
+2026-06-17 07:46:22,098 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 115 images
+2026-06-17 13:28:51,233 - INFO - Starting processing for img_76.png...
+2026-06-17 13:28:51,235 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_76.png to (0, 0, 103, 190) (margin=10, top_margin=20)
+2026-06-17 13:28:51,235 - INFO - Adding 9px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_76.png
+2026-06-17 13:28:51,240 - INFO - Calling API for img_76.png -> 20260617_132851_img_76.png with prompt: high quality, detailed, female nude
+2026-06-17 13:29:04,907 - INFO - Successfully processed img_76.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_132851_img_76.png
+2026-06-17 13:29:04,908 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 116 images
+2026-06-17 13:31:29,970 - INFO - Starting processing for img_77.png...
+2026-06-17 13:31:29,973 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_77.png to (0, 0, 287, 574) (margin=10, top_margin=20)
+2026-06-17 13:31:29,973 - INFO - Adding 28px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_77.png
+2026-06-17 13:31:30,017 - INFO - Calling API for img_77.png -> 20260617_133129_img_77.png with prompt: high quality, detailed, female nude
+2026-06-17 13:31:38,782 - INFO - Successfully processed img_77.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133129_img_77.png
+2026-06-17 13:31:38,783 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 117 images
+2026-06-17 13:31:54,787 - INFO - Starting processing for img_78.png...
+2026-06-17 13:31:54,791 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_78.png to (0, 0, 287, 574) (margin=10, top_margin=20)
+2026-06-17 13:31:54,791 - INFO - Adding 28px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_78.png
+2026-06-17 13:31:54,834 - INFO - Calling API for img_78.png -> 20260617_133154_img_78.png with prompt: high quality, detailed, female nude
+2026-06-17 13:32:03,538 - INFO - Successfully processed img_78.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133154_img_78.png
+2026-06-17 13:32:03,539 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 118 images
+2026-06-17 13:34:11,583 - INFO - Starting processing for img_79.png...
+2026-06-17 13:34:11,584 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_79.png to (0, 0, 194, 415) (margin=10, top_margin=20)
+2026-06-17 13:34:11,584 - INFO - Adding 20px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_79.png
+2026-06-17 13:34:11,605 - INFO - Calling API for img_79.png -> 20260617_133411_img_79.png with prompt: high quality, detailed, female nude
+2026-06-17 13:34:20,245 - INFO - Successfully processed img_79.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133411_img_79.png
+2026-06-17 13:34:20,246 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 119 images
+2026-06-17 13:35:19,274 - INFO - Starting processing for img_80.png...
+2026-06-17 13:35:19,276 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_80.png to (0, 0, 211, 332) (margin=10, top_margin=20)
+2026-06-17 13:35:19,276 - INFO - Adding 16px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_80.png
+2026-06-17 13:35:19,296 - INFO - Calling API for img_80.png -> 20260617_133519_img_80.png with prompt: high quality, detailed, female nude
+2026-06-17 13:35:28,648 - INFO - Successfully processed img_80.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133519_img_80.png
+2026-06-17 13:35:28,648 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 120 images
+2026-06-17 13:38:32,723 - INFO - Starting processing for img_81.png...
+2026-06-17 13:38:32,724 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_81.png to (0, 0, 158, 203) (margin=10, top_margin=20)
+2026-06-17 13:38:32,724 - INFO - Adding 10px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_81.png
+2026-06-17 13:38:32,732 - INFO - Calling API for img_81.png -> 20260617_133832_img_81.png with prompt: high quality, detailed, female nude
+2026-06-17 13:38:45,858 - INFO - Successfully processed img_81.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133832_img_81.png
+2026-06-17 13:38:45,858 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 121 images
+2026-06-17 13:39:17,867 - INFO - Starting processing for img_82.png...
+2026-06-17 13:39:17,868 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_82.png to (0, 0, 124, 386) (margin=10, top_margin=20)
+2026-06-17 13:39:17,868 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_82.png
+2026-06-17 13:39:17,881 - INFO - Calling API for img_82.png -> 20260617_133917_img_82.png with prompt: high quality, detailed, female nude
+2026-06-17 13:39:26,615 - INFO - Successfully processed img_82.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_133917_img_82.png
+2026-06-17 13:39:26,616 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 122 images
+2026-06-17 13:40:41,647 - INFO - Starting processing for img_84.png...
+2026-06-17 13:40:41,649 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_84.png to (0, 0, 188, 469) (margin=10, top_margin=20)
+2026-06-17 13:40:41,650 - INFO - Adding 23px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_84.png
+2026-06-17 13:40:41,673 - INFO - Calling API for img_84.png -> 20260617_134041_img_84.png with prompt: high quality, detailed, female nude
+2026-06-17 13:40:53,970 - INFO - Successfully processed img_84.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_134041_img_84.png
+2026-06-17 13:40:53,970 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 123 images
+2026-06-17 13:41:19,978 - INFO - Starting processing for img_85.png...
+2026-06-17 13:41:19,982 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_85.png to (0, 0, 242, 511) (margin=10, top_margin=20)
+2026-06-17 13:41:19,982 - INFO - Adding 25px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_85.png
+2026-06-17 13:41:20,012 - INFO - Calling API for img_85.png -> 20260617_134119_img_85.png with prompt: high quality, detailed, female nude
+2026-06-17 13:41:33,171 - INFO - Successfully processed img_85.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_134119_img_85.png
+2026-06-17 13:41:33,172 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 124 images
+2026-06-17 13:42:29,200 - INFO - Starting processing for img_83.png...
+2026-06-17 13:42:29,202 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_83.png to (0, 0, 124, 386) (margin=10, top_margin=20)
+2026-06-17 13:42:29,202 - INFO - Adding 19px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_83.png
+2026-06-17 13:42:29,224 - INFO - Calling API for img_83.png -> 20260617_134229_img_83.png with prompt: high quality, detailed, female nude
+2026-06-17 13:42:44,388 - INFO - Successfully processed img_83.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_134229_img_83.png
+2026-06-17 13:42:44,389 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 125 images
+2026-06-17 13:46:15,478 - INFO - Starting processing for img_86.png...
+2026-06-17 13:46:15,481 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_86.png to (0, 0, 242, 511) (margin=10, top_margin=20)
+2026-06-17 13:46:15,481 - INFO - Adding 25px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_86.png
+2026-06-17 13:46:15,514 - INFO - Calling API for img_86.png -> 20260617_134615_img_86.png with prompt: high quality, detailed, female nude
+2026-06-17 13:46:27,871 - INFO - Successfully processed img_86.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_134615_img_86.png
+2026-06-17 13:46:27,872 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 126 images
+2026-06-17 21:02:22,496 - INFO - Watcher started. Monitoring /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage...
+2026-06-17 21:02:22,498 - INFO - Output directory: /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output
+2026-06-17 21:02:22,499 - INFO - API URL: http://127.0.0.1:8500/edit
+2026-06-17 21:52:45,954 - INFO - Starting processing for img_87.png...
+2026-06-17 21:52:45,970 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_87.png to (0, 0, 391, 546) (margin=10, top_margin=20)
+2026-06-17 21:52:45,970 - INFO - Adding 27px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_87.png
+2026-06-17 21:52:46,026 - INFO - Calling API for img_87.png -> 20260617_215245_img_87.png with prompt: high quality, detailed, female nude
+2026-06-17 21:54:09,505 - INFO - Successfully processed img_87.png -> /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/20260617_215245_img_87.png
+2026-06-17 21:54:09,506 - INFO - Updated /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/output/car.html with 127 images
+2026-06-17 23:56:56,548 - INFO - Starting processing for img_88.png...
+2026-06-17 23:56:56,602 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_88.png to (0, 0, 352, 570) (margin=10, top_margin=20)
+2026-06-17 23:56:56,603 - INFO - Adding 28px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_88.png
+2026-06-17 23:56:56,669 - INFO - Calling API for img_88.png -> 20260617_235656_img_88.png with prompt: high quality, detailed, female nude
+2026-06-17 23:56:57,177 - ERROR - API failed for img_88.png: 500 - Internal Server Error
+2026-06-17 23:56:57,179 - INFO - Flagging image img_88.png (moving to failed directory as 20260617_235657_img_88.png)
+2026-06-18 00:02:13,299 - INFO - Starting processing for img_88.png...
+2026-06-18 00:02:13,303 - INFO - Cropping /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_88.png to (0, 0, 352, 570) (margin=10, top_margin=20)
+2026-06-18 00:02:13,303 - INFO - Adding 28px headroom to /home/mike/dev/qwen-image-edit-rapid-aio-nsfw-v23/tour-comfy/stage/img_88.png
+2026-06-18 00:02:13,359 - INFO - Calling API for img_88.png -> 20260618_000213_img_88.png with prompt: high quality, detailed, female nude
+2026-06-18 00:02:13,515 - ERROR - API failed for img_88.png: 500 - Internal Server Error
+2026-06-18 00:02:13,516 - INFO - Flagging image img_88.png (moving to failed directory as 20260618_000213_img_88.png)
diff --git a/tour-comfy/watcher.py b/tour-comfy/watcher.py
new file mode 100644
index 0000000..a6305c8
--- /dev/null
+++ b/tour-comfy/watcher.py
@@ -0,0 +1,291 @@
+import os
+import time
+import json
+import shutil
+import requests
+from PIL import Image
+import logging
+import hashlib
+import sys
+import fcntl
+import re
+
+# Load configuration
+CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.json")
+
+def load_config():
+ with open(CONFIG_PATH, 'r') as f:
+ conf = json.load(f)
+ # Resolve relative paths relative to this script's directory
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+ for key in ["stage_dir", "output_dir", "failed_dir", "processed_file", "log_file"]:
+ if not os.path.isabs(conf[key]):
+ conf[key] = os.path.normpath(os.path.join(base_dir, "..", conf[key]))
+ return conf
+
+CONF = load_config()
+
+# Setup logging
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(levelname)s - %(message)s',
+ handlers=[
+ logging.FileHandler(CONF["log_file"]),
+ logging.StreamHandler()
+ ]
+)
+
+def get_processed_files():
+ if os.path.exists(CONF["processed_file"]):
+ try:
+ with open(CONF["processed_file"], 'r') as f:
+ data = json.load(f)
+ if isinstance(data, list):
+ # Migration: convert old list format to dict
+ return {name: None for name in data}
+ return data
+ except Exception as e:
+ logging.error(f"Error reading processed file: {e}")
+ return {}
+ return {}
+
+def save_processed_files(processed):
+ try:
+ with open(CONF["processed_file"], 'w') as f:
+ json.dump(processed, f, indent=2)
+ except Exception as e:
+ logging.error(f"Error saving processed file: {e}")
+
+def calculate_hash(filepath):
+ """Calculate MD5 hash of a file."""
+ hasher = hashlib.md5()
+ try:
+ with open(filepath, 'rb') as f:
+ for chunk in iter(lambda: f.read(4096), b""):
+ hasher.update(chunk)
+ return hasher.hexdigest()
+ except Exception as e:
+ logging.error(f"Error calculating hash for {filepath}: {e}")
+ return None
+
+def crop_to_bbox(image_path, margin, top_margin=None, headroom=0.0):
+ try:
+ img = Image.open(image_path)
+ if img.mode != 'RGBA':
+ logging.info(f"Image {image_path} is mode {img.mode}, not RGBA. Skipping crop.")
+ return img
+
+ alpha = img.split()[-1]
+ bbox = alpha.getbbox()
+ if not bbox:
+ logging.info(f"No non-transparent bbox found for {image_path}. Returning original.")
+ return img
+
+ if top_margin is None:
+ top_margin = margin
+
+ # Add margin
+ left, upper, right, lower = bbox
+ left = max(0, left - margin)
+ upper = max(0, upper - top_margin)
+ right = min(img.width, right + margin)
+ lower = min(img.height, lower + margin)
+
+ logging.info(f"Cropping {image_path} to {left, upper, right, lower} (margin={margin}, top_margin={top_margin})")
+ cropped = img.crop((left, upper, right, lower))
+
+ if headroom > 0:
+ h_px = int(cropped.height * headroom)
+ if h_px > 0:
+ logging.info(f"Adding {h_px}px headroom to {image_path}")
+ new_img = Image.new("RGBA", (cropped.width, cropped.height + h_px), (0, 0, 0, 0))
+ new_img.paste(cropped, (0, h_px))
+ return new_img
+
+ return cropped
+ except Exception as e:
+ logging.error(f"Failed to crop {image_path}: {e}")
+ raise
+
+def is_file_stable(filepath):
+ """Check if file size is stable for at least 1 second."""
+ try:
+ size1 = os.path.getsize(filepath)
+ time.sleep(1)
+ size2 = os.path.getsize(filepath)
+ return size1 == size2 and size1 > 0
+ except OSError:
+ return False
+
+def flag_image(filename):
+ input_path = os.path.join(CONF["stage_dir"], filename)
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
+ failed_filename = f"{timestamp}_{filename}"
+ failed_path = os.path.join(CONF["failed_dir"], failed_filename)
+ try:
+ os.makedirs(CONF["failed_dir"], exist_ok=True)
+ logging.info(f"Flagging image {filename} (moving to failed directory as {failed_filename})")
+ shutil.move(input_path, failed_path)
+ except Exception as e:
+ logging.error(f"Failed to move {filename} to failed directory: {e}")
+
+def process_image(filename):
+ # Reload config in case it changed
+ global CONF
+ try:
+ CONF = load_config()
+ except:
+ pass
+
+ input_path = os.path.join(CONF["stage_dir"], filename)
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
+ output_filename = f"{timestamp}_{filename}"
+ output_path = os.path.join(CONF["output_dir"], output_filename)
+
+ try:
+ logging.info(f"Starting processing for {filename}...")
+ cropped_img = crop_to_bbox(
+ input_path,
+ CONF["margin"],
+ top_margin=CONF.get("top_margin"),
+ headroom=CONF.get("headroom", 0.0)
+ )
+
+ # Save temporary cropped image for upload
+ temp_path = input_path + ".tmp.png"
+ cropped_img.save(temp_path, format="PNG")
+
+ with open(temp_path, 'rb') as f:
+ files = {'image': (filename, f, 'image/png')}
+ data = {
+ 'prompt': CONF["prompt"],
+ 'seed': CONF.get("seed", -1),
+ 'max_area': CONF.get("max_area", 0)
+ }
+ logging.info(f"Calling API for {filename} -> {output_filename} with prompt: {CONF['prompt']}")
+ response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
+
+ if response.status_code == 200:
+ with open(output_path, 'wb') as f:
+ f.write(response.content)
+ logging.info(f"Successfully processed {filename} -> {output_path}")
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ return True
+ else:
+ logging.error(f"API failed for {filename}: {response.status_code} - {response.text}")
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ return False
+ except requests.exceptions.ConnectionError as e:
+ logging.error(f"Connection error while processing {filename}: {e}")
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ return None
+ except Exception as e:
+ logging.error(f"Error processing {filename}: {str(e)}", exc_info=True)
+ if os.path.exists(temp_path):
+ os.remove(temp_path)
+ return False
+
+def update_car_html():
+ output_dir = CONF["output_dir"]
+ car_html_path = os.path.join(output_dir, "car.html")
+ if not os.path.exists(car_html_path):
+ logging.warning(f"car.html not found at {car_html_path}")
+ return
+
+ try:
+ # List images in output_dir
+ extensions = ('.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg')
+ images = [f for f in os.listdir(output_dir) if f.lower().endswith(extensions) and f != "car.html"]
+
+ # Sort by mtime, newest first
+ images.sort(key=lambda x: os.path.getmtime(os.path.join(output_dir, x)), reverse=True)
+
+ with open(car_html_path, 'r') as f:
+ content = f.read()
+
+ images_json = json.dumps(images, indent=12).strip()
+ # Ensure it looks nice in the JS
+ images_json = images_json.replace('\n', '\n ')
+
+ pattern = r'// --- HYDRATION_START ---.*?// --- HYDRATION_END ---'
+ replacement = f'// --- HYDRATION_START ---\n const PRELOADED_IMAGES = {images_json};\n // --- HYDRATION_END ---'
+
+ new_content = re.sub(pattern, replacement, content, flags=re.DOTALL)
+
+ with open(car_html_path, 'w') as f:
+ f.write(new_content)
+ logging.info(f"Updated {car_html_path} with {len(images)} images")
+ except Exception as e:
+ logging.error(f"Failed to update car.html: {e}")
+
+def main():
+ # Prevent multiple instances
+ lock_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "watcher.lock")
+ fp = open(lock_file, 'w')
+ try:
+ fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ except IOError:
+ print("Another instance of watcher.py is already running. Exiting.")
+ sys.exit(1)
+
+ processed = get_processed_files()
+
+ # Ensure directories exist
+ os.makedirs(CONF["stage_dir"], exist_ok=True)
+ os.makedirs(CONF["output_dir"], exist_ok=True)
+ os.makedirs(CONF["failed_dir"], exist_ok=True)
+
+ logging.info(f"Watcher started. Monitoring {CONF['stage_dir']}...")
+ logging.info(f"Output directory: {CONF['output_dir']}")
+ logging.info(f"API URL: {CONF['api_url']}")
+
+ while True:
+ try:
+ files = [f for f in os.listdir(CONF["stage_dir"])
+ if f.lower().endswith(('.png', '.jpg', '.jpeg'))
+ and not f.endswith('.tmp.png')]
+
+ for f in files:
+ input_path = os.path.join(CONF["stage_dir"], f)
+
+ # Check if file is stable (not still being copied)
+ if not is_file_stable(input_path):
+ continue
+
+ # Calculate current file hash
+ current_hash = calculate_hash(input_path)
+ if not current_hash:
+ continue
+
+ # Check if already processed
+ if f in processed:
+ stored_hash = processed[f]
+ if stored_hash == current_hash:
+ continue
+ if stored_hash is None:
+ # Migration case: filename exists but no hash.
+ # Skip to avoid mass re-processing, but update the hash.
+ logging.info(f"Updating hash for previously processed {f}")
+ processed[f] = current_hash
+ save_processed_files(processed)
+ continue
+
+ res = process_image(f)
+ if res is True:
+ processed[f] = current_hash
+ save_processed_files(processed)
+ update_car_html()
+ elif res is False:
+ flag_image(f)
+ # We don't add to processed here so that if the user
+ # moves the file back to stage, it will be retried.
+ except Exception as e:
+ logging.error(f"Main loop error: {e}")
+
+ time.sleep(CONF["poll_interval"])
+
+if __name__ == "__main__":
+ main()
diff --git a/tour-comfy/workflow_qwen_edit.json b/tour-comfy/workflow_qwen_edit.json
new file mode 100644
index 0000000..5968765
--- /dev/null
+++ b/tour-comfy/workflow_qwen_edit.json
@@ -0,0 +1,75 @@
+{
+ "1": {
+ "class_type": "UnetLoaderGGUF",
+ "inputs": { "unet_name": "Qwen-Rapid-NSFW-v23_Q8_0.gguf" },
+ "_meta": { "title": "unet (gguf)" }
+ },
+ "2": {
+ "class_type": "CLIPLoader",
+ "inputs": {
+ "clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
+ "type": "qwen_image"
+ },
+ "_meta": { "title": "text encoder" }
+ },
+ "3": {
+ "class_type": "VAELoader",
+ "inputs": { "vae_name": "qwen_image_vae.safetensors" },
+ "_meta": { "title": "vae" }
+ },
+ "4": {
+ "class_type": "LoadImage",
+ "inputs": { "image": "input.png" },
+ "_meta": { "title": "input image" }
+ },
+ "5": {
+ "class_type": "TextEncodeQwenImageEditPlus",
+ "inputs": {
+ "clip": ["2", 0],
+ "vae": ["3", 0],
+ "image1": ["4", 0],
+ "prompt": "edit instruction goes here"
+ },
+ "_meta": { "title": "positive" }
+ },
+ "6": {
+ "class_type": "TextEncodeQwenImageEditPlus",
+ "inputs": {
+ "clip": ["2", 0],
+ "vae": ["3", 0],
+ "prompt": " "
+ },
+ "_meta": { "title": "negative" }
+ },
+ "7": {
+ "class_type": "EmptySD3LatentImage",
+ "inputs": { "width": 1024, "height": 1024, "batch_size": 1 },
+ "_meta": { "title": "latent" }
+ },
+ "8": {
+ "class_type": "KSampler",
+ "inputs": {
+ "model": ["1", 0],
+ "positive": ["5", 0],
+ "negative": ["6", 0],
+ "latent_image": ["7", 0],
+ "seed": 0,
+ "steps": 4,
+ "cfg": 1.0,
+ "sampler_name": "euler_ancestral",
+ "scheduler": "beta",
+ "denoise": 1.0
+ },
+ "_meta": { "title": "sampler" }
+ },
+ "9": {
+ "class_type": "VAEDecode",
+ "inputs": { "samples": ["8", 0], "vae": ["3", 0] },
+ "_meta": { "title": "decode" }
+ },
+ "10": {
+ "class_type": "SaveImage",
+ "inputs": { "images": ["9", 0], "filename_prefix": "qwenedit" },
+ "_meta": { "title": "save" }
+ }
+}