Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
313f882
Add Prompt Manager Pro (gpm-core engines + dock) integration
SunstoneNC Jun 27, 2026
32b7ade
Fix dev launcher to run without pnpm on PATH
SunstoneNC Jun 27, 2026
b309132
Expand Camera library to full Grok extension set (90 cards)
SunstoneNC Jun 27, 2026
2b2bc1f
Add tab enlarge/shrink, Shot Setup image+WASD, 16:9 workflow thumbs
SunstoneNC Jun 27, 2026
0ae2010
Add Saved Workflows and Plates panorama library
SunstoneNC Jun 27, 2026
5eb0d30
Add 3D Scene Builder for Plates; persist panel state across enlarge
SunstoneNC Jun 27, 2026
11a5c46
Add Downloads Browser (real-filesystem media library, left panel)
SunstoneNC Jun 27, 2026
eacaf8f
Don't block startup on missing local models when an LTX API key is pr…
SunstoneNC Jun 27, 2026
8e37800
Polish Prompt Manager Pro media UX and fix timeline playback bounds
SunstoneNC Jun 28, 2026
9eed893
Register dropped media as project assets; fix dock/menu-bar z-index c…
SunstoneNC Jun 28, 2026
3bd7d54
Downloads Browser accordion + audio support, matching chevrons, app r…
SunstoneNC Jun 28, 2026
081ea1b
Keep Gen Space alive across tabs, custom library folder, Post to X
SunstoneNC Jun 29, 2026
5638e36
Drag-and-drop into editor monitors, Plates, and Workflow slots; fix E…
SunstoneNC Jun 29, 2026
2f39023
Fix asset data-loss bug, harden autosave, add Save/Export/Import Project
SunstoneNC Jun 29, 2026
28ee56f
Rebrand Studio Assets/panel naming, fix panel-aware centering, restor…
SunstoneNC Jun 29, 2026
6f3b7a4
Boost clip volume to 200%, hold last frame at timeline end, expand Pe…
SunstoneNC Jun 29, 2026
036bf4e
Add tag/folder organization to Gen Space assets
SunstoneNC Jun 30, 2026
695ae3b
Fix tag/folder data loss caused by Video Editor's stale autosave snap…
SunstoneNC Jun 30, 2026
3a3e106
Persist timeline in/out points with the project
SunstoneNC Jun 30, 2026
3b91cb3
Surface errors from Export Project instead of failing silently
SunstoneNC Jun 30, 2026
32cd659
Add Duplicate Project action and fix Gen Space thumbnail shrink
SunstoneNC Jul 1, 2026
83116f3
Add LTX_MODELS_DIR env override for models directory
SunstoneNC Jul 1, 2026
b775907
Fix Gen Space thumbnail sizing and tag icon clipping
SunstoneNC Jul 1, 2026
b6106f4
Add Gen Space Clear Prompt button and fix deleted asset resurrection
SunstoneNC Jul 1, 2026
5111e91
Bump diffusers pin to pick up Krea2Pipeline
SunstoneNC Jul 2, 2026
c798fa5
Add Krea 2 Turbo as a self-hosted image generation model (backend)
SunstoneNC Jul 2, 2026
30fa538
Add Krea 2 Turbo model selector to Gen Space image mode
SunstoneNC Jul 2, 2026
1371ba1
Unblock Krea 2 on transformers 5.x and fix GPU memory management
SunstoneNC Jul 3, 2026
5d30287
Quantize Krea 2 transformer to NF4 for a ~3x speedup and lighter foot…
SunstoneNC Jul 3, 2026
88e9a08
Cache the NF4-quantized Krea 2 transformer to disk
SunstoneNC Jul 3, 2026
2a37d81
Quantize and cache the Krea 2 text encoder too
SunstoneNC Jul 3, 2026
df75cba
Add 21:9 to the Gen Space image aspect ratio dropdown
SunstoneNC Jul 3, 2026
b259a16
Add native right-click Cut/Copy/Paste menu to text fields
SunstoneNC Jul 4, 2026
518c3e0
Match Clear Prompt button to Prompt Manager Pro's blue and sizing
SunstoneNC Jul 4, 2026
9bd317b
Add inline project rename to the Project header
SunstoneNC Jul 4, 2026
f6ef1f2
Export color correction and fade-to-black/white transitions
SunstoneNC Jul 4, 2026
eaca537
Export wipe transitions (Phase 3)
SunstoneNC Jul 4, 2026
7a0eedd
Fix wipe direction naming to match intuitive expectation
SunstoneNC Jul 4, 2026
635b2cc
Export dissolve transitions (Phase 4)
SunstoneNC Jul 4, 2026
7673bf7
Fix dissolve export using the wrong xfade transition type
SunstoneNC Jul 4, 2026
6c3b942
Fix right panel default-open, label toggle tabs, and add folder drag-…
SunstoneNC Jul 4, 2026
56bbe19
Fix Gen Space tags not sticking and tag popup clipping past 4 options
SunstoneNC Jul 7, 2026
6cad51b
Fix dev launcher for repo relocation and missing peer dependency
SunstoneNC Jul 12, 2026
c2ff3a1
Integrate Qwen Multi-Angle camera tool into Studio Pro
SunstoneNC Jul 12, 2026
76354d1
Fix Multi-Angle state loss on enlarge/shrink, add progress bar and Li…
SunstoneNC Jul 12, 2026
4d5314c
feat: add 21:9 ultrawide aspect ratio for local video generation
SunstoneNC Jul 18, 2026
061ff53
feat: right-click Save video / Save video frame on video players
SunstoneNC Jul 18, 2026
f0c7ac2
Merge 21:9 ultrawide aspect ratio
SunstoneNC Jul 18, 2026
8103963
Merge Save video / Save video frame context menu
SunstoneNC Jul 18, 2026
cd6dc04
feat: render timer + cancel button for video generation
SunstoneNC Jul 19, 2026
28a0930
feat: curated color palette themes for the main app
SunstoneNC Jul 19, 2026
5f46e48
Public sync preview - 2026-07-19
Jul 19, 2026
ef4c7d7
docs: update NOTICES for Krea 2, Qwen multi-angle stack, and added deps
SunstoneNC Jul 19, 2026
129a4ea
refactor: rename the GPM panel to "Prompt Manager Pro"
SunstoneNC Jul 21, 2026
5b5efbc
docs: add FORK.md upstream-merge maintenance guide
SunstoneNC Jul 21, 2026
cd9395e
Merge upstream LTX Desktop 1.1.0
SunstoneNC Jul 21, 2026
c020f25
docs: update FORK.md for the 1.1.0 merge
SunstoneNC Jul 21, 2026
b9c6f5c
fix: stop the Settings tab row overflowing the modal
SunstoneNC Jul 21, 2026
26d3b6a
perf: free image pipelines on video swap instead of parking in host RAM
SunstoneNC Jul 22, 2026
93e26b6
perf: session-scoped streaming transformer cache (226s -> 35s warm gens)
SunstoneNC Jul 22, 2026
f1d566d
settings: default diffusion stage cache ON + save-path diagnostic
SunstoneNC Jul 23, 2026
e403f71
fix: harden stage cache against zombie generations and dirty wrappers
SunstoneNC Jul 23, 2026
1ddc14f
ux: warn on I2V Prompt Enhancer + surface the server-side prompt rewrite
SunstoneNC Jul 23, 2026
15e2bea
perf: Phase B - aux-model session cache + fp8 sidecar disk cache
SunstoneNC Jul 23, 2026
60d0e31
feat(gpm): performance UX punch list - spellcheck, save/persist, emot…
SunstoneNC Jul 23, 2026
6da2d8e
perf(qwen): redirect HF cache off the slow SATA HDD via LTX_HF_HOME
SunstoneNC Jul 23, 2026
4a6ccf3
ux(genspace): move Clear Prompt button next to the prompt box
SunstoneNC Jul 23, 2026
c829db2
feat(genspace): Regenerate — restore a past generation's full recipe
SunstoneNC Jul 24, 2026
71ec373
fix(genspace): move Regenerate to its own row in the card overlay
SunstoneNC Jul 24, 2026
ea922a7
perf(genspace): stop the asset gallery re-rendering on every prompt k…
SunstoneNC Jul 24, 2026
10a2c75
feat(editor): keep the loaded clip highlighted + mark timeline-used a…
SunstoneNC Jul 24, 2026
740f428
fix(genspace/editor): frame save, asset auto-refresh, remove reset ic…
SunstoneNC Jul 25, 2026
111fe2f
feat(studio-assets): live folder refresh via fs.watch instead of wind…
SunstoneNC Jul 25, 2026
4aa549c
Add Qwen Multi-Angle compose mode + Studio Assets newest-first sort
SunstoneNC Jul 25, 2026
be95cd1
Add "Continue as new shot" — branch a fresh clip from a video's last …
SunstoneNC Jul 26, 2026
cbd88a7
Continue from any frame — scrub-to-frame in the enlarged player
SunstoneNC Jul 26, 2026
934947b
Gen Space punch-list: lightbox Continue fix, 16:9 preview, image save…
SunstoneNC Jul 28, 2026
b80952c
Merge upstream LTX Desktop 1.2.x (LTX 2.5) into the fork
SunstoneNC Sep 11, 2026
ea90dad
LTX 2.5 runtime fixes: decode dtype, conv-VAE default, diffusion-cach…
SunstoneNC Sep 12, 2026
eecdab6
GenSpace UI: fix mojibake + continuation resolution, rename "Gen Spac…
SunstoneNC Sep 12, 2026
4cad0a9
Studio Assets: one-click quick-save downloads, new folders on top, cl…
SunstoneNC Sep 14, 2026
11563fb
GPM: drop Create-gallery images straight into Images folders and Shot…
SunstoneNC Sep 15, 2026
1f80b97
GPM drops: Shot Setup + Plates accept Create-gallery images; Plates h…
SunstoneNC Sep 15, 2026
c120896
Rebrand: LTX Desktop -> RiX Desktop Studio Pro (Michael Ricks fork)
SunstoneNC Sep 15, 2026
a4c5395
Python hosting: repoint first-run env download to the fork + add pack…
SunstoneNC Sep 15, 2026
7d9f901
UI: title-case panel tabs + size Studio Assets tab to match Prompt Ma…
SunstoneNC Sep 15, 2026
9c8bf90
Make GPM panels follow the app color palette
SunstoneNC Sep 15, 2026
d2ace82
Fix installer packaging: publish target, shortcut name, deps-hash ignore
SunstoneNC Sep 15, 2026
735076f
Guard against shipping a stale python-embed
SunstoneNC Sep 15, 2026
18cdb6d
Quiet the updater's benign "no release feed" error
SunstoneNC Sep 15, 2026
d22b364
Video editor: burn text overlays into the export
SunstoneNC Sep 16, 2026
ec9971e
Bundle app icon so the running window shows the RiX icon
SunstoneNC Sep 16, 2026
4f5457b
Video editor: drag transitions onto a cut
SunstoneNC Sep 16, 2026
f6c0f7d
Fix text-overlay export: drawtext parse failure + font
SunstoneNC Sep 17, 2026
fcae20a
Video editor: per-clip audio fade in / fade out
SunstoneNC Sep 17, 2026
1461827
Video editor: audio waveform fade handles, seam crossfade, volume line
SunstoneNC Sep 17, 2026
856b6cd
Video editor: audio volume automation keyframes
SunstoneNC Sep 17, 2026
9409b5d
Video editor: text overlay fade in / fade out
SunstoneNC Sep 17, 2026
3be0242
Fix 2.5-migration GenSpace regressions + Krea 2 Stop
SunstoneNC Sep 17, 2026
72b1763
Fix Z-Image Turbo hang via NF4 quantization; drop Krea 2 to 6 steps
SunstoneNC Sep 18, 2026
25c287d
Fix render-time chip bleeding over the prompt box
SunstoneNC Sep 19, 2026
906deba
Add Stop button to the IC-LoRA generation output panel
SunstoneNC Sep 19, 2026
9a7db57
Ingredients IC-LoRA: default it, tune its settings, accept image drops
SunstoneNC Sep 19, 2026
7952ac3
Content-aware auto-naming for saved assets (Phase 1: save-time)
SunstoneNC Sep 20, 2026
89c9435
Photo Studio + Multi-Angle: rename, bigger refs, auto-named save, typ…
SunstoneNC Sep 20, 2026
41fa8f2
Multi-Angle: quality modes, role-aware compositing, rename
SunstoneNC Sep 20, 2026
817d20d
Multi-Angle: skin-realism LoRA + Lightning negative-prompt cleanup
SunstoneNC Sep 20, 2026
6020d32
Performance Studio: fix on-screen text overlay + dialogue pre-roll
SunstoneNC Sep 21, 2026
7799ced
Video editor: live export progress bar
SunstoneNC Sep 21, 2026
c953973
Photo Edit + Multi-Angle: prompt injection + render-time chip
SunstoneNC Sep 21, 2026
4c49ee5
Prompt Manager: card-style prompt thumbnails + folders collapsed on open
SunstoneNC Sep 21, 2026
ae4f51b
Prompt Manager: 2-column prompt grid in the enlarged workspace
SunstoneNC Sep 21, 2026
67db414
Gen Space: intuitive prompt-box resize + polish
SunstoneNC Sep 23, 2026
2c048e3
Gen Space: multi-select + bulk tag/delete in the library
SunstoneNC Sep 23, 2026
3ceb1c6
Release v1.3.0
SunstoneNC Sep 23, 2026
48b67b8
Show model + seed in gen details; copy button on main prompt box
SunstoneNC Sep 24, 2026
89a10a1
Seed controls in prompt bar, variation boost for Z-Image/Krea 2
SunstoneNC Sep 28, 2026
3d84b92
Hide Krea 2 from release builds (dev-only)
SunstoneNC Sep 28, 2026
e1f3d59
Gen Space: masonry gallery layout + visible lightbox nav arrows
SunstoneNC Sep 29, 2026
bcf9069
Add RiX editor MCP server; fix editor imports, clip viewer audio, tex…
SunstoneNC Sep 29, 2026
05edf5a
Smooth, trim-aware audio waveforms on the timeline
SunstoneNC Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ backend/generated/
# Build artifacts
release/
python-embed/
# Generated at build time (sha256 of `uv export`); bundled into the app so the
# first-run downloader can match the hosted python-embed archive. Regenerated
# each build — must not be committed, or it would go stale vs. the lockfile.
python-deps-hash.txt

# Downloaded during CI for Windows NSIS installer
resources/vc_redist.x64.exe
401 changes: 401 additions & 0 deletions FORK.md

Large diffs are not rendered by default.

33 changes: 32 additions & 1 deletion NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,38 @@ used by LTX Desktop.
License: Apache License 2.0
https://huggingface.co/hr16/yolox-onnx

- **Krea 2 Turbo**
Copyright (c) Krea AI.
License: Krea 2 Community License
https://huggingface.co/krea/Krea-2-Turbo

- **Qwen-Image-Edit-2511**
Copyright (c) Alibaba Cloud / Qwen Team.
License: Apache License 2.0
https://huggingface.co/Qwen/Qwen-Image-Edit-2511

- **Qwen-Image-Edit-2511 (GGUF quantization)**
Copyright (c) Unsloth AI; base model (c) Alibaba Cloud / Qwen Team.
License: Apache License 2.0
https://huggingface.co/unsloth/Qwen-Image-Edit-2511-GGUF

- **Qwen-Image-Edit-2511 Multiple Angles LoRA**
Copyright (c) fal.ai.
License: Apache License 2.0
https://huggingface.co/fal/Qwen-Image-Edit-2511-Multiple-Angles-LoRA

- **Qwen-Image-Edit-2511 Lightning LoRA**
Copyright (c) LightX2V contributors.
License: Apache License 2.0
https://huggingface.co/lightx2v/Qwen-Image-Edit-2511-Lightning

---

## Python Dependencies

- **pillow** — Copyright (c) Jeffrey A. Clark and Pillow contributors — HPND License
- **torch** — Copyright (c) Meta Platforms, Inc. — BSD 3-Clause License
- **torchvision** — Copyright (c) Soumith Chintala and torchvision contributors — BSD 3-Clause License
- **huggingface-hub** — Copyright (c) Hugging Face — Apache License 2.0
- **tqdm** — Copyright (c) Casper da Costa-Luis — Mozilla Public License 2.0
- **pynvml** — Copyright (c) NVIDIA Corporation — BSD 3-Clause License
Expand All @@ -57,6 +83,8 @@ used by LTX Desktop.
- **protobuf** — Copyright (c) Google LLC — BSD 3-Clause License
- **transformers** — Copyright (c) Hugging Face — Apache License 2.0
- **sentencepiece** — Copyright (c) Google LLC — Apache License 2.0
- **bitsandbytes** — Copyright (c) Facebook, Inc. and its affiliates — MIT License
- **gguf** — Copyright (c) GGML (ggml.ai) — MIT License
- **sageattention** — Copyright (c) Jintao Zhang et al. — Apache License 2.0
- **natten** — Copyright (c) Ali Hassani, Steven Walton, et al. (SHI Labs) — Apache License 2.0
- **opencv-python-headless** — Copyright (c) OpenCV team — Apache License 2.0
Expand All @@ -77,8 +105,11 @@ used by LTX Desktop.
- **electron-updater** — Copyright (c) electron-userland — MIT License
- **js-yaml** — Copyright (c) Vitaly Puzrin — MIT License
- **lucide-react** — Copyright (c) Lucide contributors — ISC License
- **react-dropzone** — Copyright (c) Param Aggarwal — MIT License
- **react-resizable-panels** — Copyright (c) Brian Vaughn — MIT License
- **tailwind-merge** — Copyright (c) dcastil — MIT License
- **use-sync-external-store** — Copyright (c) Meta Platforms, Inc. and affiliates — MIT License
- **zod** — Copyright (c) Colin McDonnell — MIT License
- **zustand** — Copyright (c) Paul Henschel and Poimandres contributors — MIT License

---

Expand Down
39 changes: 39 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,45 @@ Your models folder is the location you chose during setup, or the default for yo

Open the selector to tick one or more LoRAs and adjust each one's strength. If you added files while the app was already open, reopen the generation view (or restart the app) — the installed‑LoRA list is read on load.

## LoRA/IC-LoRA Library

LoRA adapters let you steer **local** video generation toward a specific style or subject. They apply to local generation (Windows/Linux NVIDIA hardware or Apple Silicon Macs), for text-to-video, image-to-video, and audio-to-video — not in API/cloud mode.

In local mode, **Browse LoRAs** (styles/subjects for text/image/audio-to-video) and **Browse IC-LoRAs** (in-context effects, e.g. video-to-video) open a built-in library of ready-to-download LoRAs — no manual file placement needed. Each entry shows a preview, its instructions, and a link to its Hugging Face page; some gated models require signing in with Hugging Face first. Entries authored by **LTX** are official; everything else is community-contributed and flagged with a disclaimer that LTX doesn't endorse or take responsibility for it.

### Custom LoRAs

You can also use your own `.safetensors` LoRA files instead of (or alongside) the library.

**Which LoRAs are supported.** The app generates locally with the **LTX‑2.3 (22B)** model. "LTX‑2" is the model generation and "2.3" is its current release, so LoRAs labeled **LTX‑2** or **LTX‑2.3** both target this model and are supported. This includes LoRAs exported from ComfyUI for LTX‑Video (their key names are remapped automatically). A LoRA whose tensors don't match the model is simply skipped, so it has no effect rather than producing an error. LoRAs built for other base models (e.g. SDXL, Wan, Hunyuan, or older LTXV 0.9.x) target a different architecture and will not take effect.

**Where to put the files.** Library downloads land in their own subfolder under `loras/` (one per LoRA), so it's safe to drop your own `.safetensors` files straight into the `loras/` (or `lora/`) subfolder of your models folder:

```
models/
└── loras/
├── cinematic.safetensors
├── claymation.safetensors
└── <lora-id>/ ← library download, one subfolder per LoRA
└── model.safetensors
```

> **Use the `loras/` subfolder.** A file is detected as a LoRA only if it lives in a folder named `loras`/`lora` **or** its filename contains `lora` — and many LoRAs aren't named that way. Dropping them straight into `loras/` is the reliable option; it won't collide with library downloads, which each get their own subfolder. Subfolders are scanned recursively, so further nesting is fine.

Your models folder is the location you chose during setup, or the default for your platform:

- **Windows:** `%LOCALAPPDATA%\LTXDesktop\models\`
- **macOS:** `~/Library/Application Support/LTXDesktop/models/`
- **Linux:** `$XDG_DATA_HOME/LTXDesktop/models/` (default: `~/.local/share/LTXDesktop/models/`)

**When the LoRA button appears.** In the generation view, a **LoRA** selector appears next to the other video settings (FPS, aspect ratio) only when **all** of these are true:

1. You're in **Video** generation mode (not Image, Retake, or IC‑LoRA).
2. You're generating **locally** — not in API/cloud generation mode.
3. **At least one** LoRA file is detected in the models folder.

Open the selector to tick one or more LoRAs and adjust each one's strength. If you added files while the app was already open, reopen the generation view (or restart the app) — the installed‑LoRA list is read on load.

## API keys, cost, and privacy

### LTX API key
Expand Down
18 changes: 18 additions & 0 deletions backend/_routes/qwen_multiangle.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""Route handler for POST /api/qwen-multiangle/generate."""

from __future__ import annotations

from fastapi import APIRouter, Depends

from api_types import QwenMultiAngleGenerateRequest, QwenMultiAngleGenerateResponse
from state import get_state_service
from app_handler import AppHandler

router = APIRouter(prefix="/api", tags=["qwen-multiangle"])


@router.post("/qwen-multiangle/generate", response_model=QwenMultiAngleGenerateResponse)
def route_qwen_multiangle_generate(
req: QwenMultiAngleGenerateRequest, handler: AppHandler = Depends(get_state_service)
) -> QwenMultiAngleGenerateResponse:
return handler.qwen_multiangle.generate(req)
48 changes: 47 additions & 1 deletion backend/api_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
"gemma4-12b-with-proj-ltx-2.5",
"gemma-4-e2b-it",
"z-image-turbo",
"krea-2-turbo",
]
ImageGenerationModelCheckpointID = Literal["z-image-turbo", "krea-2-turbo"]
LTXLocalModelId = Literal[
"ltx-2.5-22b-distilled",
"ltx-2.3-22b-distilled-1.1",
Expand Down Expand Up @@ -161,6 +163,8 @@ class SuggestGapPromptResponse(BaseModel):
class GenerateVideoCompleteResponse(BaseModel):
status: Literal["complete"]
video_path: str
# Seed actually used (None for API providers that don't expose it).
seed: int | None = None


class GenerateVideoCancelledResponse(BaseModel):
Expand All @@ -173,6 +177,8 @@ class GenerateVideoCancelledResponse(BaseModel):
class GenerateImageCompleteResponse(BaseModel):
status: Literal["complete"]
image_paths: list[str]
# Base seed; image i in the batch used seed + i.
seed: int | None = None


class GenerateImageCancelledResponse(BaseModel):
Expand Down Expand Up @@ -475,7 +481,7 @@ class GenerateVideoRequest(BaseModel):
lastImagePath: str | None = None
keyframes: list[KeyframeInput] = Field(default_factory=list[KeyframeInput])
audioPath: str | None = None
aspectRatio: Literal["16:9", "9:16"] = "16:9"
aspectRatio: Literal["16:9", "9:16", "21:9"] = "16:9"
seed: int | None = None
loras: list[LoraEntry] = Field(default_factory=list[LoraEntry])

Expand All @@ -484,12 +490,15 @@ class GenerateImageRequest(BaseModel):
model_config = ConfigDict(strict=True)

prompt: NonEmptyPrompt
model: ImageGenerationModelCheckpointID = "z-image-turbo"
width: int = Field(default=1024, ge=16)
height: int = Field(default=1024, ge=16)
numSteps: int = Field(default=4, ge=1)
numImages: int = Field(default=1, ge=1)
imagePath: str | None = None
strength: float = Field(default=0.6, ge=0.0, le=1.0)
# Z-Image text-to-image only: 0 = off, 1 = max composition variety across seeds.
variation: float = Field(default=0.0, ge=0.0, le=1.0)


def _default_model_types() -> set[ModelCheckpointID]:
Expand Down Expand Up @@ -558,6 +567,7 @@ class TargetResolution(BaseModel):
height: int = Field(gt=0)



class RetakeRequest(BaseModel):
model_config = ConfigDict(strict=True)

Expand Down Expand Up @@ -592,6 +602,42 @@ class ExtendRequest(BaseModel):
ExtendResponse: TypeAlias = RetakeResponse


class QwenMultiAngleGenerateRequest(BaseModel):
model_config = ConfigDict(strict=True)

image_data_url: str
# Compose mode: additional reference images (prop, location, wardrobe) fed to
# Qwen alongside the subject. image_data_url is the subject being re-angled;
# these are extra context the model composes from. Empty = classic single-image.
extra_image_data_urls: list[str] = Field(default_factory=list)
# Role of each extra ref, aligned index-for-index with extra_image_data_urls:
# "location" = a scene the subject is composited INTO, "prop" = an object the
# subject holds/uses. Empty (or length-mismatched) = classic compose, no
# explicit compositing instruction. Drives compose_prompt().
extra_image_roles: list[Literal["location", "prop"]] = []
azimuth_deg: float
elevation_deg: float
zoom: float
seed: int = 42
randomize_seed: bool = False
# Sampling recipe: "fast" = 4-step Lightning (~30s, softer skin), "balanced"
# = 8-step Lightning (retains more texture, ~2x fast), "quality" = 28-step
# base, no distillation LoRA (sharpest skin, slowest). See the GGUF pipeline.
quality_mode: Literal["fast", "balanced", "quality"] = "fast"
# Optional skin-realism LoRA stacked on top of the active mode; skin_weight
# scales it (recommended ~0.6-1.2) so it doesn't overpower the angles LoRA.
use_skin: bool = False
skin_weight: float = 1.0
extra_prompt: str = ""


class QwenMultiAngleGenerateResponse(BaseModel):
status: Literal["complete"] = "complete"
image_data_url: str
prompt: str
seed: int


ConditioningType: TypeAlias = Literal["canny", "depth"]

# Generation can additionally run a user-supplied IC-LoRA against a pre-rendered
Expand Down
2 changes: 2 additions & 0 deletions backend/app_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from _routes.image_gen import router as image_gen_router
from _routes.prompt_enhancement import router as prompt_enhancement_router
from _routes.models import router as models_router
from _routes.qwen_multiangle import router as qwen_multiangle_router
from _routes.suggest_gap_prompt import router as suggest_gap_prompt_router
from _routes.retake import router as retake_router
from _routes.extend import router as extend_router
Expand Down Expand Up @@ -161,6 +162,7 @@ async def _route_generic_error_handler(request: Request, exc: Exception) -> JSON
app.include_router(image_gen_router)
app.include_router(suggest_gap_prompt_router)
app.include_router(retake_router)
app.include_router(qwen_multiangle_router)
app.include_router(extend_router)
app.include_router(ic_lora_router)
app.include_router(lora_catalog_router)
Expand Down
Loading