Commit daa0d1de authored by Bruce MacDonald's avatar Bruce MacDonald
Browse files

allow specifying zero values in modelfile

parent 58daeb96
......@@ -11,7 +11,10 @@ require (
github.com/spf13/cobra v1.7.0
)
require github.com/rivo/uniseg v0.2.0 // indirect
require (
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
)
require (
dario.cat/mergo v1.0.0
......
......@@ -19,6 +19,7 @@ import (
"github.com/jmorganca/ollama/api"
"github.com/jmorganca/ollama/parser"
"github.com/mitchellh/mapstructure"
)
type RegistryOptions struct {
......@@ -32,7 +33,7 @@ type Model struct {
ModelPath string
Template string
System string
Digest string
Digest string
Options api.Options
}
......@@ -135,7 +136,7 @@ func GetModel(name string) (*Model, error) {
}
model := &Model{
Name: mp.GetFullTagname(),
Name: mp.GetFullTagname(),
Digest: manifest.Config.Digest,
}
......@@ -176,12 +177,17 @@ func GetModel(name string) (*Model, error) {
}
defer params.Close()
var opts api.Options
// parse model options parameters into a map so that we can see which fields have been specified explicitly
// TODO: once there are no modelfiles in the wild that do not have default options populated this can be removed
var opts map[string]interface{}
if err = json.NewDecoder(params).Decode(&opts); err != nil {
return nil, err
}
model.Options = opts
// update the default options on the model with the options that have been specified
if err := mapstructure.Decode(opts, &model.Options); err != nil {
return nil, err
}
}
}
......@@ -494,7 +500,13 @@ func paramsToReader(params map[string][]string) (io.ReadSeeker, error) {
}
}
bts, err := json.Marshal(opts)
// convert opts to map so that zero fields are not omitted
out := make(map[string]interface{})
if err := mapstructure.Decode(opts, &out); err != nil {
return nil, err
}
bts, err := json.Marshal(out)
if err != nil {
return nil, err
}
......
......@@ -59,12 +59,7 @@ func GenerateHandler(c *gin.Context) {
loaded.llm = nil
}
opts := api.DefaultOptions()
if err := mergo.Merge(&opts, model.Options, mergo.WithOverride); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
opts := model.Options
if err := mergo.Merge(&opts, req.Options, mergo.WithOverride); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment