reference license, template, system as files

This commit is contained in:
Michael Yang 2024-07-01 08:53:25 -07:00
parent e401a23d62
commit b7860f12ad
2 changed files with 62 additions and 36 deletions

View File

@ -85,8 +85,7 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
fsys := os.DirFS(createCtx)
for i := range modelfile.Commands {
switch modelfile.Commands[i].Name {
case "model", "adapter":
if slices.Contains([]string{"model", "adapter", "license", "template", "system"}, modelfile.Commands[i].Name) {
p := filepath.Clean(modelfile.Commands[i].Args)
fi, err := fs.Stat(fsys, p)
@ -96,28 +95,40 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
return err
}
if fi.IsDir() {
// this is likely a safetensors or pytorch directory
// TODO make this work w/ adapters
sub, err := fs.Sub(fsys, p)
if err != nil {
return err
}
switch modelfile.Commands[i].Name {
case "model", "adapter":
if fi.IsDir() {
// this is likely a safetensors or pytorch directory
// TODO make this work w/ adapters
sub, err := fs.Sub(fsys, p)
if err != nil {
return err
}
temp, err := os.CreateTemp(createCtx, "*.zip")
if err != nil {
return err
}
defer temp.Close()
defer os.RemoveAll(temp.Name())
temp, err := os.CreateTemp(createCtx, "*.zip")
if err != nil {
return err
}
defer temp.Close()
defer os.RemoveAll(temp.Name())
if err := zipFiles(sub, temp); err != nil {
return err
}
if err := zipFiles(sub, temp); err != nil {
return err
}
p, err = filepath.Rel(createCtx, temp.Name())
if err != nil {
p, err = filepath.Rel(createCtx, temp.Name())
if err != nil {
return err
}
}
case "license", "template", "system":
t, err := detectContentType(fsys, p)
if errors.Is(err, os.ErrNotExist) {
continue
} else if err != nil {
return err
} else if t != "text/plain" {
return fmt.Errorf("invalid content type for %s: %s", modelfile.Commands[i].Name, p)
}
}
@ -164,23 +175,23 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
return nil
}
func zipFiles(fsys fs.FS, w io.Writer) error {
detectContentType := func(name string) (string, error) {
f, err := fsys.Open(name)
if err != nil {
return "", err
}
defer f.Close()
func detectContentType(fsys fs.FS, name string) (string, error) {
f, err := fsys.Open(name)
if err != nil {
return "", err
}
defer f.Close()
bts, err := io.ReadAll(io.LimitReader(f, 512))
if err != nil {
return "", err
}
contentType, _, _ := strings.Cut(http.DetectContentType(bts), ";")
return contentType, nil
bts, err := io.ReadAll(io.LimitReader(f, 512))
if err != nil {
return "", err
}
contentType, _, _ := strings.Cut(http.DetectContentType(bts), ";")
return contentType, nil
}
func zipFiles(fsys fs.FS, w io.Writer) error {
glob := func(pattern, contentType string) ([]string, error) {
matches, err := fs.Glob(fsys, pattern)
if err != nil {
@ -188,7 +199,7 @@ func zipFiles(fsys fs.FS, w io.Writer) error {
}
for _, match := range matches {
if ct, err := detectContentType(match); err != nil {
if ct, err := detectContentType(fsys, match); err != nil {
return nil, err
} else if ct != contentType {
return nil, fmt.Errorf("invalid content type: expected %s for %s", ct, match)

View File

@ -459,7 +459,22 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
})
}
blob := strings.NewReader(c.Args)
var blob io.Reader = strings.NewReader(c.Args)
if strings.HasPrefix(c.Args, "@") {
p, err := GetBlobsPath(strings.TrimPrefix(c.Args, "@"))
if err != nil {
return err
}
b, err := os.Open(p)
if err != nil {
return err
}
defer b.Close()
blob = b
}
layer, err := NewLayer(blob, mediatype)
if err != nil {
return err