reorder
This commit is contained in:
159
AGENTS.md
159
AGENTS.md
@@ -63,42 +63,122 @@ FastAPI :8500 (edit_api.py)
|
||||
- **Systemd**: `comfyui-api`
|
||||
- **DB**: PostgreSQL at `192.168.1.160:5433`, database `dv`, table `person`
|
||||
|
||||
#### Core Endpoints
|
||||
#### Endpoints Library
|
||||
|
||||
##### Core Generation & Upload
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/upload` | Upload image; optionally add to existing group (`group_id` + `skip_poses`) |
|
||||
| `POST` | `/batch` | Queue multi-prompt generation job (async) |
|
||||
| `GET` | `/batch/{job_id}` | Poll batch job status / per-item progress |
|
||||
| `DELETE` | `/batch/{job_id}` | Cancel active batch job |
|
||||
| `POST` | `/multi-ref` | Queue a generation job with multiple reference images |
|
||||
| `POST` | `/refine-prompt` | Refine a generation prompt using the external uncensored chat LLM |
|
||||
| `POST` | `/edit` | Edit uploaded image |
|
||||
| `POST` | `/generate-scenery` | Generate scenery background based on video frame + reference image |
|
||||
| `GET` | `/scenery/library` | Return all scenery images grouped by source video reference |
|
||||
|
||||
##### Image Editing & Canvas Expansion (Padding & Crop)
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/images/{filename}/crop` | Crop to pixel rect; `as_copy:true` crops a referenced copy instead of modifying in-place |
|
||||
| `POST` | `/images/{filename}/autocrop` | Auto-trim transparent borders in-place |
|
||||
| `POST` | `/images/{filename}/pad` | Expand image canvas with custom padding on each side, optional background fills (`transparent`, `black`, `white`), and optional Qwen-based Outpainting (`outpaint:true`) |
|
||||
| `POST` | `/images/{filename}/rotate` | Rotate clockwise in 90° steps (lossless transpose, in-place) |
|
||||
| `POST` | `/images/{filename}/invert-alpha` | Invert the alpha channel (recovers background removal errors) |
|
||||
| `POST` | `/images/{filename}/duplicate` | Copy image into the same group with timestamp-based filename and `source_refs=[original]` |
|
||||
| `POST` | `/restore-background/{filename}` | Flatten RGBA to opaque RGB via white composite background |
|
||||
|
||||
##### Background Removal
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/remove-background/{filename}` | rembg BG removal, overwrites in-place; sets `has_background=false` + refreshes static data |
|
||||
| `POST` | `/remove-background-sam/{filename}` | SAM2 BG removal → `.nobg.png` sidecar |
|
||||
| `POST` | `/remove-background/group/{group_id}` | Queue background removal for all group members as an async background task |
|
||||
| `GET` | `/sam2/check` | Return whether SAM2 background remover is available |
|
||||
|
||||
##### Metadata, Custom Labels & Group Management
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `GET` | `/images` | List all images with DB metadata |
|
||||
| `GET` | `/images/{filename}` | Serve image file |
|
||||
| `POST` | `/upload` | Upload image; optionally add to existing group (`group_id` + `skip_poses`) |
|
||||
| `POST` | `/batch` | Queue multi-prompt generation job (async) |
|
||||
| `GET` | `/jobs/{id}` | Poll batch job status / per-item progress |
|
||||
| `POST` | `/images/{filename}/set-preferred` | Move to group slot 0; triggers face extraction background task |
|
||||
| `POST` | `/images/{filename}/extract-face` | Extract & save face crop via insightface (background task) |
|
||||
| `POST` | `/images/{filename}/archive` | Soft-archive (hidden from default view) |
|
||||
| `POST` | `/images/{filename}/unarchive` | Restore archived image |
|
||||
| `POST` | `/images/{filename}/set-hidden` | Toggle studio visibility |
|
||||
| `DELETE` | `/images/{filename}` | Delete image + DB record |
|
||||
| `POST` | `/images/{filename}/crop` | Crop to pixel rect; `as_copy:true` crops a referenced copy instead of in-place |
|
||||
| `POST` | `/images/{filename}/autocrop` | Auto-trim transparent border |
|
||||
| `POST` | `/images/{filename}/rotate` | Rotate clockwise in 90° steps (lossless transpose, in-place) |
|
||||
| `POST` | `/images/{filename}/invert-alpha` | Invert the alpha channel (fixes wrong-segment BG removal) |
|
||||
| `POST` | `/images/{filename}/duplicate` | Copy into same group with `source_refs=[original]` |
|
||||
| `POST` | `/faceswap` | insightface video faceswap |
|
||||
| `POST` | `/remove-background/{filename}` | rembg BG removal, overwrites in-place; sets `has_background=false` + refreshes static data |
|
||||
| `POST` | `/remove-background-sam/{filename}` | SAM2 BG removal → `.nobg.png` sidecar |
|
||||
| `GET` | `/wireframe/frame/{video_name}` | Extract frame at `?t=` (0–1) from wireframe video |
|
||||
| `GET` | `/groups` | List all groups with members |
|
||||
| `GET` | `/group-names` | Return map of custom group names |
|
||||
| `POST` | `/group-names/{group_id}` | Save custom group name |
|
||||
| `POST` | `/groups/merge` | Merge several groups into one group |
|
||||
| `POST` | `/groups/extract` | Extract a file into its own solo group |
|
||||
| `GET` | `/groups/{group_id}/order` | Return order of members in a group |
|
||||
| `POST` | `/groups/{group_id}/order` | Set custom sort order of group members |
|
||||
| `GET` | `/similar/{filename}` | Find visually similar images using database embeddings |
|
||||
| `GET` | `/names` | Map `filename → person name` |
|
||||
| `GET/POST` | `/config` | Read / write `config.json` |
|
||||
| `GET` | `/poses` | Load pose library from `poses.md` |
|
||||
| `POST` | `/poses` | Create / update / rename a pose (`old_name` to rename) → rewrites `poses.md` |
|
||||
| `DELETE` | `/poses/{name}` | Delete a pose from `poses.md` |
|
||||
| `GET` | `/pose/check` | Report pose-estimator availability + backend |
|
||||
| `POST` | `/names/{filename}` | Map image file to custom character name |
|
||||
|
||||
##### Visibility, Archiving & Deletion
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/images/{filename}/hidden` | Toggle studio visibility (soft-hide) |
|
||||
| `POST` | `/images/{filename}/archive` | Soft-archive image (hidden from default view) |
|
||||
| `POST` | `/images/{filename}/unarchive` | Restore soft-archived image |
|
||||
| `DELETE` | `/images/{filename}` | Delete image file + DB record |
|
||||
| `POST` | `/groups/{group_id}/archive` | Soft-archive an entire group |
|
||||
| `POST` | `/groups/{group_id}/unarchive` | Restore an archived group |
|
||||
| `DELETE` | `/groups/{group_id}` | Delete entire group files and DB records |
|
||||
|
||||
##### 2D Body Pose Tools (rtmlib / RTMPose)
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `GET` | `/pose/check` | Report pose-estimator availability + backend (rtmlib or mediapipe) |
|
||||
| `POST` | `/images/{filename}/pose` | Estimate COCO-17 body keypoints (caches descriptor for similar-search) |
|
||||
| `GET` | `/pose/similar/{filename}` | Rank library images by pose similarity to this image |
|
||||
| `POST` | `/pose/similar` | Rank library images by similarity to a supplied (edited) skeleton |
|
||||
| `POST` | `/pose/index` | Build pose descriptors for the whole library (daemon thread) |
|
||||
| `GET` | `/pose/index/status` | Poll pose-index build progress |
|
||||
| `POST` | `/pose/from-wireframe` | Extract frame from a wireframe video and estimate body pose keypoints |
|
||||
| `POST` | `/pose/render` | Render keypoints as OpenPose skeleton image (base64) |
|
||||
| `POST` | `/generate-with-pose` | Generate image from a specific pose skeleton (avoids wireframe bleed-through) |
|
||||
| `GET` | `/poses` | Load pose library from `poses.md` |
|
||||
| `POST` | `/poses` | Create / update / rename a pose (`old_name` to rename) → rewrites `poses.md` |
|
||||
| `DELETE` | `/poses/{name}` | Delete a pose from `poses.md` |
|
||||
|
||||
##### 3D Turntable & Orbit Previews
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/orbit` | Queue an orbit preview generation. Engine `depth` (fast 2.5D card parallax) or `qwen` (turntable) |
|
||||
| `GET` | `/turntable/status` | Return background turntable generation state/progress summary |
|
||||
| `GET` | `/turntable/status/{group_id}` | Return turntable state for a specific group |
|
||||
| `POST` | `/turntable/pause` | Pause background turntable generation |
|
||||
| `POST` | `/turntable/resume` | Resume background turntable generation |
|
||||
| `DELETE` | `/turntable/{group_id}` | Reset turntable cache & records for group to force re-generation |
|
||||
|
||||
##### Face Processing (insightface)
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `POST` | `/faceswap` | insightface video faceswap |
|
||||
| `GET` | `/faceswap/check` | Report available face enhancement backends |
|
||||
| `POST` | `/images/{filename}/extract-face` | Extract & save face crop via insightface (background task) |
|
||||
| `POST` | `/faces/similar` | Find groups with visually similar faces using embeddings |
|
||||
| `POST` | `/faces/index` | Build face embedding index for all preferred faces in library |
|
||||
| `GET` | `/faces/index/status` | Poll face-indexing progress status |
|
||||
| `GET` | `/faces/{group_id}` | Check if face crop exists for group |
|
||||
|
||||
##### Videos & Wireframe Guides
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `GET` | `/videos` | List all available wireframe guide videos |
|
||||
| `GET` | `/wireframe/frame/{video_name}` | Extract frame at `?t=` (0–1) from wireframe video |
|
||||
| `GET` | `/wireframe/duration/{video_name}` | Get video duration (seconds) via ffprobe |
|
||||
| `POST` | `/wireframe/trim` | Trim a wireframe video to given start/end offsets |
|
||||
| `POST` | `/wireframe/frame` | Extract frame at timestamp, returns base64 PNG |
|
||||
| `POST` | `/generate-video` | Stitch list of output images into a short looping MP4 video |
|
||||
|
||||
##### Database, Config & System Diagnostics
|
||||
| Method | Path | Purpose |
|
||||
|--------|------|---------|
|
||||
| `GET/POST` | `/config` | Read / write `config.json` |
|
||||
| `GET` | `/db/inconsistencies` | Retrieve consistency report or run a check with `?run_now=true` |
|
||||
| `POST` | `/db/repair` | Run repair actions (restore, import file, assign group, permanently delete) |
|
||||
| `POST` | `/db/cleanup` | Delete DB records of files that are missing on disk |
|
||||
| `GET` | `/health` | API health check status |
|
||||
|
||||
---
|
||||
|
||||
@@ -111,6 +191,10 @@ prompt
|
||||
│ YES → strip keywords from Qwen prompt (keeps `is_transparent` flag)
|
||||
│ set negative: "deformed anatomy, watermark, logo"
|
||||
│
|
||||
├─ Canvas Expansion / Outpainting requested?
|
||||
│ YES → if outpaint=True, append/use natural outpainting instructions:
|
||||
│ "Naturally outpaint and extend the borders of the image to complete the scene."
|
||||
│
|
||||
├─ Upload reference image(s) to ComfyUI /upload/image
|
||||
│ image1 = source image
|
||||
│ image2 = wireframe pose guide frame (optional)
|
||||
@@ -229,6 +313,8 @@ Model: `buffalo_l`
|
||||
| source_refs | TEXT (JSON) | Original filenames this was derived from |
|
||||
| content_type | TEXT | `image` or `video` |
|
||||
| faceswap_source_video | TEXT | Source video for faceswapped clips |
|
||||
| face_embedding | `vector(512)` | Face recognition embedding for visually matching character faces |
|
||||
| is_source | `BOOLEAN` | Whether the file is a primary reference/source asset |
|
||||
|
||||
---
|
||||
|
||||
@@ -239,17 +325,33 @@ Single-page application (~5000 lines). No build step — pure HTML/CSS/JS.
|
||||
**Modes**:
|
||||
- **Gallery** — grid of all groups; click to open Studio
|
||||
- **Studio** — filmstrip + large viewer + sidebar tabs
|
||||
- **Database Consistency** (`trash.html` SPA) — dedicated panel for identifying legacy/orphaned records, untracked files, and manual restore/delete of archived assets
|
||||
|
||||
**Sidebar tabs**:
|
||||
|
||||
| Tab | Purpose |
|
||||
|-----|---------|
|
||||
| Generate | Camera angle picker, pose selector (with inline edit/add/delete → `poses.md`), wireframe guide, auto-growing prompt override with history autocomplete, fine-tune textareas, multi-ref thumbnails (click to deselect), batch submit |
|
||||
| Info | Metadata, preferred toggle, face-book thumbnail, hide/archive/delete, manual crop (copy or in-place), rotate ±90°, No-BG / Invert-α, duplicate, Pose preview (draggable + similar-pose search) |
|
||||
| Info | Metadata, preferred toggle, face-book thumbnail, hide/archive/delete, manual crop/expand padding (copy or in-place), rotate ±90°, No-BG / Invert-α, duplicate, Pose preview (draggable + similar-pose search) |
|
||||
| Faceswap | Source face selector, target video, preview quality toggle |
|
||||
| Segment | SAM2 and rembg BG removal buttons |
|
||||
| Scenery | Scenery video reference for generation |
|
||||
|
||||
### Key Studio Features
|
||||
|
||||
#### Canvas Expansion & Manual Padding (Interactive Tooling)
|
||||
The **Info** sidebar and dedicated toolbar provide professional, reactive manual padding controls:
|
||||
- **Percent/Pixel Harmony**: Seamlessly accepts both absolute integer pixel values (e.g., `100px`) and percentage-based inputs (e.g., `10%` or `0.1`), ensuring perfect formatting and suffix preservation.
|
||||
- **Quick Adjustment Presets**: Rapidly adjust margins with single-click actions for `+10%`, `+20%`, `+50%`, `+100px`, or `Reset` to clear all.
|
||||
- **Uniform Locking**: Enabling the **Uniform** option synchronizes changes on any single padding field to all four sides simultaneously.
|
||||
- **Intelligent Previews**: Dynamically renders real-time color-coded canvas border previews based on the selected fill type (Amber dashed for `transparent`, translucent black for `black`, and translucent white for `white`).
|
||||
- **Shortcuts**: Confirm cropping or padding instantly with `Enter`, or dismiss/cancel the operation using `Escape`.
|
||||
|
||||
#### Reactive Layout Optimization
|
||||
To prevent desyncs during image transitions, crops, canvas expansion, or 2.2x zooming:
|
||||
- A `ResizeObserver` is registered on the primary studio viewer image (`lbImg`).
|
||||
- Automatically triggers a layout and geometry recalculation, cleanly and immediately adjusting the background transparency checkerboard grid and padding visual overlays to match the actual visual boundaries of the contained image.
|
||||
|
||||
**Key state variables**:
|
||||
- `lbCurrentGid` — active group ID
|
||||
- `lbIdx` — current filmstrip position
|
||||
@@ -304,15 +406,16 @@ skeleton). Results render as a thumbnail strip; clicking one opens that image's
|
||||
```
|
||||
qwen-image-edit-rapid-aio-nsfw-v23/
|
||||
├── tour-comfy/
|
||||
│ ├── car.html # frontend SPA
|
||||
│ ├── car.html # frontend SPA (Studio Interface)
|
||||
│ ├── trash.html # frontend Database Consistency Panel SPA
|
||||
│ ├── edit_api.py # FastAPI backend
|
||||
│ ├── database.py # PostgreSQL helpers
|
||||
│ ├── watcher.py # output dir auto-processor
|
||||
│ ├── config.json # output_dir, comfy_url, etc.
|
||||
│ └── workflow_qwen_edit.json # ComfyUI graph template
|
||||
├── a6000-comfy/ # ComfyUI install (symlinked to ~/comfyui)
|
||||
├── AGENTS.md # this file
|
||||
├── architecture2.svg # system architecture diagram
|
||||
├── AGENTS.md # this file (System Documentation)
|
||||
├── ARCHETECTURE.svg # system architecture diagram
|
||||
├── backlog.md # feature backlog
|
||||
└── requirements.txt # Python deps
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user