Keep the v1 Image tab on its dual-branch template. The host agent follows Desktop's live port so Coolify stays on :8198. Co-authored-by: Cursor <cursoragent@cursor.com>
79 lines
3.1 KiB
Markdown
79 lines
3.1 KiB
Markdown
# Image v1 vs Image v2
|
|
|
|
Image edit (v1) and Image v2 are siblings. v1 is unchanged. Do not mute-fix `workflow_flux2_klein_edit.json` (the dual-branch template that deletes `75:*` or `92:*` at runtime).
|
|
|
|
| | Image edit (v1) | Image v2 |
|
|
|---|---|---|
|
|
| Tab | Image edit | Image v2 |
|
|
| Route | `POST /api/edit` | `POST /api/v2/generate` and `POST /v2/generate` |
|
|
| Graphs | One file, prune unused branch | `klein_v2_edit.json` or `klein_v2_compose.json` |
|
|
| Second still | Optional; switches branch | Compose only; required. Mismatch is a 400 |
|
|
| LoRAs | Optional user picker | SNOFS + Consistency, four strengths |
|
|
| Defaults | 20 steps, CFG 1 | 24 steps, CFG 4 (turbo: 8 / 1) |
|
|
|
|
Poll v2 jobs the same way as v1: `GET /api/generate/{id}/stream` and `GET /api/generate/{id}`.
|
|
|
|
## Modes
|
|
|
|
- **edit** — one image + text. Task is `scene`. Sending `image_b` is rejected.
|
|
- **compose** — two images + text. `image_b` is required. No silent one-image fallback.
|
|
|
|
Compose tasks:
|
|
|
|
- **identity** — person from A; B reinforces the face; prompt changes pose/scene
|
|
- **outfit** — person, body, pose, background from A; clothing only from B
|
|
- **face_lock** — body/pose/scene from A; face from B
|
|
- **scene** — A is the edit image; B is style/background
|
|
|
|
Dummy test: Compose + two unrelated photos + “keep everything the same” must change the output. If it matches old v1 gens, still B is not connected.
|
|
|
|
## Nodes the mapper patches
|
|
|
|
Both graphs:
|
|
|
|
| Node | Role |
|
|
|------|------|
|
|
| `1` | Load Image A (`inputs.image`) |
|
|
| `2` / `23` | Scale to MP, lanczos (`megapixels`) |
|
|
| `7` | SNOFS LoRA (`lora_name`, `strength_model`, `strength_clip`) |
|
|
| `8` | Consistency LoRA (`lora_name`, `strength_model`, `strength_clip`) |
|
|
| `9` | Positive `CLIPTextEncode.text` (role header + user prompt) |
|
|
| `10` | Negative `CLIPTextEncode.text` |
|
|
| `15` | Seed |
|
|
| `17` | Steps (Flux2Scheduler; Klein-native, euler sampler) |
|
|
| `18` | CFG |
|
|
| `21` | SaveImage prefix |
|
|
|
|
Compose only:
|
|
|
|
| Node | Role |
|
|
|------|------|
|
|
| `22` | Load Image B |
|
|
| `23` | Scale B |
|
|
| `24` | VAE encode B |
|
|
| `25` / `26` | Second ReferenceLatent (B fused into pos/neg) |
|
|
|
|
If `image_b` is sent and the executed graph has fewer than two `LoadImage` nodes, the job fails.
|
|
|
|
## Default sliders
|
|
|
|
| Slider | Default |
|
|
|--------|---------|
|
|
| SNOFS Model | 0.65 |
|
|
| SNOFS CLIP | 0.35 |
|
|
| Consistency Model | 0.70 |
|
|
| Consistency CLIP | 0.70 |
|
|
| Steps | 24 (turbo 8) |
|
|
| CFG | 4 (turbo 1) |
|
|
| Scale to MP | 1.0 lanczos |
|
|
|
|
There is no Denoise slider. This is reference-latent Klein, not inpaint.
|
|
|
|
### NSFW identity vs outfit swap
|
|
|
|
- **identity / face_lock** — keep Consistency at 0.70 / 0.70 so the face from A (identity) or B (face_lock) holds. Do not drop SNOFS CLIP below ~0.30 or the skin/body read falls apart.
|
|
- **outfit** — keep SNOFS Model ~0.65 so cloth reads; do not raise it past ~0.85 or it starts rewriting the body from A. Consistency stays at 0.70 so the person in A does not become the person in B.
|
|
- **scene / edit** — start at the table defaults. Turbo is for drafts only.
|
|
|
|
Presets on this tab store sliders + mode + task only. They do not load v1 LoRA stacks or a cached latent.
|