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 + + + +
+

+ + + + + + Live Image Monitor +

+
+ + +
+
+ 0 images + + + + +
+
+ + Auto-refresh: 2m +
+
+ + + +
+ +
+ 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" } + } +}