Skip to content

Commit b52bfaf

Browse files
authored
fix: do not show invalid backends (#6058)
Signed-off-by: Ettore Di Giacinto <[email protected]>
1 parent bf60ca5 commit b52bfaf

File tree

5 files changed

+120
-48
lines changed

5 files changed

+120
-48
lines changed

core/cli/worker/worker_llamacpp.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ func findLLamaCPPBackend(backendSystemPath string) (string, error) {
3030
log.Debug().Msgf("System backends: %v", backends)
3131

3232
backendPath := ""
33-
for b, path := range backends {
34-
if b == "llama-cpp" {
35-
backendPath = filepath.Dir(path)
36-
break
37-
}
33+
backend, ok := backends.Get("llama-cpp")
34+
if !ok {
35+
return "", errors.New("llama-cpp backend not found, install it first")
3836
}
37+
backendPath = filepath.Dir(backend.RunFile)
3938

4039
if backendPath == "" {
4140
return "", errors.New("llama-cpp backend not found, install it first")

core/gallery/backends.go

Lines changed: 66 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func InstallBackendFromGallery(galleries []config.Gallery, systemState *system.S
6666
if err != nil {
6767
return err
6868
}
69-
if _, ok := backends[name]; ok {
69+
if backends.Exists(name) {
7070
return nil
7171
}
7272
}
@@ -239,55 +239,99 @@ func DeleteBackendFromSystem(basePath string, name string) error {
239239
return os.RemoveAll(backendDirectory)
240240
}
241241

242-
func ListSystemBackends(basePath string) (map[string]string, error) {
243-
backends, err := os.ReadDir(basePath)
242+
type SystemBackend struct {
243+
Name string
244+
RunFile string
245+
IsMeta bool
246+
Metadata *BackendMetadata
247+
}
248+
249+
type SystemBackends map[string]SystemBackend
250+
251+
func (b SystemBackends) Exists(name string) bool {
252+
_, ok := b[name]
253+
return ok
254+
}
255+
256+
func (b SystemBackends) Get(name string) (SystemBackend, bool) {
257+
backend, ok := b[name]
258+
return backend, ok
259+
}
260+
261+
func (b SystemBackends) GetAll() []SystemBackend {
262+
backends := make([]SystemBackend, 0)
263+
for _, backend := range b {
264+
backends = append(backends, backend)
265+
}
266+
return backends
267+
}
268+
269+
func ListSystemBackends(basePath string) (SystemBackends, error) {
270+
potentialBackends, err := os.ReadDir(basePath)
244271
if err != nil {
245272
return nil, err
246273
}
247274

248-
backendsNames := make(map[string]string)
275+
backends := make(SystemBackends)
249276

250-
for _, backend := range backends {
251-
if backend.IsDir() {
252-
runFile := filepath.Join(basePath, backend.Name(), runFile)
277+
for _, potentialBackend := range potentialBackends {
278+
if potentialBackend.IsDir() {
279+
potentialBackendRunFile := filepath.Join(basePath, potentialBackend.Name(), runFile)
253280

254281
var metadata *BackendMetadata
255282

256283
// If metadata file does not exist, we just use the directory name
257284
// and we do not fill the other metadata (such as potential backend Aliases)
258-
metadataFilePath := filepath.Join(basePath, backend.Name(), metadataFile)
285+
metadataFilePath := filepath.Join(basePath, potentialBackend.Name(), metadataFile)
259286
if _, err := os.Stat(metadataFilePath); os.IsNotExist(err) {
260287
metadata = &BackendMetadata{
261-
Name: backend.Name(),
288+
Name: potentialBackend.Name(),
262289
}
263290
} else {
264291
// Check for alias in metadata
265-
metadata, err = readBackendMetadata(filepath.Join(basePath, backend.Name()))
292+
metadata, err = readBackendMetadata(filepath.Join(basePath, potentialBackend.Name()))
266293
if err != nil {
267294
return nil, err
268295
}
269296
}
270297

298+
if !backends.Exists(potentialBackend.Name()) {
299+
// We don't want to override aliases if already set, and if we are meta backend
300+
if _, err := os.Stat(potentialBackendRunFile); err == nil {
301+
backends[potentialBackend.Name()] = SystemBackend{
302+
Name: potentialBackend.Name(),
303+
RunFile: potentialBackendRunFile,
304+
IsMeta: false,
305+
Metadata: metadata,
306+
}
307+
}
308+
}
309+
271310
if metadata == nil {
272311
continue
273312
}
274313

275-
if _, exists := backendsNames[backend.Name()]; !exists {
276-
// We don't want to override aliases if already set, and if we are meta backend
277-
if _, err := os.Stat(runFile); err == nil {
278-
backendsNames[backend.Name()] = runFile
279-
} else {
280-
backendsNames[backend.Name()] = ""
314+
if metadata.Alias != "" {
315+
backends[metadata.Alias] = SystemBackend{
316+
Name: metadata.Alias,
317+
RunFile: potentialBackendRunFile,
318+
IsMeta: false,
319+
Metadata: metadata,
281320
}
282321
}
283322

284-
if metadata.Alias != "" {
285-
backendsNames[metadata.Alias] = runFile
323+
if metadata.MetaBackendFor != "" {
324+
backends[metadata.Name] = SystemBackend{
325+
Name: metadata.Name,
326+
RunFile: filepath.Join(basePath, metadata.MetaBackendFor, runFile),
327+
IsMeta: true,
328+
Metadata: metadata,
329+
}
286330
}
287331
}
288332
}
289333

290-
return backendsNames, nil
334+
return backends, nil
291335
}
292336

293337
func RegisterBackends(basePath string, modelLoader *model.ModelLoader) error {
@@ -296,9 +340,9 @@ func RegisterBackends(basePath string, modelLoader *model.ModelLoader) error {
296340
return err
297341
}
298342

299-
for name, runFile := range backends {
300-
log.Debug().Str("name", name).Str("runFile", runFile).Msg("Registering backend")
301-
modelLoader.SetExternalBackend(name, runFile)
343+
for _, backend := range backends {
344+
log.Debug().Str("name", backend.Name).Str("runFile", backend.RunFile).Msg("Registering backend")
345+
modelLoader.SetExternalBackend(backend.Name, backend.RunFile)
302346
}
303347

304348
return nil

core/gallery/backends_test.go

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,16 @@ var _ = Describe("Gallery Backends", func() {
208208
metaBackendPath := filepath.Join(tempDir, "meta-backend")
209209
Expect(metaBackendPath).To(BeADirectory())
210210

211+
metaBackendPath = filepath.Join(tempDir, "meta-backend", "metadata.json")
212+
Expect(metaBackendPath).To(BeARegularFile())
213+
211214
concreteBackendPath := filepath.Join(tempDir, "nvidia-backend")
212215
Expect(concreteBackendPath).To(BeADirectory())
213216

214217
allBackends, err := ListSystemBackends(tempDir)
215218
Expect(err).NotTo(HaveOccurred())
216-
Expect(allBackends).To(HaveKey("meta-backend"))
217-
Expect(allBackends).To(HaveKey("nvidia-backend"))
219+
Expect(allBackends.Exists("meta-backend")).To(BeTrue())
220+
Expect(allBackends.Exists("nvidia-backend")).To(BeTrue())
218221

219222
// Delete meta backend by name
220223
err = DeleteBackendFromSystem(tempDir, "meta-backend")
@@ -284,9 +287,14 @@ var _ = Describe("Gallery Backends", func() {
284287

285288
allBackends, err := ListSystemBackends(tempDir)
286289
Expect(err).NotTo(HaveOccurred())
287-
Expect(allBackends).To(HaveKey("meta-backend"))
288-
Expect(allBackends).To(HaveKey("nvidia-backend"))
289-
Expect(allBackends["meta-backend"]).To(BeEmpty())
290+
Expect(allBackends.Exists("meta-backend")).To(BeTrue())
291+
Expect(allBackends.Exists("nvidia-backend")).To(BeTrue())
292+
293+
backend, ok := allBackends.Get("meta-backend")
294+
Expect(ok).To(BeTrue())
295+
Expect(backend.Metadata.MetaBackendFor).To(Equal("nvidia-backend"))
296+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, "nvidia-backend", "run.sh")))
297+
Expect(backend.IsMeta).To(BeTrue())
290298

291299
// Delete meta backend by name
292300
err = DeleteBackendFromSystem(tempDir, "meta-backend")
@@ -356,9 +364,11 @@ var _ = Describe("Gallery Backends", func() {
356364

357365
allBackends, err := ListSystemBackends(tempDir)
358366
Expect(err).NotTo(HaveOccurred())
359-
Expect(allBackends).To(HaveKey("meta-backend"))
360-
Expect(allBackends).To(HaveKey("nvidia-backend"))
361-
Expect(allBackends["meta-backend"]).To(Equal(filepath.Join(tempDir, "nvidia-backend", "run.sh")))
367+
Expect(allBackends.Exists("meta-backend")).To(BeTrue())
368+
Expect(allBackends.Exists("nvidia-backend")).To(BeTrue())
369+
backend, ok := allBackends.Get("meta-backend")
370+
Expect(ok).To(BeTrue())
371+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, "nvidia-backend", "run.sh")))
362372

363373
// Delete meta backend by name
364374
err = DeleteBackendFromSystem(tempDir, "meta-backend")
@@ -402,13 +412,21 @@ var _ = Describe("Gallery Backends", func() {
402412
Expect(err).NotTo(HaveOccurred())
403413

404414
// Should include both the meta backend name and concrete backend name
405-
Expect(backends).To(HaveKey("meta-backend"))
406-
Expect(backends).To(HaveKey("concrete-backend"))
415+
Expect(backends.Exists("meta-backend")).To(BeTrue())
416+
Expect(backends.Exists("concrete-backend")).To(BeTrue())
417+
418+
// meta-backend should point to concrete-backend
419+
Expect(backends.Exists("meta-backend")).To(BeTrue())
420+
backend, ok := backends.Get("meta-backend")
421+
Expect(ok).To(BeTrue())
422+
Expect(backend.Metadata.MetaBackendFor).To(Equal("concrete-backend"))
423+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, "concrete-backend", "run.sh")))
424+
Expect(backend.IsMeta).To(BeTrue())
407425

408-
// meta-backend should be empty
409-
Expect(backends["meta-backend"]).To(BeEmpty())
410426
// concrete-backend should point to its own run.sh
411-
Expect(backends["concrete-backend"]).To(Equal(filepath.Join(tempDir, "concrete-backend", "run.sh")))
427+
backend, ok = backends.Get("concrete-backend")
428+
Expect(ok).To(BeTrue())
429+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, "concrete-backend", "run.sh")))
412430
})
413431
})
414432

@@ -457,8 +475,14 @@ var _ = Describe("Gallery Backends", func() {
457475
// Check that the alias was recognized
458476
backends, err := ListSystemBackends(tempDir)
459477
Expect(err).ToNot(HaveOccurred())
460-
Expect(backends).To(HaveKeyWithValue("test-alias", filepath.Join(tempDir, "test-backend", "run.sh")))
461-
Expect(backends).To(HaveKeyWithValue("test-backend", filepath.Join(tempDir, "test-backend", "run.sh")))
478+
Expect(backends.Exists("test-alias")).To(BeTrue())
479+
Expect(backends.Exists("test-backend")).To(BeTrue())
480+
b, ok := backends.Get("test-alias")
481+
Expect(ok).To(BeTrue())
482+
Expect(b.RunFile).To(Equal(filepath.Join(tempDir, "test-backend", "run.sh")))
483+
b, ok = backends.Get("test-backend")
484+
Expect(ok).To(BeTrue())
485+
Expect(b.RunFile).To(Equal(filepath.Join(tempDir, "test-backend", "run.sh")))
462486
})
463487
})
464488

@@ -497,10 +521,13 @@ var _ = Describe("Gallery Backends", func() {
497521

498522
backends, err := ListSystemBackends(tempDir)
499523
Expect(err).NotTo(HaveOccurred())
500-
Expect(backends).To(HaveLen(len(backendNames)))
524+
Expect(backends.GetAll()).To(HaveLen(len(backendNames)))
501525

502526
for _, name := range backendNames {
503-
Expect(backends).To(HaveKeyWithValue(name, filepath.Join(tempDir, name, "run.sh")))
527+
Expect(backends.Exists(name)).To(BeTrue())
528+
backend, ok := backends.Get(name)
529+
Expect(ok).To(BeTrue())
530+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, name, "run.sh")))
504531
}
505532
})
506533

@@ -528,7 +555,10 @@ var _ = Describe("Gallery Backends", func() {
528555

529556
backends, err := ListSystemBackends(tempDir)
530557
Expect(err).NotTo(HaveOccurred())
531-
Expect(backends).To(HaveKeyWithValue(alias, filepath.Join(tempDir, backendName, "run.sh")))
558+
Expect(backends.Exists(alias)).To(BeTrue())
559+
backend, ok := backends.Get(alias)
560+
Expect(ok).To(BeTrue())
561+
Expect(backend.RunFile).To(Equal(filepath.Join(tempDir, backendName, "run.sh")))
532562
})
533563

534564
It("should return error when base path doesn't exist", func() {

core/gallery/gallery.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ func AvailableBackends(galleries []config.Gallery, basePath string) (GalleryElem
147147
if err != nil {
148148
return false
149149
}
150-
_, exists := backends[backend.GetName()]
151-
return exists
150+
return backends.Exists(backend.GetName())
152151
})
153152
if err != nil {
154153
return nil, err

core/http/endpoints/localai/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (mgs *BackendEndpointService) ListBackendsEndpoint() func(c *fiber.Ctx) err
117117
if err != nil {
118118
return err
119119
}
120-
return c.JSON(backends)
120+
return c.JSON(backends.GetAll())
121121
}
122122
}
123123

0 commit comments

Comments
 (0)