mirror of
https://github.com/mudler/LocalAI.git
synced 2026-07-30 09:57:57 -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>
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/mudler/LocalAI/pkg/modelartifacts"
|
|
)
|
|
|
|
// PrimaryArtifactSpec returns the managed primary artifact to materialize for
|
|
// this config. The boolean return is false when the config should stay on the
|
|
// legacy path.
|
|
func (c ModelConfig) PrimaryArtifactSpec(modelsPath string) (modelartifacts.Spec, bool, bool, error) {
|
|
if len(c.Artifacts) > 0 {
|
|
return c.Artifacts[0], false, true, nil
|
|
}
|
|
|
|
modelRef := strings.TrimSpace(c.Model)
|
|
if modelRef == "" {
|
|
return modelartifacts.Spec{}, false, false, nil
|
|
}
|
|
if len(c.DownloadFiles) > 0 {
|
|
return modelartifacts.Spec{}, false, false, nil
|
|
}
|
|
|
|
if modelsPath != "" {
|
|
for _, candidate := range []string{
|
|
modelRef,
|
|
filepath.Join(modelsPath, modelRef),
|
|
} {
|
|
if info, err := os.Stat(candidate); err == nil && (info.IsDir() || info.Mode().IsRegular()) {
|
|
return modelartifacts.Spec{}, false, false, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
spec, ok, err := modelartifacts.ParsePrimaryReference(modelRef)
|
|
if err != nil {
|
|
return modelartifacts.Spec{}, false, false, err
|
|
}
|
|
if !ok {
|
|
if strings.Contains(modelRef, "/") && !strings.HasPrefix(modelRef, ".") && !filepath.IsAbs(modelRef) {
|
|
repo, err := modelartifacts.CanonicalRepo(modelRef)
|
|
if err != nil {
|
|
if strings.Count(modelRef, "/") == 1 {
|
|
return modelartifacts.Spec{}, false, false, fmt.Errorf("invalid Hugging Face reference %q: %w", modelRef, err)
|
|
}
|
|
return modelartifacts.Spec{}, false, false, nil
|
|
}
|
|
return modelartifacts.Spec{
|
|
Name: modelartifacts.TargetModel,
|
|
Target: modelartifacts.TargetModel,
|
|
Source: modelartifacts.Source{Type: modelartifacts.SourceTypeHuggingFace, Repo: repo},
|
|
}, true, true, nil
|
|
}
|
|
return modelartifacts.Spec{}, false, false, nil
|
|
}
|
|
return spec, true, true, nil
|
|
}
|