Commit Graph

244 Commits

Author SHA1 Message Date
github-actions[bot] 2c6cebde83 format: auto-format code [skip ci] 2026-05-18 19:18:25 +00:00
Adam Ladachowski a9d1dea002 Merge pull request #1 from saiden-dev/feat/generate-yaml-input
feat(generate): accept YAML in --input alongside JSON
2026-05-18 21:17:45 +02:00
aladac c911abfe69 feat(generate): accept YAML in --input alongside JSON
`tsr generate --input <file>` previously only understood JSON, which was
awkward for hand-authored template libraries (e.g. ~/Projects/draw/templates/
ships *.yml scene files with embedded newlines and unquoted keys that mirror
the `tsr template` output shape).

Behavior:
- Files with .yml / .yaml extension parse as YAML; .json (or unknown
  extensions whose first non-whitespace char is '{' or '[') parse as JSON.
- Inline strings starting with '{' still parse as JSON (regression-safe).
- Inline strings without leading '{' now parse as YAML, enabling
  `tsr generate --input 'prompt: foo\nmodel: bar.safetensors'` without
  shell-quoting a JSON object.
- All downstream key-mapping / CLI-override / character / scene / lora
  / count handling is identical to the JSON path — parsing only differs.

Implementation:
- New `_parse_generate_input(value)` helper in tensors/cli.py centralizes
  source detection (file vs inline), format selection (extension or
  content sniff), and rich-formatted error reporting via typer.Exit(1).
- The pre-existing inline JSON merge block in `generate` is reduced to a
  single call to the helper.
- Adds pyyaml>=6.0 as a runtime dep. It was already transitively pulled
  in by huggingface_hub, but we depend on it directly so the surface
  contract is explicit and survives a hub re-pin.
- mypy override added for the yaml module (no upstream stubs in tree).

Tests:
- 20 new tests in tests/test_generate_input.py covering inline JSON,
  inline YAML, file by extension (.json/.yml/.yaml), unknown extension
  content sniffing, non-mapping rejection, malformed input handling,
  CLI-flag-wins-over-input precedence, and a full smoke against the
  exact draw template shape (with embedded newlines in the scene list).
- 359 -> 379 total tests. Lint clean on changed lines.

Co-Authored-By: OpenCode <noreply@anomaly.co>
2026-05-18 21:16:11 +02:00
github-actions[bot] 3f319bc016 format: auto-format code [skip ci] 2026-05-18 19:05:18 +00:00
aladac aa25d31ca9 feat(templates): add bulk template extraction from CivitAI showcase
Adds the `tsr templates` subapp with extract / list / show / delete
commands. The headline command is:

    tsr templates extract <model> [--generate]

which pulls a model's CivitAI showcase, deduplicates prompts, derives
recommended generation params (sampler / scheduler / steps / cfg /
guidance) from the *mode* of the showcase image metadata, and writes one
JSON template per unique prompt to
~/.local/share/tensors/templates/<model_stem>/<scene_name>.json.

Each emitted template has the same shape as `tsr template -m <model>`
output and feeds straight into `tsr generate --input`. `--generate`
chains the generation step end-to-end.

New module `tensors/templates.py` carries the storage + extraction
helpers (`save_template`, `load_template`, `list_templates`,
`build_template`, `param_from_civitai_meta`,
`derive_overrides_from_images`) plus the CivitAI A1111 → ComfyUI
sampler/scheduler name normalization tables.

Replaces the external generate_templates.py wrapper script that was
maintaining a hand-curated MODEL_OVERRIDES dict — overrides now derive
automatically from each model's own showcase data.
2026-05-18 21:04:21 +02:00
aladac 2cbef237df feat(scene): add extract command and make main prompt optional
- Made the main prompt argument optional in generate and style-sweep
  if scene, scene_prompt, character, or character_prompt are provided.
- Added tsr scene extract <model> command to fetch a model's CivitAI
  showcase images and save their prompts as scenes in the local
  library. Prompts are deduplicated and saved as <model>_01.yml, etc.
2026-05-18 20:15:52 +02:00
aladac cd8cea67ef feat(config): register diffusion_models as a first-class path key
ComfyUI keeps UNet-only Flux checkpoints under models/diffusion_models/
(paired with separate clip/ and vae/ files), distinct from the unified
models/checkpoints/. tsr previously had no way to track that directory
in its config — `tsr config --set-path diffusion_models=...` errored
because the CLI validator's allow-list only knew the 7 CivitAI-aligned
types (checkpoints, loras, embeddings, vae, controlnet, upscalers,
other). Workaround was a manual symlink from diffusion_models/ back
into checkpoints/, which is fragile (mixed link styles, breaks if the
target file is reorganised) and confuses `tsr models`/`tsr db list`
(same file shows up under two loader headings).

Changes:

- config.py: new VALID_PATH_TYPES constant as the single source of
  truth for keys accepted by `tsr config --set-path KEY=PATH`. Adds
  "diffusion_models" to the list and a synthetic "DiffusionModel"
  bucket in DEFAULT_PATHS pointing at MODELS_DIR/diffusion_models.
  Comment notes that CivitAI does not have a DiffusionModel
  model_type (UNet-only Flux files are returned as "Checkpoint"), so
  auto-routing from `tsr dl` will never pick this bucket — it exists
  for explicit `tsr dl -o /path/to/diffusion_models` workflows and for
  `tsr config --show` visibility into where the dir lives on disk.

- cli.py: imports VALID_PATH_TYPES and replaces the two duplicated
  inline lists (set-path validator + custom-marker display in the
  `config` command). No behaviour change for the existing 7 types.

After this lands and is `uv tool upgrade tensors`'d, users can
`tsr config --set-path diffusion_models=/path/to/comfyui/models/diffusion_models`
and `tsr dl -v <civitai-version-id> -o /path/to/diffusion_models` for
UNet-only Flux downloads, no more symlink workarounds.
2026-05-18 19:29:46 +02:00
chi 60066f3ec2 feat(cli): resolve bare model/lora names to .safetensors silently
Before: `tsr generate -m lust_v10` failed validation with a 'did you mean'
hint pointing at 'lust_v10.safetensors'. Annoying because the bare name is
what the user typed and what `tsr models` prints back to them.

After: when the exact name misses and there is exactly one suffixed variant
in the target bucket (diffusion_models/ or checkpoints/), the validator
prints a dim '[Resolved 'X' \u2192 'X.safetensors']' line and substitutes the
canonical filename before forwarding to ComfyUI. Extensions tried in order:
.safetensors, .ckpt, .gguf, .pt, .bin. Same logic applies to LoRA names.

Ambiguous matches (multiple extensions present) still fail \u2014 the user must
disambiguate explicitly. Names that already contain a dot are left alone.

Function signature changes from -> None to -> tuple[str, str | None] so the
caller can pick up the resolved names.
2026-05-18 15:07:41 +02:00
github-actions[bot] fc5ea1a44b format: auto-format code [skip ci] 2026-05-18 00:20:10 +00:00
aladac ad31341a4d feat(scenes): add scene fragment library mirroring characters
Extracts the per-name YAML-list storage logic out of tensors/characters.py
into a new generic tensors.fragments.FragmentLibrary class, then layers two
kind-specific function-style modules on top:

- tensors.characters (unchanged public API, now thin wrapper)
- tensors.scenes (new): save_scene / load_scene / list_scenes / delete_scene /
  scene_path / resolve_scene, stored in ~/.local/share/tensors/scenes/

CLI additions:
- tsr scene save -o <name> 'elem1, elem2, ...'
- tsr scene list / show / delete

Wired into generate + template + style-sweep:
- tsr generate -S <name> / --scene-prompt 'elems' injects scene elements
  into the positive prompt right after the character block (order:
  quality_prefix -> character -> scene -> rating -> user)
- tsr template -S <name> / --scene-prompt 'elems' embeds a 'scene' list
  field in the dumped JSON template (named + inline merged, deduped)
- style-sweep templates accept 'scene' (str|list) and 'scene_prompt' keys
- generate --input JSON honors both 'scene' (str=name or list=inline)
  and 'scene_prompt' keys

FragmentLibrary uses kind-aware error messages (e.g. "Invalid scene name"
vs "Invalid character name") so users see the right context.

28 new tests cover the generic library + scenes. Bumps version to 0.1.24
(supersedes v0.1.23 which failed to publish due to a transient Sigstore
network error).
2026-05-18 02:19:23 +02:00
github-actions[bot] a0524cbf5e format: auto-format code [skip ci] 2026-05-18 00:12:53 +00:00
aladac 74d68261df feat(characters): named prompt-fragment library + --character/--character-prompt
Adds a 'character' subsystem for reusable prompt fragments stored as YAML
lists in ~/.local/share/tensors/characters/<name>.yml.

New tensors.characters module:
- save_character / load_character / list_characters / delete_character
- parse_elements + resolve_character (named + inline merge with dedup)
- Path-traversal-safe name validation ([A-Za-z0-9_.-]+)
- JSON-encoded YAML scalars on write; tolerant reader (JSON, single-quoted YAML, bare)

New CLI:
- tsr character save -o <name> 'elem1, elem2, ...'
- tsr character list / show / delete

Wired into generate + template + style-sweep:
- tsr generate -C <name> / --character-prompt 'elems' injects character
  elements into the positive prompt (after quality_prefix, before user prompt)
- tsr template -C <name> / --character-prompt 'elems' embeds a 'character'
  list field in the dumped JSON template (named + inline merged, deduped)
- style-sweep templates accept 'character' (str|list) and 'character_prompt'
  keys; lists are passed through verbatim, names are looked up at run-time
- generate --input JSON honors both 'character' (str=name or list=inline)
  and 'character_prompt' keys

37 new tests cover module behavior. Bumps version to 0.1.23.
2026-05-18 02:12:15 +02:00
aladac f0ee712b61 feat(generate): drop automatic LoRA trigger word injection
Removes the --triggers/--no-triggers flag from generate, style-sweep, and
the deprecated comfy generate path. Trigger words are no longer auto-added
to prompts; users must include them explicitly. DB lookups remain available
via 'tsr db triggers' and /api/db/triggers for manual inspection.

Bumps version to 0.1.22.
2026-05-18 01:19:43 +02:00
github-actions[bot] 0092a74129 format: auto-format code [skip ci] 2026-05-17 16:45:07 +00:00
github-actions[bot] 280f88e0d9 style: auto-fix ruff warnings [skip ci] 2026-05-17 16:44:53 +00:00
aladac 1908cf91c4 feat(style-sweep): --parallel-queue/-P for concurrent ComfyUI submissions
Adds client-side concurrent queueing to style-sweep. -P N submits N
prompts to ComfyUI's HTTP queue concurrently via ThreadPoolExecutor.
The GPU still processes one prompt at a time (ComfyUI's queue is
single-worker), but the HTTP submission, websocket polling, image
download, and disk-write phases pipeline with the next prompt's
submission.

Expected speedup: 5-15% on a typical Flux sweep where per-image GPU
time is ~25-30s and overhead is ~3-5s. Real benefit grows with
slower networks or larger images.

Design choices:
- Default P=1 preserves the exact existing sequential behavior and
  log output (no "(submit #N)" suffix in messages).
- P>1 uses ThreadPoolExecutor.as_completed for completion-order
  reporting; the manifest is re-sorted to source-list order after.
- Skip-existing + dry-run cases are handled synchronously before the
  executor even starts (no point pipelining no-ops).
- --abort-on-error is incompatible with parallelism (can't reliably
  stop in-flight workers); we warn and continue.
- Per-task console output WILL interleave under -P>1 because
  _run_generation prints its own progress; users are pointed at the
  manifest for clean per-slug timing.

Why not full async multi-GPU-workflow parallelism:
- ComfyUI processes its queue strictly sequentially; we can't
  actually run two Flux UNets concurrently without a second ComfyUI
  instance, second port, second model dir, etc.
- Even with two instances on one GPU, the CUDA cores time-slice and
  you get ~1.1x not 2x.
- Memory math is tighter than it looks even on Spark's 80GB unified
  pool: two Flux dev instances = 64GB fixed before any activations.
- Maintenance burden is real; speed gain is marginal.

Client-side pipelining gets the practical wins (overhead hiding,
cleaner progress feedback for long sweeps) without the complexity
or OOM risk.

7 new tests covering: invalid P=0, P=1 equivalence with sequential,
multi-style execution, source-order manifest preservation under
chaotic completion, skip-existing in parallel mode, individual
failure containment, and abort-on-error warning.

267 -> 274 tests.
2026-05-17 18:44:15 +02:00
github-actions[bot] e063911178 format: auto-format code [skip ci] 2026-05-17 16:40:09 +00:00
github-actions[bot] 592b6858eb style: auto-fix ruff warnings [skip ci] 2026-05-17 16:39:54 +00:00
aladac 6935491081 feat(generate): validate model availability against live ComfyUI before queueing
Catches mismatches between local intent and what's actually loaded on the
ComfyUI host. Replaces ComfyUI's generic 400 'prompt_outputs_failed_validation'
with a clear "model X not available on host — did you mean Y?" suggestion.

Why: when a user types `tsr generate -m getphatFLUXReality_v5Hardcore` but
only v11Softcore is installed, they got a 30-line raw API error buried in
node validation output. Now they get one red line plus three fuzzy-matched
candidates from the actual loader bucket.

Implementation:
- Extends get_loaded_models() in comfyui.py to include the diffusion_models
  bucket (UNETLoader -> unet_name). Previously only checkpoints, loras, vae,
  clip, controlnet, upscale_models were exposed.
- New _validate_model_available() helper in cli.py runs after family
  detection, before prompt enhancement. Maps family -> loader bucket:
  flux_unet / flux2_klein -> diffusion_models/, else checkpoints/. Uses
  difflib.get_close_matches for the "did you mean" hint.
- Validates LoRA presence too when -l is passed.
- Special hint: if the requested file IS in checkpoints/ but the family
  requires diffusion_models/, suggests the symlink command the user needs
  to run on the host. Common case for newly-uploaded UNet-only checkpoints.
- Network failures are non-fatal — falls through to let ComfyUI surface
  the error itself rather than blocking on a stale endpoint.
- Skipped in --json mode (machine callers) and --remote dispatches (the
  server validates remotely).

8 new tests covering: unknown model in checkpoints bucket, unknown in
diffusion_models, flux2_klein routing, happy path, missing LoRA, network
failure, symlink hint, and a source-level check that the
diffusion_models bucket is wired into get_loaded_models.

259 -> 267 tests.
2026-05-17 18:37:13 +02:00
aladac b7263d1229 feat(workflow): support Flux.2 Klein 9B checkpoints (CLIPLoader type=flux2)
Adds a `flux2_klein` model family for Black Forest Labs' Flux.2 Klein 9B
release. Different architecture from Flux.1 D — required a separate
workflow rather than extending flux_unet.

Architecture differences from Flux.1 D:
- Single Qwen3-8B text encoder via CLIPLoader(type=flux2), producing
  12288-dim conditioning (3 stacked hidden layers). NOT DualCLIPLoader.
- EmptyFlux2LatentImage instead of EmptySD3LatentImage (different
  latent shape).
- Custom-sampling pipeline: Flux2Scheduler -> SIGMAS, fed into
  SamplerCustomAdvanced together with BasicGuider + RandomNoise +
  KSamplerSelect. No standalone KSampler node, so the caller's
  scheduler argument is ignored.
- Dedicated VAE: flux2-vae.safetensors (not Flux.1's ae.safetensors).

Detection:
- New FLUX2_KLEIN_PATTERNS constant lists known Klein filenames
  ("lust_", "moodydesire"). _is_flux2_klein() checks base_model field
  first ("flux.2 klein" / "flux2 klein") then filename pattern.
- detect_model_family() runs the Klein check BEFORE flux_unet, so
  Klein checkpoints that also match UNet-only patterns (lust_v10,
  moodyDesireMix) correctly route to flux2_klein.

Affected checkpoints reclassified from flux_unet -> flux2_klein:
- lust_v10.safetensors (Flux.2 Klein 9B-base per CivitAI DB)
- moodyDesireMix_v20PRO.safetensors (Flux.2 Klein 9B)

Still flux_unet (genuinely Flux.1 D UNet-only):
- cyberrealisticFlux_v25, fcFluxPonyPerfectBase,
  getphatFLUXReality_v11Softcore.

Required ComfyUI host setup (one-time):
- /home/madcat/comfyui/models/text_encoders/qwen_3_8b_fp8mixed.safetensors
  (8.1 GB, from Comfy-Org/vae-text-encorder-for-flux-klein-9b on HF)
- /home/madcat/comfyui/models/vae/flux2-vae.safetensors (321 MB)

Verified end-to-end on madcat: lust_v10 generated successfully through
the new flux2_klein workflow (~85s per image at 1024x1024, 20 steps).

7 new tests; 253 -> 259 total. Existing flux_unet tests retargeted to
genuine Flux.1 D checkpoints (getphat, fcFluxPony, cyberrealisticFlux).
2026-05-17 18:22:23 +02:00
aladac 3e04929515 feat(workflow): support UNet-only Flux.1 D checkpoints via DualCLIPLoader
Adds a `flux_unet` model family for Flux.1 D checkpoints that ship only the
UNet weights (no baked-in CLIP/T5/VAE) and require external encoder loading.

Affected checkpoints: lust_v10, cyberrealisticFlux_v25,
getphatFLUXReality_v11Softcore, moodyDesireMix_v20PRO,
fcFluxPonyPerfectBase. These live in `models/diffusion_models/` (or
`models/unet/`) on the ComfyUI host and are loaded via UNETLoader instead
of CheckpointLoaderSimple.

Detection:
- New `FLUX_UNET_ONLY_PATTERNS` constant in config.py lists known
  UNet-only filename substrings.
- `detect_model_family()` returns `flux_unet` when any pattern matches,
  taking precedence over base_model field (same architecture-override
  pattern used for FluxPony hybrids).

Workflow:
- New flux_unet workflow in comfyui.py uses UNETLoader + DualCLIPLoader
  (clip_l.safetensors + t5xxl_fp16.safetensors, type=flux) + VAELoader
  (ae.safetensors) wired into the same Flux KSampler graph as the
  monolithic flux family.
- Family defaults inherit from flux (sampler/scheduler/steps/cfg) with
  external_clip flag set.

Smoke-tested end-to-end on madcat with getphatFLUXReality_v11Softcore
producing valid output. Flux.2 Klein checkpoints (lust_v10,
moodyDesireMix) still fail because they require a different text encoder
(qwen_3_8b) — see follow-up commit.

13 new tests; 240 -> 253 total.
2026-05-17 18:15:33 +02:00
aladac af61ba79c9 feat(cli): add --list and --style filter flags to style-sweep
--list/-L prints the resolved styles list as a two-column rich table
(slug + suffix truncated to ~80 chars) and exits without generating.
Template becomes optional when --list is paired with an explicit
--styles source, so you can inspect any styles file standalone.

--style/-S SLUG selects a single style by exact slug match; repeatable
for multiple. Unknown slugs error red with the available slug list.
Filter applies before --limit and preserves the source file's order.

Both flags compose with --limit and --dry-run; when filtering down to
a subset, the manifest is still written for the smaller run.
2026-05-17 16:47:52 +02:00
aladac 0a2da5a98b feat(cli): add style-sweep command for batched style variation
New `tsr style-sweep` command renders one image per style suffix from a
template JSON, composing prompt = template.prompt + ', ' + style.suffix
and writing to {output_dir}/{slug}.png.

- Template JSON mirrors `generate --input` keys plus output_dir + styles.
- Styles source can be a path or inline list/object on either CLI or
  template. Relative styles paths in the template resolve against the
  template's directory (so templates can ship with their styles file).
- Skips existing outputs by default (--no-skip-existing to force).
- --dry-run prints planned prompts/paths without invoking generate.
- --limit N caps the sweep for fast iteration.
- --continue-on-error keeps going on individual failures; final exit code
  is non-zero if any style failed and failed slugs are reported.
- --remote propagates to the underlying generation, same as `generate`.
- Writes a manifest {output_dir}/_sweep.json with per-style results
  (slug, prompt, output, seed, duration_sec, success, error).

Delegates to the `_run_generation` helper extracted from `generate`.
2026-05-17 16:33:13 +02:00
aladac e1422b8f51 refactor(cli): extract _run_generation helper from generate
Move the post-merge body of generate() into a module-level _run_generation
helper so it can be invoked directly by other commands (next: style-sweep)
without going through Typer argv reconstruction.

No behaviour change. generate() still owns the --input JSON merge and CLI
parameter-source detection, then delegates to _run_generation.
2026-05-17 16:32:51 +02:00
aladac b66bc98386 feat(generate): expose --guidance flag for Flux models
Threads guidance value through CLI → remote payload → server schema →
generate_image() → FluxGuidance node. Ignored for non-Flux families.

Use cases:
- Lower guidance (2.0-3.0) for looser, more photorealistic Flux output
- Higher guidance (4.0-6.0) for tighter prompt adherence
2026-05-17 15:54:47 +02:00
aladac 338a7fe267 fix(generate): dispatch hybrid Flux models to Flux workflow
Models like gonzalomoXLFluxPony are architecturally Flux but CivitAI
tags them as 'Pony', causing the SDXL workflow to be sent to ComfyUI
which fails validation. The filename now overrides base_model when it
contains 'flux'.

Also adds:
- Full Flux Dev/Schnell workflow template (ModelSamplingFlux,
  FluxGuidance, ConditioningZeroOut, EmptySD3LatentImage); KSampler
  cfg locked to 1.0, caller cfg routed to FluxGuidance
- --family/-F flag to manually override family detection
- queue_prompt now surfaces ComfyUI node_errors from 400 responses
- Tests for Flux workflow builder (8 cases) and updated family defaults
2026-05-17 15:50:25 +02:00
aladac 78b46b9a13 release: v0.1.21 2026-05-16 00:44:23 +02:00
aladac b731a88beb fix: populate model cache tables after download so db list resolves names
The CLI download flow only set civitai_model_id/version_id on local_files
without caching the full model payload, so 'tsr db list' joined against
empty models/versions/creators tables and showed every linked file as
'unlinked'. The server's _auto_link_file path had additional bugs:
resolved-vs-unresolved path comparison after rescan, redundant CivitAI
hash lookup, and silent failure swallowed by 'completed' status.

- New Database.register_downloaded_file() consolidates hashing, metadata
  storage, FK linking, and cache_model() into a single idempotent call
  shared by both CLI and server paths.
- Server _do_download now passes version_info straight through and
  surfaces db_file_id/db_linked/db_cached/db_error onto _active_downloads.
- Drops the broken _auto_link_file rescan helper.
2026-05-16 00:44:12 +02:00
aladac ec080803fc release: v0.1.20 2026-05-16 00:03:56 +02:00
github-actions[bot] 05892cf287 format: auto-format code [skip ci] 2026-04-24 17:03:09 +00:00
github-actions[bot] b078e4f936 style: auto-fix ruff warnings [skip ci] 2026-04-24 17:02:53 +00:00
aladac 329b0d849e fix null params when no model family detected in tsr generate
Co-Authored-By: marauder-os <marauder@saiden.dev>
2026-04-24 19:02:31 +02:00
github-actions[bot] 55358e7b5a format: auto-format code [skip ci] 2026-04-20 20:08:33 +00:00
aladac 7162db1ab9 dynamic checkpoint presets with orientation, correct VAEs, and auto-resolved sampler/scheduler/cfg/steps 2026-04-20 22:08:01 +02:00
aladac b074a7dd50 Fix -m model flag causing 502 on /api/comfyui/generate
Family detection was force-injecting a default VAE (e.g. sdxl_vae.safetensors)
when a model was specified without an explicit --vae. If that VAE file didn't
exist on the ComfyUI server, the workflow was silently rejected. Now only
overrides VAE when the user explicitly passes --vae.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:18:03 +02:00
aladac 4a2fdce115 Add top-level generate and models commands with --remote support
Add `tsr generate` and `tsr models` as top-level CLI commands that call
ComfyUI library functions directly or HTTP to a remote tensors server.
Add `--remote` flag to existing `tsr search` and `tsr dl` commands.

New file `tensors/remote.py` provides HTTP client functions for all four
operations against the remote tensors API (generate, models, search,
download with progress polling).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 01:26:55 +02:00
aladac 56d5233962 Make CORS origins configurable via CORS_ORIGINS env var
Replaces hardcoded localhost origins with env-driven config.
Accepts comma-separated origins or wildcard (*). Defaults to
["*"] for backward compatibility.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 01:02:17 +02:00
aladac a349f6bc93 Add AI Agent Disclaimer section 2026-04-01 17:16:05 +02:00
aladac 53285e46ec LICENSE: add attribution and case-by-case options 2026-04-01 17:12:09 +02:00
aladac be14d29144 LICENSE: add BSL starting version 2026-04-01 17:00:48 +02:00
aladac 7f0ab19e4e Update README: BSL-1.1 license 2026-04-01 16:58:26 +02:00
aladac 8ddc265319 Release v0.1.19 - BSL baseline 2026-04-01 16:40:54 +02:00
aladac fcd1d1ac6e BSL: clarify version-based change dates 2026-04-01 16:31:34 +02:00
aladac 0035c432c3 Relicense to BSL 1.1 2026-04-01 16:29:59 +02:00
aladac 9f37b87909 Fix Dockerfile: use separate start.sh instead of heredoc 2026-04-01 14:42:21 +02:00
aladac 611f92a868 Rework Dockerfile for Tengu addon deployment (no bundled ComfyUI) 2026-04-01 14:29:06 +02:00
aladac 66f60989e4 Add .coverage to gitignore 2026-03-30 13:49:25 +02:00
aladac 2a704aa677 Add model family-specific sampler, scheduler, and VAE defaults
- Add sampler/scheduler/steps/vae to MODEL_FAMILY_DEFAULTS for all families
- Add zimage family detection for ZImageTurbo models
- Flux and zimage families use ae.safetensors VAE
- SD 1.5 families use checkpoint built-in VAE
- SDXL families use sdxl_vae.safetensors
- API auto-applies family defaults when request uses default values

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 09:22:41 +01:00
github-actions[bot] 3432e5cb99 format: auto-format code [skip ci] 2026-03-20 08:07:50 +00:00
aladac 372133edcc Update 2026-03-20 09:07 2026-03-20 09:07:19 +01:00