Josh Yan 9 months ago
parent
commit
3958d82908
8 changed files with 33 additions and 25 deletions
  1. 1 0
      go.mod
  2. 2 0
      go.sum
  3. 17 5
      parser/parser.go
  4. 3 7
      server/images.go
  5. 2 3
      server/manifest.go
  6. 1 2
      server/model.go
  7. 6 6
      server/routes_create_test.go
  8. 1 2
      server/routes_delete_test.go

+ 1 - 0
go.mod

@@ -41,6 +41,7 @@ require (
 	github.com/rivo/uniseg v0.2.0 // indirect
 	github.com/xtgo/set v1.0.0 // indirect
 	go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect
+	golang.org/x/mod v0.19.0 // indirect
 	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
 	gonum.org/v1/gonum v0.15.0 // indirect
 	gorgonia.org/vecf32 v0.9.0 // indirect

+ 2 - 0
go.sum

@@ -242,6 +242,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
+golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

+ 17 - 5
parser/parser.go

@@ -9,7 +9,7 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/Masterminds/semver/v3"
+	"golang.org/x/mod/semver"
 	"golang.org/x/text/encoding/unicode"
 	"golang.org/x/text/transform"
 )
@@ -141,11 +141,17 @@ func ParseFile(r io.Reader) (*File, error) {
 					continue
 				} else if isSpace(r) {
 					return nil, errInvalidVersion
-				} else if _, err := semver.NewVersion(s); err != nil {
+				}
+
+				if s[0] != 'v' {
+					s = "v" + s
+				}
+
+				if !semver.IsValid(s) {
 					return nil, errInvalidVersion
 				}
 
-				cmd.Args = s
+				cmd.Args = semver.Canonical(s)
 				f.Commands = append(f.Commands, cmd)
 
 			case stateValue:
@@ -186,11 +192,17 @@ func ParseFile(r io.Reader) (*File, error) {
 		s, ok := unquote(strings.TrimSpace(b.String()))
 		if !ok {
 			return nil, io.ErrUnexpectedEOF
-		} else if _, err := semver.NewVersion(s); err != nil {
+		}
+
+		if s[0] != 'v' {
+			s = "v" + s
+		}
+
+		if !semver.IsValid(s) {
 			return nil, errInvalidVersion
 		}
 
-		cmd.Args = s
+		cmd.Args = semver.Canonical(s)
 		f.Commands = append(f.Commands, cmd)
 	case stateValue:
 		s, ok := unquote(strings.TrimSpace(b.String()))

+ 3 - 7
server/images.go

@@ -22,7 +22,6 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/Masterminds/semver/v3"
 	"github.com/ollama/ollama/api"
 	"github.com/ollama/ollama/auth"
 	"github.com/ollama/ollama/envconfig"
@@ -375,7 +374,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
 	}
 
 	var messages []*api.Message
-	var version *semver.Version
+	var version string
 	parameters := make(map[string]any)
 
 	var layers []*Layer
@@ -532,11 +531,8 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
 
 			messages = append(messages, &api.Message{Role: role, Content: content})
 		case "ollama":
-			if version == nil {
-				version, err = semver.NewVersion(c.Args)
-				if err != nil {
-					return err
-				}
+			if version == "" {
+				version = c.Args
 			}
 		default:
 			ps, err := api.FormatParams(map[string][]string{c.Name: {c.Args}})

+ 2 - 3
server/manifest.go

@@ -10,7 +10,6 @@ import (
 	"os"
 	"path/filepath"
 
-	"github.com/Masterminds/semver/v3"
 	"github.com/ollama/ollama/types/model"
 )
 
@@ -19,7 +18,7 @@ type Manifest struct {
 	MediaType     string   `json:"mediaType"`
 	Config        *Layer   `json:"config"`
 	Layers        []*Layer `json:"layers"`
-	Ollama        *semver.Version   `json:"ollama,omitempty"`
+	Ollama        string   `json:"string,omitempty"`
 
 	filepath string
 	fi       os.FileInfo
@@ -95,7 +94,7 @@ func ParseNamedManifest(n model.Name) (*Manifest, error) {
 	return &m, nil
 }
 
-func WriteManifest(name model.Name, ollama *semver.Version, config *Layer, layers []*Layer) error {
+func WriteManifest(name model.Name, ollama string, config *Layer, layers []*Layer) error {
 	manifests, err := GetManifestPath()
 	if err != nil {
 		return err

+ 1 - 2
server/model.go

@@ -16,7 +16,6 @@ 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"
@@ -31,7 +30,7 @@ type layerGGML struct {
 	*llm.GGML
 }
 
-func parseFromModel(ctx context.Context, name model.Name, fn func(api.ProgressResponse)) (layers []*layerGGML, version *semver.Version, err error) {
+func parseFromModel(ctx context.Context, name model.Name, fn func(api.ProgressResponse)) (layers []*layerGGML, version string, err error) {
 	m, err := ParseNamedManifest(name)
 	switch {
 	case errors.Is(err, os.ErrNotExist):

+ 6 - 6
server/routes_create_test.go

@@ -659,8 +659,8 @@ func TestCreateVersion(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	if m.Ollama.String() != "0.2.3" {
-		t.Errorf("got %s != want 0.2.3", m.Ollama)
+	if m.Ollama != "v0.2.3" {
+		t.Errorf("got %s != want v0.2.3", m.Ollama)
 	}
 
 	t.Run("no version", func(t *testing.T) {
@@ -690,8 +690,8 @@ func TestCreateVersion(t *testing.T) {
 			t.Fatal(err)
 		}
 
-		if m.Ollama != nil {
-			t.Errorf("got %s != want nil", m.Ollama)
+		if m.Ollama != "" {
+			t.Errorf("got %s != want empty", m.Ollama)
 		}
 	})
 
@@ -734,8 +734,8 @@ func TestCreateVersion(t *testing.T) {
 			t.Fatal(err)
 		}
 
-		if m.Ollama.String() != "0.2.3" {
-			t.Errorf("got %s != want 0.2.3", m.Ollama)
+		if m.Ollama != "v0.2.3" {
+			t.Errorf("got %s != want v0.2.3", m.Ollama)
 		}
 	})
 }

+ 1 - 2
server/routes_delete_test.go

@@ -8,7 +8,6 @@ import (
 	"path/filepath"
 	"testing"
 
-	"github.com/Masterminds/semver/v3"
 	"github.com/gin-gonic/gin"
 	"github.com/ollama/ollama/api"
 	"github.com/ollama/ollama/envconfig"
@@ -100,7 +99,7 @@ func TestDeleteDuplicateLayers(t *testing.T) {
 	}
 
 	// create a manifest with duplicate layers
-	if err := WriteManifest(n, &semver.Version{}, config, []*Layer{config}); err != nil {
+	if err := WriteManifest(n, "", config, []*Layer{config}); err != nil {
 		t.Fatal(err)
 	}