feat(lora-worker): Phase 2 publish-step — copy succeeded LoRA into ComfyUI loras + published_lora_name
On a train reaching succeeded, IN ADDITION to output/{name}.safetensors
(unchanged download source), COPY it into ComfyUI's loras search path at
/storetank/arbo/models/loras/trained/{train_id}/{name}.safetensors and
return published_lora_name (the ComfyUI-relative LoraLoader string) in the
terminal GET /train/{id} payload (arbo Phase 2 auto-registration, §4.1/§7).
- Copy not move; a publish failure NEVER fails the train (keeps succeeded,
omits published_lora_name, logs the reason to the tailable run log).
- INV-T7-safe: a copy to a fixed computed path, no new free-form args.
- train_id derived from the handoff layout (output_dir.parent.name).
- Provisions loras/trained/ (arbotrain 2775, group-write per the Phase-1
lesson; world-readable/traversable for ComfyUI) via the deploy playbook.
- ComfyUI verified to resolve nested loras subfolders (no flat fallback).
- Pure path helper unit-tested; 16 tests green.
This commit is contained in:
@@ -106,6 +106,16 @@ def validate_request(req: dict) -> dict:
|
||||
}
|
||||
|
||||
|
||||
def published_relative_path(output_dir: str, output_name: str) -> str:
|
||||
"""The ComfyUI-relative loras path for a succeeded LoRA (Phase 2 publish step).
|
||||
|
||||
Derives {train_id} from the handoff layout `HANDOFF_ROOT/{train_id}/output` — i.e. the
|
||||
name of the dir the LoRA was written into. Returns e.g. `trained/392cf898ac03/name.safetensors`,
|
||||
the exact string a ComfyUI `LoraLoader.lora_name` widget takes. Pure — no filesystem touch."""
|
||||
train_id = Path(output_dir).parent.name
|
||||
return f"{config.PUBLISH_SUBDIR}/{train_id}/{output_name}.safetensors"
|
||||
|
||||
|
||||
def build_command(req: dict) -> tuple[list[str], dict[str, str], dict]:
|
||||
"""Validate `req` and return `(argv, env_overlay, params)` for the fixed sd-scripts invocation.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user