fix(gallery): do not return overrides and additional config (#4768)

When hitting /models/available we are intersted in the model
description, name and small metadatas. Configuration and overrides are
part of internals which are required only for installation.

This also solves a current bug when hitting /models/available fails if
one of the gallery items have overrides with parameters defined

Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
This commit is contained in:
Ettore Di Giacinto 2025-02-05 18:37:09 +01:00 committed by GitHub
parent 7bc80c17f8
commit 7daf5ac3e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 39 additions and 19 deletions

View file

@ -48,8 +48,10 @@ var _ = Describe("Model test", func() {
defer os.RemoveAll(tempdir) defer os.RemoveAll(tempdir)
gallery := []GalleryModel{{ gallery := []GalleryModel{{
Metadata: Metadata{
Name: "bert", Name: "bert",
URL: bertEmbeddingsURL, URL: bertEmbeddingsURL,
},
}} }}
out, err := yaml.Marshal(gallery) out, err := yaml.Marshal(gallery)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View file

@ -11,6 +11,14 @@ import (
// It is used to install the model by resolving the URL and downloading the files. // It is used to install the model by resolving the URL and downloading the files.
// The other fields are used to override the configuration of the model. // The other fields are used to override the configuration of the model.
type GalleryModel struct { type GalleryModel struct {
Metadata `json:",inline" yaml:",inline"`
// config_file is read in the situation where URL is blank - and therefore this is a base config.
ConfigFile map[string]interface{} `json:"config_file,omitempty" yaml:"config_file,omitempty"`
// Overrides are used to override the configuration of the model located at URL
Overrides map[string]interface{} `json:"overrides,omitempty" yaml:"overrides,omitempty"`
}
type Metadata struct {
URL string `json:"url,omitempty" yaml:"url,omitempty"` URL string `json:"url,omitempty" yaml:"url,omitempty"`
Name string `json:"name,omitempty" yaml:"name,omitempty"` Name string `json:"name,omitempty" yaml:"name,omitempty"`
Description string `json:"description,omitempty" yaml:"description,omitempty"` Description string `json:"description,omitempty" yaml:"description,omitempty"`
@ -18,10 +26,6 @@ type GalleryModel struct {
URLs []string `json:"urls,omitempty" yaml:"urls,omitempty"` URLs []string `json:"urls,omitempty" yaml:"urls,omitempty"`
Icon string `json:"icon,omitempty" yaml:"icon,omitempty"` Icon string `json:"icon,omitempty" yaml:"icon,omitempty"`
Tags []string `json:"tags,omitempty" yaml:"tags,omitempty"` Tags []string `json:"tags,omitempty" yaml:"tags,omitempty"`
// config_file is read in the situation where URL is blank - and therefore this is a base config.
ConfigFile map[string]interface{} `json:"config_file,omitempty" yaml:"config_file,omitempty"`
// Overrides are used to override the configuration of the model located at URL
Overrides map[string]interface{} `json:"overrides,omitempty" yaml:"overrides,omitempty"`
// AdditionalFiles are used to add additional files to the model // AdditionalFiles are used to add additional files to the model
AdditionalFiles []File `json:"files,omitempty" yaml:"files,omitempty"` AdditionalFiles []File `json:"files,omitempty" yaml:"files,omitempty"`
// Gallery is a reference to the gallery which contains the model // Gallery is a reference to the gallery which contains the model

View file

@ -9,7 +9,11 @@ import (
var _ = Describe("Gallery API tests", func() { var _ = Describe("Gallery API tests", func() {
Context("requests", func() { Context("requests", func() {
It("parses github with a branch", func() { It("parses github with a branch", func() {
req := GalleryModel{URL: "github:go-skynet/model-gallery/gpt4all-j.yaml@main"} req := GalleryModel{
Metadata: Metadata{
URL: "github:go-skynet/model-gallery/gpt4all-j.yaml@main",
},
}
e, err := GetGalleryConfigFromURL(req.URL, "") e, err := GetGalleryConfigFromURL(req.URL, "")
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(e.Name).To(Equal("gpt4all-j")) Expect(e.Name).To(Equal("gpt4all-j"))

View file

@ -299,15 +299,19 @@ var _ = Describe("API test", func() {
g := []gallery.GalleryModel{ g := []gallery.GalleryModel{
{ {
Metadata: gallery.Metadata{
Name: "bert", Name: "bert",
URL: bertEmbeddingsURL, URL: bertEmbeddingsURL,
}, },
},
{ {
Metadata: gallery.Metadata{
Name: "bert2", Name: "bert2",
URL: bertEmbeddingsURL, URL: bertEmbeddingsURL,
Overrides: map[string]interface{}{"foo": "bar"},
AdditionalFiles: []gallery.File{{Filename: "foo.yaml", URI: bertEmbeddingsURL}}, AdditionalFiles: []gallery.File{{Filename: "foo.yaml", URI: bertEmbeddingsURL}},
}, },
Overrides: map[string]interface{}{"foo": "bar"},
},
} }
out, err := yaml.Marshal(g) out, err := yaml.Marshal(g)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())

View file

@ -117,19 +117,25 @@ func (mgs *ModelGalleryEndpointService) DeleteModelGalleryEndpoint() func(c *fib
// @Router /models/available [get] // @Router /models/available [get]
func (mgs *ModelGalleryEndpointService) ListModelFromGalleryEndpoint() func(c *fiber.Ctx) error { func (mgs *ModelGalleryEndpointService) ListModelFromGalleryEndpoint() func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error {
log.Debug().Msgf("Listing models from galleries: %+v", mgs.galleries)
models, err := gallery.AvailableGalleryModels(mgs.galleries, mgs.modelPath) models, err := gallery.AvailableGalleryModels(mgs.galleries, mgs.modelPath)
if err != nil { if err != nil {
return err return err
} }
log.Debug().Msgf("Models found from galleries: %+v", models)
for _, m := range models { log.Debug().Msgf("Available %d models from %d galleries\n", len(models), len(mgs.galleries))
log.Debug().Msgf("Model found from galleries: %+v", m)
m := []gallery.Metadata{}
for _, mm := range models {
m = append(m, mm.Metadata)
} }
dat, err := json.Marshal(models)
log.Debug().Msgf("Models %#v", m)
dat, err := json.Marshal(m)
if err != nil { if err != nil {
return err return fmt.Errorf("could not marshal models: %w", err)
} }
return c.Send(dat) return c.Send(dat)
} }