Skip to content

Commit 8937998

Browse files
committed
Add MLX importer
Signed-off-by: Ettore Di Giacinto <mudler@localai.io>
1 parent 2f4f8bd commit 8937998

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

core/gallery/importers/importers.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
var DefaultImporters = []Importer{
99
&LlamaCPPImporter{},
10+
&MLXImporter{},
1011
}
1112

1213
type Importer interface {

core/gallery/importers/mlx.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package importers
2+
3+
import (
4+
"encoding/json"
5+
"path/filepath"
6+
"strings"
7+
8+
"github.com/mudler/LocalAI/core/config"
9+
"github.com/mudler/LocalAI/core/gallery"
10+
"github.com/mudler/LocalAI/core/schema"
11+
"go.yaml.in/yaml/v2"
12+
)
13+
14+
var _ Importer = &MLXImporter{}
15+
16+
type MLXImporter struct{}
17+
18+
func (i *MLXImporter) Match(uri string, request schema.ImportModelRequest) bool {
19+
preferences, err := request.Preferences.MarshalJSON()
20+
if err != nil {
21+
return false
22+
}
23+
preferencesMap := make(map[string]any)
24+
err = json.Unmarshal(preferences, &preferencesMap)
25+
if err != nil {
26+
return false
27+
}
28+
29+
b, ok := preferencesMap["backend"].(string)
30+
if ok && b == "mlx" || b == "mlx-vlm" {
31+
return true
32+
}
33+
34+
// All https://huggingface.co/mlx-community/*
35+
if strings.Contains(uri, "mlx-community/") {
36+
return true
37+
}
38+
39+
return false
40+
}
41+
42+
func (i *MLXImporter) Import(uri string, request schema.ImportModelRequest) (gallery.ModelConfig, error) {
43+
preferences, err := request.Preferences.MarshalJSON()
44+
if err != nil {
45+
return gallery.ModelConfig{}, err
46+
}
47+
preferencesMap := make(map[string]any)
48+
err = json.Unmarshal(preferences, &preferencesMap)
49+
if err != nil {
50+
return gallery.ModelConfig{}, err
51+
}
52+
53+
name, ok := preferencesMap["name"].(string)
54+
if !ok {
55+
name = filepath.Base(uri)
56+
}
57+
58+
description, ok := preferencesMap["description"].(string)
59+
if !ok {
60+
description = "Imported from " + uri
61+
}
62+
63+
backend := "mlx"
64+
b, ok := preferencesMap["backend"].(string)
65+
if ok {
66+
backend = b
67+
}
68+
69+
modelConfig := config.ModelConfig{
70+
Name: name,
71+
Description: description,
72+
KnownUsecaseStrings: []string{"chat"},
73+
Backend: backend,
74+
PredictionOptions: schema.PredictionOptions{
75+
BasicModelRequest: schema.BasicModelRequest{
76+
Model: uri,
77+
},
78+
},
79+
TemplateConfig: config.TemplateConfig{
80+
UseTokenizerTemplate: true,
81+
},
82+
}
83+
84+
data, err := yaml.Marshal(modelConfig)
85+
if err != nil {
86+
return gallery.ModelConfig{}, err
87+
}
88+
89+
return gallery.ModelConfig{
90+
Name: name,
91+
Description: description,
92+
ConfigFile: string(data),
93+
}, nil
94+
}

0 commit comments

Comments
 (0)