feat(enhance): LoRA switches per template (#218)

A template can offer optional LoRAs the app turns on or off.

- enhance.toml: [[template.lora]] { id, label, default } per template.
  Each id drives every workflow node titled `imageapi:lora:<id>`, so
  Wan's high- and low-noise pair share one switch.
- POST /enhance takes `loras: {id: bool}`; a missing id uses its default,
  an id the template doesn't offer is a 400. Off sets strength_model
  (and strength_clip when present) to 0, so the graph is never rewired.
- The resolved switches are stored on the job (new enhance_jobs.loras
  JSON column) and returned in the job view, so a retry or adjust can
  repeat them; GET /enhance/templates lists each template's switches.
- A lora-titled node without a declaration keeps its exported strength,
  and a declaration without nodes isn't offered; both are startup
  warnings. A lora-titled node without a numeric strength_model fails
  the template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Cameron CordesandClaude Opus 5.5 committed 2026-11-03 13:53:53 -05:00
1 parent e317bfee98
commit 31da21e061
12 files changed
+910 -33

No files matched your search

+18
View File
@@ -63,3 +63,21 @@ prompt_mode = "replace"
# name = "restore-dev"
# label = "Restore (Dev, slow)"
# file = "/media/nas/image_fibo2_restore_imageapi_API.json"
# A video template with optional LoRAs the app can switch on or off (#218).
# Each [[template.lora]] matches the workflow's LoRA loader nodes titled
# "imageapi:lora:<id>" (Wan's high- and low-noise pair share one id). Off sets
# their strength_model (and strength_clip) to 0; the graph isn't rewired.
# Nodes titled that way with no entry here keep their exported strength.
[[template]]
name = "animate"
label = "Animate"
description = "A short clip from the photo."
file = "/media/nas/image_wan22_animate_imageapi_API.json"
prompt_join = ", "
output_megapixels = 0.92
[[template.lora]]
id = "style" # node title "imageapi:lora:style"
label = "Style"
default = false # default: false; used when the request omits it