From a19d47642e49814c3fba634cd50a4898ce1a5a57 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 18 Oct 2023 15:55:50 -0700 Subject: [PATCH 1/6] models: rm workDir from CreateModel unused after removing EMBED --- server/images.go | 2 +- server/routes.go | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/server/images.go b/server/images.go index 5514c643..88d7a206 100644 --- a/server/images.go +++ b/server/images.go @@ -252,7 +252,7 @@ func filenameWithPath(path, f string) (string, error) { return f, nil } -func CreateModel(ctx context.Context, workDir, name string, path string, fn func(resp api.ProgressResponse)) error { +func CreateModel(ctx context.Context, name string, path string, fn func(resp api.ProgressResponse)) error { mp := ParseModelPath(name) var manifest *ManifestV2 diff --git a/server/routes.go b/server/routes.go index 3cee381e..71e01a34 100644 --- a/server/routes.go +++ b/server/routes.go @@ -334,8 +334,6 @@ func CreateModelHandler(c *gin.Context) { return } - workDir := c.GetString("workDir") - ch := make(chan any) go func() { defer close(ch) @@ -346,7 +344,7 @@ func CreateModelHandler(c *gin.Context) { ctx, cancel := context.WithCancel(c.Request.Context()) defer cancel() - if err := CreateModel(ctx, workDir, req.Name, req.Path, fn); err != nil { + if err := CreateModel(ctx, req.Name, req.Path, fn); err != nil { ch <- gin.H{"error": err.Error()} } }() From 689842b9ff7ddc8c92ad42b576090dcde36f17cf Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 18 Oct 2023 15:56:34 -0700 Subject: [PATCH 2/6] request: bad request when model missing fields --- server/routes.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/server/routes.go b/server/routes.go index 71e01a34..0dce976d 100644 --- a/server/routes.go +++ b/server/routes.go @@ -142,6 +142,11 @@ func GenerateHandler(c *gin.Context) { return } + if req.Model == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) + return + } + model, err := GetModel(req.Model) if err != nil { var pErr *fs.PathError @@ -231,6 +236,11 @@ func EmbeddingHandler(c *gin.Context) { return } + if req.Model == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "model is required"}) + return + } + model, err := GetModel(req.Model) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) @@ -268,6 +278,11 @@ func PullModelHandler(c *gin.Context) { return } + if req.Name == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + return + } + ch := make(chan any) go func() { defer close(ch) @@ -302,6 +317,11 @@ func PushModelHandler(c *gin.Context) { return } + if req.Name == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + return + } + ch := make(chan any) go func() { defer close(ch) @@ -334,6 +354,11 @@ func CreateModelHandler(c *gin.Context) { return } + if req.Name == "" || req.Path == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name and path are required"}) + return + } + ch := make(chan any) go func() { defer close(ch) @@ -364,6 +389,11 @@ func DeleteModelHandler(c *gin.Context) { return } + if req.Name == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + return + } + if err := DeleteModel(req.Name); err != nil { if os.IsNotExist(err) { c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", req.Name)}) @@ -394,6 +424,11 @@ func ShowModelHandler(c *gin.Context) { return } + if req.Name == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "name is required"}) + return + } + resp, err := GetModelInfo(req.Name) if err != nil { if os.IsNotExist(err) { @@ -505,6 +540,11 @@ func CopyModelHandler(c *gin.Context) { return } + if req.Source == "" || req.Destination == "" { + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "source add destination are required"}) + return + } + if err := CopyModel(req.Source, req.Destination); err != nil { if os.IsNotExist(err) { c.JSON(http.StatusNotFound, gin.H{"error": fmt.Sprintf("model '%s' not found", req.Source)}) From 7e547c6833ea7807304bb7d9896935574ae6aca7 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 18 Oct 2023 15:56:56 -0700 Subject: [PATCH 3/6] s/message/error/ --- server/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routes.go b/server/routes.go index 0dce976d..ec8f4bde 100644 --- a/server/routes.go +++ b/server/routes.go @@ -350,7 +350,7 @@ func PushModelHandler(c *gin.Context) { func CreateModelHandler(c *gin.Context) { var req api.CreateRequest if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"message": err.Error()}) + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } From 2ad8a074acf0f9f9fe17aedb4425637580dad019 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 18 Oct 2023 16:04:32 -0700 Subject: [PATCH 4/6] generate: set created_at move the empty response so it's more visible --- server/routes.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/server/routes.go b/server/routes.go index ec8f4bde..9bac6708 100644 --- a/server/routes.go +++ b/server/routes.go @@ -182,6 +182,12 @@ func GenerateHandler(c *gin.Context) { ch := make(chan any) go func() { defer close(ch) + // an empty request loads the model + if req.Prompt == "" && req.Template == "" && req.System == "" { + ch <- api.GenerateResponse{CreatedAt: time.Now().UTC(), Model: req.Model, Done: true} + return + } + fn := func(r api.GenerateResponse) { loaded.expireAt = time.Now().Add(sessionDuration) loaded.expireTimer.Reset(sessionDuration) @@ -196,13 +202,8 @@ func GenerateHandler(c *gin.Context) { ch <- r } - // an empty request loads the model - if req.Prompt == "" && req.Template == "" && req.System == "" { - ch <- api.GenerateResponse{Model: req.Model, Done: true} - } else { - if err := loaded.runner.Predict(c.Request.Context(), req.Context, prompt, fn); err != nil { - ch <- gin.H{"error": err.Error()} - } + if err := loaded.runner.Predict(c.Request.Context(), req.Context, prompt, fn); err != nil { + ch <- gin.H{"error": err.Error()} } }() From e1c5be24e78308e5a4394f00e19ef7eedf619845 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 18 Oct 2023 16:08:42 -0700 Subject: [PATCH 5/6] check json eof --- server/routes.go | 72 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 16 deletions(-) diff --git a/server/routes.go b/server/routes.go index 9bac6708..3754e9a8 100644 --- a/server/routes.go +++ b/server/routes.go @@ -137,8 +137,13 @@ func GenerateHandler(c *gin.Context) { checkpointStart := time.Now() var req api.GenerateRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -232,8 +237,13 @@ func EmbeddingHandler(c *gin.Context) { defer loaded.mu.Unlock() var req api.EmbeddingRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -274,8 +284,13 @@ func EmbeddingHandler(c *gin.Context) { func PullModelHandler(c *gin.Context) { var req api.PullRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -313,8 +328,13 @@ func PullModelHandler(c *gin.Context) { func PushModelHandler(c *gin.Context) { var req api.PushRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -350,8 +370,13 @@ func PushModelHandler(c *gin.Context) { func CreateModelHandler(c *gin.Context) { var req api.CreateRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -385,8 +410,13 @@ func CreateModelHandler(c *gin.Context) { func DeleteModelHandler(c *gin.Context) { var req api.DeleteRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -420,8 +450,13 @@ func DeleteModelHandler(c *gin.Context) { func ShowModelHandler(c *gin.Context) { var req api.ShowRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } @@ -536,8 +571,13 @@ func ListModelsHandler(c *gin.Context) { func CopyModelHandler(c *gin.Context) { var req api.CopyRequest - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + err := c.ShouldBindJSON(&req) + switch { + case errors.Is(err, io.EOF): + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"}) + return + case err != nil: + c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } From 2ce1793a1d403a748e7173b7fa17955910959515 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Thu, 19 Oct 2023 09:21:00 -0700 Subject: [PATCH 6/6] go fmt --- examples/golang-simplegenerate/main.go | 6 +++--- format/time_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/golang-simplegenerate/main.go b/examples/golang-simplegenerate/main.go index 9b60acef..26e3bc6d 100644 --- a/examples/golang-simplegenerate/main.go +++ b/examples/golang-simplegenerate/main.go @@ -3,10 +3,10 @@ package main import ( "bytes" "fmt" - "net/http" - "os" "io" "log" + "net/http" + "os" ) func main() { @@ -16,7 +16,7 @@ func main() { if err != nil { fmt.Print(err.Error()) os.Exit(1) - } + } responseData, err := io.ReadAll(resp.Body) if err != nil { diff --git a/format/time_test.go b/format/time_test.go index b4e2db53..cc6b8930 100644 --- a/format/time_test.go +++ b/format/time_test.go @@ -29,7 +29,7 @@ func TestHumanTime(t *testing.T) { }) t.Run("soon", func(t *testing.T) { - v := now.Add(800*time.Millisecond) + v := now.Add(800 * time.Millisecond) assertEqual(t, HumanTime(v, ""), "Less than a second from now") }) }