feat(fc2b): importer enqueues tag_and_embed + ml-worker model self-heal
import_media_file now enqueues tag_and_embed alongside generate_thumbnail after a successful import. scripts/download_models.py snapshots Camie + SigLIP into /models, idempotent (skips when present). The ml-worker entrypoint runs it before starting the Celery worker so a fresh /models volume self-heals on first boot. Downloader tests are pure-logic (no network in CI). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""Operational scripts run from the container entrypoint or CLI."""
|
||||
@@ -0,0 +1,53 @@
|
||||
"""Self-heal model weights into /models. Idempotent — only missing files
|
||||
are fetched. Called by the ml-worker entrypoint before Celery starts.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
MODEL_ROOT = Path(os.environ.get("ML_MODEL_DIR", "/models"))
|
||||
CAMIE_REPO = os.environ.get("CAMIE_HF_REPO", "Camais03/camie-tagger-v2")
|
||||
SIGLIP_REPO = os.environ.get(
|
||||
"SIGLIP_HF_REPO", "google/siglip-so400m-patch14-384"
|
||||
)
|
||||
|
||||
|
||||
def _snapshot(repo_id: str, dest: Path, allow_patterns: list[str] | None) -> None:
|
||||
from huggingface_hub import snapshot_download
|
||||
|
||||
dest.mkdir(parents=True, exist_ok=True)
|
||||
snapshot_download(
|
||||
repo_id=repo_id,
|
||||
local_dir=str(dest),
|
||||
allow_patterns=allow_patterns,
|
||||
)
|
||||
|
||||
|
||||
def ensure_camie() -> None:
|
||||
dest = MODEL_ROOT / "camie"
|
||||
if (dest / "model.onnx").is_file() and (dest / "selected_tags.csv").is_file():
|
||||
print(f"[download_models] Camie present at {dest}")
|
||||
return
|
||||
print(f"[download_models] Fetching {CAMIE_REPO} -> {dest}")
|
||||
_snapshot(CAMIE_REPO, dest, ["model.onnx", "selected_tags.csv", "*.json"])
|
||||
|
||||
|
||||
def ensure_siglip() -> None:
|
||||
dest = MODEL_ROOT / "siglip"
|
||||
if (dest / "config.json").is_file() and any(dest.glob("*.safetensors")):
|
||||
print(f"[download_models] SigLIP present at {dest}")
|
||||
return
|
||||
print(f"[download_models] Fetching {SIGLIP_REPO} -> {dest}")
|
||||
_snapshot(SIGLIP_REPO, dest, None)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ensure_camie()
|
||||
ensure_siglip()
|
||||
print("[download_models] Done.")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user