|
@@ -46,28 +46,58 @@ import (
|
|
"github.com/ollama/ollama/version"
|
|
"github.com/ollama/ollama/version"
|
|
)
|
|
)
|
|
|
|
|
|
-func CreateHandler(cmd *cobra.Command, args []string) error {
|
|
|
|
- filename, _ := cmd.Flags().GetString("file")
|
|
|
|
- filename, err := filepath.Abs(filename)
|
|
|
|
|
|
+var (
|
|
|
|
+ errModelNotFound = errors.New("no Modelfile or safetensors files found")
|
|
|
|
+ errModelfileNotFound = errors.New("specified Modelfile wasn't found")
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func getModelfileName(cmd *cobra.Command) (string, error) {
|
|
|
|
+ fn, _ := cmd.Flags().GetString("file")
|
|
|
|
+
|
|
|
|
+ filename := fn
|
|
|
|
+ if filename == "" {
|
|
|
|
+ filename = "Modelfile"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ absName, err := filepath.Abs(filename)
|
|
if err != nil {
|
|
if err != nil {
|
|
- return err
|
|
|
|
|
|
+ return "", err
|
|
}
|
|
}
|
|
|
|
|
|
- client, err := api.ClientFromEnvironment()
|
|
|
|
|
|
+ _, err = os.Stat(absName)
|
|
if err != nil {
|
|
if err != nil {
|
|
- return err
|
|
|
|
|
|
+ return fn, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ return absName, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func CreateHandler(cmd *cobra.Command, args []string) error {
|
|
p := progress.NewProgress(os.Stderr)
|
|
p := progress.NewProgress(os.Stderr)
|
|
defer p.Stop()
|
|
defer p.Stop()
|
|
|
|
|
|
- f, err := os.Open(filename)
|
|
|
|
- if err != nil {
|
|
|
|
|
|
+ var reader io.Reader
|
|
|
|
+
|
|
|
|
+ filename, err := getModelfileName(cmd)
|
|
|
|
+ if os.IsNotExist(err) {
|
|
|
|
+ if filename == "" {
|
|
|
|
+ reader = strings.NewReader("FROM .\n")
|
|
|
|
+ } else {
|
|
|
|
+ return errModelfileNotFound
|
|
|
|
+ }
|
|
|
|
+ } else if err != nil {
|
|
return err
|
|
return err
|
|
|
|
+ } else {
|
|
|
|
+ f, err := os.Open(filename)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ reader = f
|
|
|
|
+ defer f.Close()
|
|
}
|
|
}
|
|
- defer f.Close()
|
|
|
|
|
|
|
|
- modelfile, err := parser.ParseFile(f)
|
|
|
|
|
|
+ modelfile, err := parser.ParseFile(reader)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -82,6 +112,11 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
|
p.Add(status, spinner)
|
|
p.Add(status, spinner)
|
|
defer p.Stop()
|
|
defer p.Stop()
|
|
|
|
|
|
|
|
+ client, err := api.ClientFromEnvironment()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
for i := range modelfile.Commands {
|
|
for i := range modelfile.Commands {
|
|
switch modelfile.Commands[i].Name {
|
|
switch modelfile.Commands[i].Name {
|
|
case "model", "adapter":
|
|
case "model", "adapter":
|
|
@@ -220,7 +255,7 @@ func tempZipFiles(path string) (string, error) {
|
|
// covers consolidated.x.pth, consolidated.pth
|
|
// covers consolidated.x.pth, consolidated.pth
|
|
files = append(files, pt...)
|
|
files = append(files, pt...)
|
|
} else {
|
|
} else {
|
|
- return "", errors.New("no safetensors or torch files found")
|
|
|
|
|
|
+ return "", errModelNotFound
|
|
}
|
|
}
|
|
|
|
|
|
// add configuration files, json files are detected as text/plain
|
|
// add configuration files, json files are detected as text/plain
|
|
@@ -1315,7 +1350,7 @@ func NewCLI() *cobra.Command {
|
|
RunE: CreateHandler,
|
|
RunE: CreateHandler,
|
|
}
|
|
}
|
|
|
|
|
|
- createCmd.Flags().StringP("file", "f", "Modelfile", "Name of the Modelfile")
|
|
|
|
|
|
+ createCmd.Flags().StringP("file", "f", "", "Name of the Modelfile (default \"Modelfile\"")
|
|
createCmd.Flags().StringP("quantize", "q", "", "Quantize model to this level (e.g. q4_0)")
|
|
createCmd.Flags().StringP("quantize", "q", "", "Quantize model to this level (e.g. q4_0)")
|
|
|
|
|
|
showCmd := &cobra.Command{
|
|
showCmd := &cobra.Command{
|