Josh Yan 9 mesiacov pred
rodič
commit
2f5497301f

+ 1 - 1
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))
 	}

+ 8 - 4
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
 	}
 

+ 3 - 2
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

+ 2 - 1
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):

+ 3 - 3
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)
 		}
 	})

+ 2 - 1
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)
 	}