So the app builds against the final shape: each [[template.lora]] gains
`strength` (the scale when on, default 1.0) and `min` / `max` (the
slider's range, default 0.0-1.5).
- POST /enhance `loras` takes true / false or a scale: true = strength,
false or <= 0 = off, a scale is clamped to min..max.
- The scale multiplies each node's exported strength_model /
strength_clip, so 1.0 = as exported and a high/low pair keeps its
ratio.
- Jobs and the job view store the resolved scale per id (0 = off);
GET /enhance/templates lists strength, min and max.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>