diff --git a/parser/parser.go b/parser/parser.go index 998c8f3cb..61a56f2a0 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -43,7 +43,7 @@ func (c Command) String() string { role, message, _ := strings.Cut(c.Args, ": ") fmt.Fprintf(&sb, "MESSAGE %s %s", role, quote(message)) case "ollama": - fmt.Fprintf(&sb, "OLLAMA %s", quote(c.Args)) + fmt.Fprintf(&sb, "OLLAMA %s", c.Args) default: fmt.Fprintf(&sb, "PARAMETER %s %s", c.Name, quote(c.Args)) } diff --git a/server/images.go b/server/images.go index c606698a6..dc2a04258 100644 --- a/server/images.go +++ b/server/images.go @@ -22,6 +22,7 @@ import ( "strconv" "strings" + "github.com/Masterminds/semver/v3" "github.com/ollama/ollama/api" "github.com/ollama/ollama/auth" "github.com/ollama/ollama/envconfig" @@ -374,7 +375,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio } var messages []*api.Message - var version string + var version *semver.Version parameters := make(map[string]any) var layers []*Layer @@ -531,8 +532,11 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio messages = append(messages, &api.Message{Role: role, Content: content}) case "ollama": - if version == "" { - version = c.Args + if version == nil { + version, err = semver.NewVersion(c.Args) + if err != nil { + return err + } } default: ps, err := api.FormatParams(map[string][]string{c.Name: {c.Args}}) @@ -647,7 +651,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio old, _ := ParseNamedManifest(name) fn(api.ProgressResponse{Status: "writing manifest"}) - if err := WriteManifest(name, layer, layers, version); err != nil { + if err := WriteManifest(name, version, layer, layers); err != nil { return err } diff --git a/server/manifest.go b/server/manifest.go index 954ed7650..c13a9c96f 100644 --- a/server/manifest.go +++ b/server/manifest.go @@ -10,6 +10,7 @@ import ( "os" "path/filepath" + "github.com/Masterminds/semver/v3" "github.com/ollama/ollama/types/model" ) @@ -18,7 +19,7 @@ type Manifest struct { MediaType string `json:"mediaType"` Config *Layer `json:"config"` Layers []*Layer `json:"layers"` - Ollama string `json:"ollama"` + Ollama *semver.Version `json:"ollama,omitempty"` filepath string fi os.FileInfo @@ -94,7 +95,7 @@ func ParseNamedManifest(n model.Name) (*Manifest, error) { return &m, nil } -func WriteManifest(name model.Name, config *Layer, layers []*Layer, ollama string) error { +func WriteManifest(name model.Name, ollama *semver.Version, config *Layer, layers []*Layer) error { manifests, err := GetManifestPath() if err != nil { return err diff --git a/server/model.go b/server/model.go index 39922700d..b7688dcfb 100644 --- a/server/model.go +++ b/server/model.go @@ -16,6 +16,7 @@ import ( "strings" "text/template/parse" + "github.com/Masterminds/semver/v3" "github.com/ollama/ollama/api" "github.com/ollama/ollama/convert" "github.com/ollama/ollama/llm" @@ -30,7 +31,7 @@ type layerGGML struct { *llm.GGML } -func parseFromModel(ctx context.Context, name model.Name, fn func(api.ProgressResponse)) (layers []*layerGGML, version string, err error) { +func parseFromModel(ctx context.Context, name model.Name, fn func(api.ProgressResponse)) (layers []*layerGGML, version *semver.Version, err error) { m, err := ParseNamedManifest(name) switch { case errors.Is(err, os.ErrNotExist): diff --git a/server/routes_create_test.go b/server/routes_create_test.go index 50fc6a71d..f351b12b3 100644 --- a/server/routes_create_test.go +++ b/server/routes_create_test.go @@ -659,7 +659,7 @@ func TestCreateVersion(t *testing.T) { t.Fatal(err) } - if m.Ollama != "0.2.3" { + if m.Ollama.String() != "0.2.3" { t.Errorf("got %s != want 0.2.3", m.Ollama) } @@ -690,7 +690,7 @@ func TestCreateVersion(t *testing.T) { t.Fatal(err) } - if m.Ollama != "" { + if m.Ollama.String() != "" { t.Errorf("got %s != want \"\"", m.Ollama) } }) @@ -734,7 +734,7 @@ func TestCreateVersion(t *testing.T) { t.Fatal(err) } - if m.Ollama != "0.2.3" { + if m.Ollama.String() != "0.2.3" { t.Errorf("got %s != want 0.2.3", m.Ollama) } }) diff --git a/server/routes_delete_test.go b/server/routes_delete_test.go index 0c0b6c7df..56aa30199 100644 --- a/server/routes_delete_test.go +++ b/server/routes_delete_test.go @@ -8,6 +8,7 @@ import ( "path/filepath" "testing" + "github.com/Masterminds/semver/v3" "github.com/gin-gonic/gin" "github.com/ollama/ollama/api" "github.com/ollama/ollama/envconfig" @@ -99,7 +100,7 @@ func TestDeleteDuplicateLayers(t *testing.T) { } // create a manifest with duplicate layers - if err := WriteManifest(n, config, []*Layer{config}, ""); err != nil { + if err := WriteManifest(n, &semver.Version{}, config, []*Layer{config}); err != nil { t.Fatal(err) }