mirror of
https://github.com/mudler/LocalAI.git
synced 2026-11-04 03:24:43 -05:00
feat(backends): --disable-backend-install refuses every backend acquisition A hardening switch for deployments that must run exactly the backend set they were tested with (production, air-gapped, immutable images, package-managed hosts). With LOCALAI_DISABLE_BACKEND_INSTALL=1 every install and upgrade path refuses — gallery, OCI/URL/path, node-scoped, auto-upgrade, boot-time external backends — HTTP routes answer 403 up front, and a model whose backend is missing is refused before any download: 409 on the API, an error on preload and import. Whether a backend is present is asked of the execution target: the local backend directory on a single node, the workers' listings on a distributed frontend, which installs nothing itself. Backends already present, including system-path ones, keep working. Assisted-by: Claude Code:claude-fable-5 Signed-off-by: Plamen K. Kosseff <p.kosseff@gmail.com>
34 lines
1.5 KiB
Go
34 lines
1.5 KiB
Go
package galleryop
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/mudler/LocalAI/core/gallery"
|
|
)
|
|
|
|
// ProgressCallback reports download progress for model/backend installations.
|
|
type ProgressCallback func(fileName, current, total string, percentage float64)
|
|
|
|
// ModelManager handles model install and delete lifecycle.
|
|
type ModelManager interface {
|
|
InstallModel(ctx context.Context, op *ManagementOp[gallery.GalleryModel, gallery.ModelConfig], progressCb ProgressCallback) error
|
|
DeleteModel(name string) error
|
|
}
|
|
|
|
// BackendManager handles backend install, delete, upgrade, and listing lifecycle.
|
|
type BackendManager interface {
|
|
InstallBackend(ctx context.Context, op *ManagementOp[gallery.GalleryBackend, any], progressCb ProgressCallback) error
|
|
DeleteBackend(name string) error
|
|
ListBackends() (gallery.SystemBackends, error)
|
|
UpgradeBackend(ctx context.Context, op *ManagementOp[gallery.GalleryBackend, any], progressCb ProgressCallback) error
|
|
CheckUpgrades(ctx context.Context) (map[string]gallery.UpgradeInfo, error)
|
|
// IsDistributed reports whether installs fan out across worker nodes.
|
|
// The HTTP layer uses this to refuse hardware-specific (non-meta) installs
|
|
// on /api/backends/apply in distributed mode — a CPU build silently
|
|
// landing on every GPU node is the footgun this guards against.
|
|
IsDistributed() bool
|
|
// BackendAvailable reports whether models naming this backend can run
|
|
// on the execution target this manager represents.
|
|
BackendAvailable(name string) (bool, error)
|
|
}
|