mirror of
https://github.com/mudler/LocalAI.git
synced 2026-07-30 18:09:05 -04:00
* feat(config): add model artifact source contract Assisted-by: Codex:GPT-5 [Codex] * feat(downloader): add authenticated raw-byte progress Assisted-by: Codex:GPT-5 [Codex] * feat(huggingface): resolve immutable snapshot manifests Assisted-by: Codex:GPT-5 [Codex] * feat(models): add artifact storage primitives Assisted-by: Codex:GPT-5 [Codex] * feat(models): materialize pinned Hugging Face snapshots Assisted-by: Codex:GPT-5 [Codex] * feat(models): bind managed snapshots at runtime Assisted-by: Codex:GPT-5 [Codex] * feat(gallery): materialize model artifacts during install Assisted-by: Codex:GPT-5 [Codex] * feat(gallery): declare managed Hugging Face artifacts Assisted-by: Codex:GPT-5 [Codex] * feat(models): preload managed model artifacts Assisted-by: Codex:GPT-5 [Codex] * fix(gallery): retain shared artifact caches on delete Assisted-by: Codex:GPT-5 [Codex] * feat(models): report artifact acquisition progress Assisted-by: Codex:GPT-5 [Codex] * refactor(backends): load managed models from ModelFile Assisted-by: Codex:GPT-5 [Codex] * refactor(backends): load staged speech model snapshots Assisted-by: Codex:GPT-5 [Codex] * refactor(backends): use staged snapshots in engine backends Assisted-by: Codex:GPT-5 [Codex] * test(distributed): cover staged artifact snapshots Assisted-by: Codex:GPT-5 [Codex] * docs: explain managed model artifacts Assisted-by: Codex:GPT-5 [Codex] * docs: add product design context Assisted-by: Codex:GPT-5 [Codex] * feat(ui): show model artifact download progress Assisted-by: Codex:GPT-5 [Codex] * Eagerly materialize Hugging Face artifacts Materialize HF-backed model references as managed GGUF artifacts during load, with lazy download retained only as fallback. Assisted-by: Codex:GPT-5 [shell] * Refactor HF downloads through a shared executor Assisted-by: Codex:GPT-5 [shell] * drop Signed-off-by: Ettore Di Giacinto <mudler@localai.io> --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
29 lines
957 B
Python
29 lines
957 B
Python
import os
|
|
|
|
|
|
def resolve_model_reference(request, default=""):
|
|
model_file = (getattr(request, "ModelFile", "") or "").strip()
|
|
if model_file and os.path.exists(model_file):
|
|
return model_file, True
|
|
model = (getattr(request, "Model", "") or "").strip()
|
|
return model or default, False
|
|
|
|
|
|
def require_snapshot_file(model_ref, suffix):
|
|
if os.path.isfile(model_ref) and model_ref.endswith(suffix):
|
|
return model_ref
|
|
if not os.path.isdir(model_ref):
|
|
raise ValueError(f"model snapshot does not exist: {model_ref}")
|
|
|
|
matches = []
|
|
for root, directories, files in os.walk(model_ref):
|
|
directories.sort()
|
|
for name in sorted(files):
|
|
if name.endswith(suffix):
|
|
matches.append(os.path.join(root, name))
|
|
if len(matches) != 1:
|
|
raise ValueError(
|
|
f"model snapshot must contain exactly one {suffix} file; found {len(matches)}"
|
|
)
|
|
return matches[0]
|