From a38d88d82851bc659f90b214cca56b06c6704dbb Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Thu, 11 Jan 2024 14:07:54 -0800 Subject: [PATCH 1/2] api: add model for all requests prefer using req.Model and fallback to req.Name --- api/types.go | 22 ++++++++++++++--- server/routes.go | 63 +++++++++++++++++++++++++++++++----------------- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/api/types.go b/api/types.go index 8fdad286..ed60a1ab 100644 --- a/api/types.go +++ b/api/types.go @@ -137,23 +137,31 @@ type EmbeddingResponse struct { } type CreateRequest struct { - Name string `json:"name"` + Model string `json:"model"` Path string `json:"path"` Modelfile string `json:"modelfile"` Stream *bool `json:"stream,omitempty"` + + // Name is deprecated, see Model + Name string `json:"name"` } type DeleteRequest struct { + Model string `json:"model"` + + // Name is deprecated, see Model Name string `json:"name"` } type ShowRequest struct { - Name string `json:"name"` Model string `json:"model"` System string `json:"system"` Template string `json:"template"` Options map[string]interface{} `json:"options"` + + // Name is deprecated, see Model + Name string `json:"name"` } type ShowResponse struct { @@ -171,11 +179,14 @@ type CopyRequest struct { } type PullRequest struct { - Name string `json:"name"` + Model string `json:"model"` Insecure bool `json:"insecure,omitempty"` Username string `json:"username"` Password string `json:"password"` Stream *bool `json:"stream,omitempty"` + + // Name is deprecated, see Model + Name string `json:"name"` } type ProgressResponse struct { @@ -186,11 +197,14 @@ type ProgressResponse struct { } type PushRequest struct { - Name string `json:"name"` + Model string `json:"model"` Insecure bool `json:"insecure,omitempty"` Username string `json:"username"` Password string `json:"password"` Stream *bool `json:"stream,omitempty"` + + // Name is deprecated, see Model + Name string `json:"name"` } type ListResponse struct { diff --git a/server/routes.go b/server/routes.go index 40c2e1fe..e7b63687 100644 --- a/server/routes.go +++ b/server/routes.go @@ -414,8 +414,13 @@ func PullModelHandler(c *gin.Context) { return } - if req.Name == "" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + var model string + if req.Model != "" { + model = req.Model + } else if req.Name != "" { + model = req.Name + } else { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) return } @@ -433,7 +438,7 @@ func PullModelHandler(c *gin.Context) { ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() - if err := PullModel(ctx, req.Name, regOpts, fn); err != nil { + if err := PullModel(ctx, model, regOpts, fn); err != nil { ch <- gin.H{"error": err.Error()} } }() @@ -458,8 +463,13 @@ func PushModelHandler(c *gin.Context) { return } - if req.Name == "" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + var model string + if req.Model != "" { + model = req.Model + } else if req.Name != "" { + model = req.Name + } else { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) return } @@ -477,7 +487,7 @@ func PushModelHandler(c *gin.Context) { ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() - if err := PushModel(ctx, req.Name, regOpts, fn); err != nil { + if err := PushModel(ctx, model, regOpts, fn); err != nil { ch <- gin.H{"error": err.Error()} } }() @@ -502,12 +512,17 @@ func CreateModelHandler(c *gin.Context) { return } - if req.Name == "" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + var model string + if req.Model != "" { + model = req.Model + } else if req.Name != "" { + model = req.Name + } else { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) return } - if err := ParseModelPath(req.Name).Validate(); err != nil { + if err := ParseModelPath(model).Validate(); err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -545,7 +560,7 @@ func CreateModelHandler(c *gin.Context) { ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() - if err := CreateModel(ctx, req.Name, filepath.Dir(req.Path), commands, fn); err != nil { + if err := CreateModel(ctx, model, filepath.Dir(req.Path), commands, fn); err != nil { ch <- gin.H{"error": err.Error()} } }() @@ -570,14 +585,19 @@ func DeleteModelHandler(c *gin.Context) { return } - if req.Name == "" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + var model string + if req.Model != "" { + model = req.Model + } else if req.Name != "" { + model = req.Name + } else { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) return } - if err := DeleteModel(req.Name); err != nil { + if err := DeleteModel(model); err != nil { if os.IsNotExist(err) { - c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", req.Name)}) + c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", model)}) } else { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) } @@ -610,21 +630,20 @@ func ShowModelHandler(c *gin.Context) { return } - switch { - case req.Model == "" && req.Name == "": + var model string + if req.Model != "" { + model = req.Model + } else if req.Name != "" { + model = req.Name + } else { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) return - case req.Model != "" && req.Name != "": - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "both model and name are set"}) - return - case req.Model == "" && req.Name != "": - req.Model = req.Name } resp, err := GetModelInfo(req) if err != nil { if os.IsNotExist(err) { - c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", req.Name)}) + c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", model)}) } else { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) } From 745b5934fa04af1987c70d18f51a92cb57f876dd Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Thu, 18 Jan 2024 14:32:55 -0800 Subject: [PATCH 2/2] add model to ModelResponse --- api/types.go | 1 + server/routes.go | 1 + 2 files changed, 2 insertions(+) diff --git a/api/types.go b/api/types.go index ed60a1ab..d4e385bf 100644 --- a/api/types.go +++ b/api/types.go @@ -213,6 +213,7 @@ type ListResponse struct { type ModelResponse struct { Name string `json:"name"` + Model string `json:"model"` ModifiedAt time.Time `json:"modified_at"` Size int64 `json:"size"` Digest string `json:"digest"` diff --git a/server/routes.go b/server/routes.go index e7b63687..86a9c545 100644 --- a/server/routes.go +++ b/server/routes.go @@ -735,6 +735,7 @@ func ListModelsHandler(c *gin.Context) { } return api.ModelResponse{ + Model: model.ShortName, Name: model.ShortName, Size: model.Size, Digest: model.Digest,