Skip to content

v0.2.15 — LoRA triggers + Tags B + Structure label

Choose a tag to compare

@hthillman hthillman released this 09 Jun 21:38
· 37 commits to main since this release

Big one: LoRA trigger word prepend (fixes "LoRAs feel weaker in TD")

Every LoRA carries a metadata.primary_trigger_word — the activation token it was trained against. TD was passing the user's prompt through verbatim, so enabling a LoRA loaded it server-side but the encoder never saw the activation token; the style barely affected output. The canonical web client injects the trigger prefix at WS send time; TD now does the same.

  • New src/lora_triggers.py — pure-Python port of the canonical loraTriggers.ts.
  • _apply_lora_catalog captures metadata.primary_trigger_word into the catalog Table DAT + in-memory dict.
  • SendPrompt prepends the prefix to both tags and tags_b, stripping any stale leading triggers first.
  • New Auto-Prepend LoRA Triggers toggle on the Prompt+LoRA page (default On).
  • enable_lora / disable_lora now also re-push the prompt so the encoder picks up the new trigger immediately. Before this, toggling a LoRA loaded it server-side but you had to also touch a strength slider or pulse Sendprompt to make it audibly fire.

Tags B / Prompt blending now actually blends

Promptblend was streaming a value but blending nothing because the second prompt was empty mid-session. New Promptb Str param on the Prompt+LoRA page next to Prompt, editable any time. SendPrompt passes it as tags_b. _build_session_config reads prompt_b from the live Promptb — one source of truth. Deleted the obsolete Initpromptb.

Synthesis page: "Structure" (the canonical's label)

hint_strength is the model's structure control — it governs how closely the model follows the source's section / rhythm / dynamics. The canonical labels it "Structure"; TD was labeling it "Hint Strength". Wire key unchanged; only the user-facing label and tooltip. Also corrected: Denoise"Strength", DCW Scaler"DCW low", DCW High Scaler"DCW high" — all surfaced by the new drift checker's label-parity check.

Drift checker hardening — would have caught all of the above

Four new checks in scripts/check_protocol_drift.py:

  • ui_coverage — every pulse in DISCRETE_PULSE_TO_KIND must have a non-hidden Param.
  • label_parity — TD Param labels must contain the canonical's DISPLAY_NAMES word for shared wire keys.
  • lora_trigger_injection — verifies the three integration points stay wired.
  • tags_b_plumbing — if SessionConfig sends prompt_b, an encode_prompt call site must pass tags_b=.

Each verified by regression-testing.

Other fixes

  • UI lag fix: _apply_lora_catalog's signature no longer includes trigger_word, so server catalog echoes with intermittent metadata don't force a full Table DAT + dynamic-par rebuild on every event.
  • "DAT did not load from … overwrite anyway?" dialog on import: code DATs no longer bake the developer's absolute src/ path into the exported .tox. Embedded dat.text is the only source.

Known cosmetic mismatch

The shipped .tox carries BUILD_MARKER = v0.2.15-...-lora-resend (boot textport) but DEMON_TD_VERSION = 0.2.14 (User-Agent on cloud REST calls). TD's bidirectional DAT sync wrote version.py back to disk between the version bump and the rebuild. Functionally identical to v0.2.15 in every other respect; root cause (syncfile=True baked into the previous build's DATs) is fixed in this release for everyone running v0.2.16+.

Files

  • demonTD-v0.2.15.zip.tox + vendor/ bundle. Drop this. Keep vendor/ next to the .tox.
  • demonTD.tox — the operator only. Useful when you already have a matching vendor/.

Stats

105 unit tests pass (24 new). Drift checker clean against origin/main.